OpenGL学习——基本概念和坐标变换

基本概念

基本功能:几何图形、变换、着色、光照、贴图
高级功能:曲面图元、光栅操作、景深、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(); // 绘制任意图形
posted @ 2014-02-09 18:06  GAMTEQ  阅读(688)  评论(0编辑  收藏  举报