基本概念

基本功能:几何图形、变换、着色、光照、贴图
高级功能:曲面图元、光栅操作、景深、shader编程
 
状态机
先设置状态参数:多边形、顶点列表、填充颜色、纹理、混合模式、坐标系
再调用绘图指令
如果没有设置新参数,会一直用当前的状态来绘图,所以是有状态的
 
OpenGL可以分为客户端和服务端,客户端可以是cpu或主机,服务端是gpu或另一台主机
客户端发送绘图指令,服务端负责绘制渲染,尽量在客户端完成工作,只发送必要数据到服务端,减少传输压力
 
开启/关闭绘图特性
 
GL_APICALL void GL_APIENTRY glEnable(GLenum cap); // 开启一个状态
GL_APICALL void GL_APIENTRY glDisable(GLenum cap); // 关闭一个状态
 
类型GLenum表示OpenGL状态量
全部状态列表定义在gl2.h中
可以开启若干状态来实现特定的绘图效果,之后禁止掉这些状态
比如,剪裁渲染区域需要设置GL_SCISSOR_TEST状态
 
OpenGL使用右手三维坐标系:屏幕左下角是原点,从原点开始:向右是x正向,向上是y正向,向屏幕对面是z正向
利用坐标描述图形的形状,把形状交给OpenGL来绘制
OpenGL负责把三维空间中的对象通过投影(投影可以粗略想象成光照一个物体,在墙上显示出来的影子)、光栅化(?)转换为二维图像,然后显示在屏幕上
在二维引擎中,z坐标只用来控制游戏元素的前后顺序
 
cocos2dx绘制精灵
1.根据精灵的位置创建矩形
2.在OpenGL中设置矩形的顶点以及纹理
3.绘制图形,显示在屏幕上
 
OpenGL初始的坐标系是世界坐标系
绘图坐标系在初始化时和世界坐标系相同
但是可以通过变换函数(平移、旋转、缩放)来改变绘图坐标系
图形绘制在绘图坐标系中,因此平移图形不用改变每个顶点,只用改变绘图坐标系即可
绘制不同位置的不同物体也可以通过改变绘图坐标系来实现
 
渲染流水线过程:
显示列表、求值器、顶点装配、像素操作、纹理装配、光栅化、片段操作
OpenGL ES 1.0 固定渲染管线 每一个步骤的操作是固定的,只能使用OpenGL提供的渲染模型
OpenGL ES 2.0 可编程着色器shader 可以作为渲染管线中一些部分的替代品 自定义渲染效果
自由控制顶点和片段处理采用的算法
shader包含顶点着色器(顶点的几何变换和光照计算)和片段着色器(处理光栅化得到的像素及纹理)
 
draw可以分为3个部分:数据部分、初始化纹理、绘图,从而绘制一个带纹理的矩形
也可以通过三角形带来绘制 triangle stripe 参考
 
数据部分:设置三角形带(矩形)的顶点坐标、纹理坐标、顶点颜色
初始化纹理:从文件中加载纹理到内存,用纹理的属性设置上述纹理坐标中的4个顶点
绘制图片:绑定纹理、设置顶点数组、绘图
 
绑定纹理:把一个曾经载入的纹理当作当前纹理,以后绘制出的多边形都使用此纹理
设置顶点数组:把上述顶点坐标、纹理坐标、顶点颜色设置进OpenGL中
绘图:glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 参数:绘图模式、起始顶点下标、顶点数量
 

坐标变换

 
OpenGL对顶点的处理:接受顶点数据、投影、得到变换后的顶点数据
顶点变换过程:
1.设置绘图坐标系
2.传入顶点数据(相对于世界坐标系)
3.OpenGL通过计算把顶点映射到世界坐标系
4.把世界坐标系中的点通过投影变换为可视平面上的点
 
用向量表示坐标,矩阵表示变换形式,变换后的顶点坐标可以用向量与矩阵的乘法表示
 
为了利用矩阵乘法对点进行平移,需要用齐次坐标来表示顶点
齐次坐标系中每一个点的维度比顶点维度多1,多的这个维度其值为1
比如三维顶点(x,y,z)在齐次坐标系中的向量是(x,y,z,1)
 
常见的变换:平移、旋转、缩放
平移矩阵
其中(tx,ty,tz)为平移的方向向量
用平移矩阵坐乘顶点列向量,即得平移后的顶点列向量
比如:把点(1.2,5,10)平移(6,5,4),则
假如要对点p依次进行缩放、平移、缩放、旋转操作
先构造其变换矩阵:S1,T,S2,R
则变换后的p’=S1*T*S2*R*p
 
