透视投影矩阵的最后一行

时间:2015-11-28 16:26:18

标签: matrix projection perspective

你能解释一下gl_projection矩阵最后一行中-1的目的是什么?它如何影响透视分割步骤?

enter image description here

2 个答案:

答案 0 :(得分:2)

透视投影的基本属性是将x / y坐标除以深度(距观察者的距离)。这使得物体更接近观察者(其具有更小的深度值)更大,并且远离观察者的物体(具有更大的深度值)更小。

下一个难题是同质坐标的工作原理。顶点着色器生成的同质空间中的(x,y,z,w)坐标通过除以w转换为常规3D坐标:

(x, y, z, w) --> (x/w, y/w, z/w, 1)

因此我们希望通过深度划分来实现透视,并且我们知道顶点着色器生成的坐标将被w除。为了得到理想的结果,我们可以简单地将眼睛坐标空间中的深度值放入w坐标。

这正是投影矩阵的最后一行。最后一行与输入向量(它们是顶点的眼睛空间坐标)的点积产生输出的w值:

(0 0 -1 0) * (x y z 1) = -z

您可能希望矩阵元素的值为1,只需将眼睛空间中的z值复制到顶点着色器输出的w值即可。我们使用-1来反转符号的原因是基于OpenGL中眼睛空间坐标的常见排列。

OpenGL中的眼睛坐标通常在原点处具有“相机”,向下看 z轴。因此,z坐标的可见范围具有负值。由于我们想要在得到的w坐标中与观察者的距离,我们翻转眼睛空间z坐标的符号,这将负z值转换为距离原点的正距离值。

请注意,其中大部分只是常见的策略,部分源于传统的固定功能管道。使用当前OpenGL版本中使用的可编程管道,您可以完全自由地组织坐标空间和转换。例如,您可以轻松使用眼睛空间坐标系,其中相机指向正z方向,然后在投影矩阵的最后一行中使用1而不是-1。

答案 1 :(得分:0)

如上所述:http://www.songho.ca/opengl/gl_projectionmatrix.html

"因此,我们可以将剪辑坐标的w分量设置为-ze。并且,GL_PROJECTION矩阵的第4个变为(0,0,-1,0)。"