OpengGL ES系列笔记三

字数 1734阅读 588

深度渲染缓存

深度缓存是一个可选的输出缓存,并且与像素颜色渲染缓存相似,几乎所有的OpenGL ES都使用深度缓存,以为几乎所有的OpenGL ES应用都使用坐标系变换来改变渲染的视点。在大部分的情况下,一个深度缓存会消除对于三角形、线段、和点进行排序的需求。深度缓存的使用为GPU提供了一个用来保存计算出的深度的地方。之后这个缓存又被GPU利用来控制在像素颜色渲染缓存中的片元的置换。(因为在渲染片元的时候,会计算出片元的深度,如果深度小于深度缓存的深度,那么这个片元就用来代替在像素颜色渲染缓存中得那个片元位置的任何颜色,并且把计算出来的片元深度替代深度缓存里的深度。如果计算出来的片元深度更大,那么这个片元不会被渲染,依旧使用像素颜色渲染缓存里的片元)

GLKit与深度缓存



变换矩阵


GLKit的GLKMatrix4MakeScale()函数创建了一个基础的变换矩阵,三个参数指定了xyz轴的相对单位长度,1.0f表示没有变化,aspectRatio表示单位长度变为这个值

基本变换

只存在四种基本变换:平移、旋转、缩放、透视。基本变换联合决定了一个新坐标系中得每一个顶点位置是怎样转换为参考坐标系中的一个位置的。

单位矩阵

定义一个与参考坐标系相同的坐标系的矩阵叫做单位矩阵。任意矩阵的级联操作中产生一个新的矩阵,这个新矩阵包含两个矩阵的所有变换。解析:一个矩阵A通过简单变换例如是平移,会产生一个平移矩阵,但是这个平移矩阵并是不最终的矩阵,要把A与这个平移矩阵进行级联产生新的A矩阵,这个A矩阵就是新的当前矩阵了。


矩阵平移:

通过相对于参考坐标系的原点移动新坐标系的原点,平移定义了一个新的坐标系(注意记住平移原点就好了),平移不会影响新坐标轴相对于参考坐标系的长度和方向。

GLKit简化了坐标的平移,提供了GLKMatrix4MakeTranslation(float tx,float ty,float tz)通过平移一个单位矩阵返回一个和定义了坐标系的新矩阵(平移矩阵)。tx/ty/tz分表表示新坐标系的原点距离原坐标系的原点在各个轴上移动的距离。函数GLKMatrix4Translate(GLKMatrix4 matrix,float x,float y,float z)返回参数矩阵(原坐标矩阵)(x,y,z)与GLKMatrix4MakeTranslation()产生的 一个级联。

平移坐标轴



平移矩阵生成


矩阵平移的过程分解


旋转

旋转是通过相对参考坐标系坐标轴的方向旋转新坐标系的坐标轴来定义一个新的坐标系,旋转的坐标系与参考坐标系使用同一个原点,且坐标轴长度不会变化,变的只是坐标轴的方向。GLKit简化旋转过程,提供GLKMatrix4makeRotation(float angleRadians,float rx,float ry, float rz)函数生成一个旋转坐标矩阵。通过GLKMatrix4Rotate(GLKMatrix4 matrix,float angleRadians, float x , float y, float z)函数通过旋转座位一个参数传入的矩阵返回一个定义了一个坐标系的新矩阵

坐标轴旋转

缩放

缩放是通过相对于参考坐标系的坐标轴的单位长度改变新坐标系的坐标轴的单位长度来定义一个新坐标系,缩放的坐标系与参坐标系的原点、方向一般不会改变,除非通过一个负值进行缩放会改变方向。同样,GLKit提供了GLKmatri4MakeScale(float x,float y,float z)函数通过扩大或者缩小一个单位矩阵的任意坐标轴的单位长度来返回一个定义了坐标系的矩阵。

矩阵缩放的分解过程

projectionMatrix 和 modelviewMatrix

GLKBaseEffect的trnsform属性支持常见的三个不同矩阵-projectionMatrix 和modelviewMatrix和textureMatrix。GLKBaseEffect会级联modelviewMatrix和projectionMatrix以产生一个mdelviewPaojectionMatrix矩阵,这个矩阵会把顶点完全地变换到OpenGL ES默认坐标系中。默认坐标系直接映射到像素颜色渲染缓冲的片元中。

GLKMatrixStack

GLKMatrixStack是GLKit提供的一个堆栈,用于存放4x4矩阵的,GLKMatrixStackPush函数会复制最顶部的矩阵到堆栈的顶部,GLKMatrixStackGetMatrix4()会返回最顶部的矩阵,GLKMatrixStackPop函数会移除堆栈最顶部的项,并把前一个顶部矩阵恢复到最顶部。应用会推入一个新矩阵到堆栈顶部,操作并使用它在OPengl ES中渲染几个图像,然后把它弹出堆栈并把上一个矩阵恢复到顶部。


textureMatrix

纹理矩阵,S和T坐标系的纹理与顶点的U和V坐标之间会有一个映射的过程,纹理矩阵的作用几时 在这个映射的过程添加转换。

textureMatrix2d0:用于使用多重纹理时第一个纹理的纹理坐标的变换。

textureMatrix2d1:用于保存使用多重纹理时第二个纹理的纹理坐标的矩阵。

透视和平截头体

OpenGL ES使用一个叫做视域的几何图形来决定一个场景生成的哪些片元将会显示在最终的渲染结果中,处于视域范围的将被显示,其余的被抛弃。视域有时也会被称为投影,一个立方体或者矩形视域叫做一个正射投影。利用一个正射投影对于视点距离没有影响。GLKit的GLKMatrix4MakeOrtho(GLFloat left,GLFloat right,GLFloat bottom,GLFloat top,GLFloat near,GLFloat far)函数会返回一个矩阵,这个矩阵定义了一个由left,right,bottom,top,near,far界定的视域。GLKMatrixMakeOrtho函数返回的矩阵通常与当前projectionMatrix级联来定义视域。

当使用透视投影时,视域将不再是矩形,而是角锥体去了头部的平截头体,当投影到2D颜色渲染缓存中后,距离视点越远的对象越小,但是接近视点的对象仍然很大。GLKit的GLKMatrixMakeFrustrum()函数将创建一个包含透视的新变换矩阵。这个新矩阵通常会与当前projectionMatrix级联来定义视域。

推荐阅读更多精彩内容