Matrix 透视投影矩阵的最后一行

Matrix 透视投影矩阵的最后一行,matrix,projection,perspective,Matrix,Projection,Perspective,你能解释一下gl_投影矩阵最后一行中-1的用途是什么吗?它如何影响透视图分割步骤 如本文所述: “因此,我们可以将剪辑坐标的w分量设置为-ze。并且,GL_投影矩阵的第四个变为(0,0,-1,0)。”透视投影的基本特性是将x/y坐标除以深度(与观察者的距离)。这会使靠近查看器的对象(深度值较小)变大,而距离查看器较远的对象(深度值较大)变小 下一个难题是同质坐标是如何工作的。顶点着色器生成的同质空间中的(x、y、z、w)坐标通过除以w转换为常规3D坐标: (x, y, z, w) -->

你能解释一下gl_投影矩阵最后一行中-1的用途是什么吗?它如何影响透视图分割步骤

如本文所述:


“因此,我们可以将剪辑坐标的w分量设置为-ze。并且,GL_投影矩阵的第四个变为(0,0,-1,0)。”

透视投影的基本特性是将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