5.6、透视和平截头体

      OpenGL ES使用一个叫做视域(viewing volume)的几何图形来决定一个场景生成的哪些片元将会显示在最终的渲染结果中。处于视域范围之外的几何图形会被剔除(clipped),这意味着它会被丢弃。视域有时也被称为投影(projction)。 在本章之前,在例子中使用的视域一直是一个立方体,这个立方体包括了在X轴上从-1.0到1.0, Y轴上从-1.0到1.0, Z轴上-1.0到1.0范围内的所有顶点。这就是当projectionMatrix是一个单位矩阵时的默认投影结果。

      一个立方体或者矩形视域叫做一个正射投影(orthographic projection)。 利用一个正射投影,视点与每个位置之间的距离对于投影毫无影响。GLKit的GLKMatrix4-MakeOrtho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat near, GLfloat far)函数会返回一个矩阵,这个矩阵定义了一个由left 和right, bottom 和top, near 和far所界定的矩形视域。图5-8的左图描绘了由函数GLKMatrix4MakeOrtho(-1.0, 1.0, -1.0, 1.0, 0.0, -6.0)返回的矩阵所定义的视域。

      GLKMatrix4MakeOrtho 函数返回的矩阵通常与当前 proectionMatrix级联来定义视域。当使用透视投影(perspective projection)时,视域不再是矩形。它变成了角锥体被切去顶端之后的形状一称为 “ 平截头体”,如图5-8的右图所描绘的。当投影到2D像素颜色渲染缓存中后,离视点越远的对象越小,但是接近视点的对象仍然很大。 GLKit的GLKMatrix4MakeFrustum()函数与GLKMatrix4MakeOrtho(函数的参数相同,并且会创建一个包含透视的新变换矩阵。这个新矩阵通常会与当前projectionMatrix级联来定义视域。

图 5-8

      图5-8中的两个视域中的半透明着色区域代表了每个视域的近面。在使用GLKMatrix4MakeFrustum0函数时,对于近面有一些限制, 但在使用GLKMatrix4MakeOrtho()函数时却没有。平截头体不能用Z位置值小于0的近面来定义。即使是为近面使用很小的正的Z值也会有问题。从近面距离到远面距离之间的位置范围会映射为深度缓存中的深度值。当GPU计算要被保存在深度缓存中的值时,使用大幅度或者过度小的近面距 离都会产生数学舍人误差。


注意

对GLKMatrix4MakeFrustum()函数的限制产生了一个小问题: OpenGL ES默认为一个指入屏幕的负的Z坐标轴,但是GLKMatrix4MakeFrustum()总会产生一个指入屏幕的带有正的Z坐标轴的视域。GLKMatrix4MakeFrustum() 函数翻转了Z坐标轴的符号。


      使用视域的另一个关键是要认识到,正射和透视投影都是由站在位置{0, 0, 0}并向下俯视Z轴的观察者的视点产生的。本章开头声称变换使任意视点成为可能,但是实际上,视点是恒定的。变换会施加到场景中的所有顶点上,并会投影这些顶点到视域的近面上。从概念上看,当假设的观察者的视点保持不变时,OpenGL ES会变换所有的几何图形。整个世界移动的错觉只是看起来像是由视点变化产生的。

      例子OpenGLES_Ch5_6演示了如何使用GLKMatrix4MakeFrustum()函数来产生透视变换。这个例子模拟了地球沿着自己的轴旋转,同时月球绕地球轨道而行。当月球接近视点时,它看起来很大,但是当它逐渐远离视点时变得越来越小。例子OpenGLES_Ch5_6还演示了除了倾斜之外的所有常见复合变换。

5.7 小结

      本章介绍了深度缓存、变换、GLKit的矩阵、GLKit 的矩阵堆栈和视域。实际上本章中没有例子会改变保存在顶点缓存中的顶点的成分。顶点位置保持不变。作为替代,变换改变了顶点被映射到2D像素颜色渲染缓存的方式。例OpenGLESCh5_6通过动态地改变当前modelviewMatrix产生了一些简单的动画。第6章会进一步讲解基于变换的各种动画可能,并会介绍多个实现动画和特效的其他方法。

results matching ""

    No results matching ""