OpenGL维护一个绘图矩阵,表示当前的绘图坐标系
初始化时,绘图矩阵是单位矩阵M=I
变换后,绘图矩阵变为M=S1*T*S2*R,表示一个绘图坐标系
所以,p是绘图坐标系上的点,绘图矩阵是M,则p在世界坐标系的坐标是p’=M*p
所以坐标变换实际上是绘图矩阵的变换
 
对一个图形变换,就是变换绘图矩阵,OpenGL ES 2.0 用Kazmath如下
kmGLScalef(0.8f, 0.8f, 0.8f); // 乘上缩放矩阵
kmGLTranslatef(1.0f, 2.0f, 3.0f); // 乘上平移矩阵
kmGLRotatef(2.5f, 2.5f, 2.5f); // 乘上旋转矩阵
DrawObject(); // 绘制任意图形

OpenGL学习——基本概念和坐标变换的更多相关文章

  1. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  2. OpenGL学习笔记:拾取与选择

    转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...

  3. OpenGL学习之路(一)

    1 引子 虽然是计算机科班出身,但从小对几何方面的东西就不太感冒,空间想象能力也较差,所以从本科到研究生,基本没接触过<计算机图形学>.为什么说基本没学过呢?因为好奇(尤其是惊叹于三维游戏 ...

  4. OpenGL学习之路(三)

    1 引子 这些天公司一次次的软件发布节点忙的博主不可开交,另外还有其它的一些事也占用了很多时间.现在坐在电脑前,在很安静的环境下,与大家分享自己的OpenGL学习笔记和理解心得,感到格外舒服.这让我回 ...

  5. OpenGL学习之路(五)

    1 引子 不知不觉我们已经进入到读书笔记(五)了,我们先对前四次读书笔记做一个总结.前四次读书笔记主要是学习了如何使用OpenGL来绘制几何图形(包括二维几何体和三维几何体),并学习了平移.旋转.缩放 ...

  6. OpenGL学习之windows下安装opengl的glut库

    OpenGL学习之windows下安装opengl的glut库 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装.  Windows环境下的GLUT下载地址:(大小约为15 ...

  7. OpenGL学习-------绘制简单的几何图形

    本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的 ...

  8. OpenGL学习进程(8)第六课:点、边和图形(三)绘制图形

    本节是OpenGL学习的第六个课时,下面介绍OpenGL图形的相关知识:     (1)多边形的概念: 多边形是由多条线段首尾相连而形成的闭合区域.OpenGL规定,一个多边形必须是一个“凸多边形”. ...

  9. OpenGL学习进程(7)第五课:点、边和图形(二)边

    本节是OpenGL学习的第五个课时,下面介绍OpenGL边的相关知识: (1)边的概念: 数学上的直线没有宽度,但OpenGL的直线则是有宽度的.同时,OpenGL的直线必须是有限长度,而不是像数学概 ...

随机推荐

  1. iOS开发--调试必备 — NSLog

    对于程序的开发者来说,拥有一手强大的DEBUG能力,那就好比在武侠世界中拥有一种强大的内功心法一样,走到哪里都是大写的牛B.在我们DEBUG的时候,大部分情况都是要查看我们的调试日志的,这些打印日志可 ...

  2. JavaWeb项目开发案例精粹-第3章在线考试系统-002配置文件及辅助类

    1. <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5&qu ...

  3. PHP二位数组/多维数组 根据某个键值排序

    $arr[$i]['FirstName'] = $d_first_name;$arr[$i]['MiddleName'] = $d_middle_name;$arr[$i]['LastName'] = ...

  4. NSPoint

    #import <Foundation/Foundation.h>   int main(int argc, const char * argv[]) {    @autoreleasep ...

  5. OSSEC 安装执行./install.sh详细信息

    下载好ossec安装文件后解压得到如下目录 [root@localhost ~]# cd ossec-hids-/ [root@localhost ossec-hids-]# ll total drw ...

  6. MyEclipse +Tomcat 异常操作

    安装完MyEclipse 2014,用JAX-WS的方式写了一个小段Web Service,用MyEclipse 自带的 Tomcat 部署没有问题,用我自己的,却出现下面的错误: java.lang ...

  7. Servlet的应用

    1.重定向     HttpServletRequest接口提供的sendRedirect()方法用于生产302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的U ...

  8. android Json 使用

    http://www.cnblogs.com/mybkn/archive/2012/05/18/2508306.html http://www.cnblogs.com/haippy/archive/2 ...

  9. UVa 1453 - Squares 旋转卡壳求凸包直径

    旋转卡壳求凸包直径. 参考:http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html #include <cstdio> ...

  10. 富有魅力的git stash

    git stash 会把当前的改动暂时搁置起来, 也就是所谓的git 暂存区. 你可以执行 git stash list 来查看你所有暂存的东东. 也可以 git stash apple ** 来拿下 ...