理解Perspective投影矩阵的第三行

时间:2016-09-27 02:43:51

标签: matrix graphics 3d game-engine perspective

此透视矩阵的第三行的目的是什么?难道我们不能简单地保留原始的z坐标,并且仍然能够确定应该在其他点前面绘制哪些点?如果我们将单元格(3,3​​)替换为1而单元格(3,4)替换为0,则将在正确的x和y位置绘制该点,并且我们仍然可以使用点的第四个坐标作为同构。我错过了什么?谢谢!

enter image description here

1 个答案:

答案 0 :(得分:0)

是的,理论上你可以保持z值,因为它们可以获得可比性。但是,练习不允许这样做。实际上,这个矩阵本身不会起作用。但是让我稍后再说。下面是结果投影z与输入z坐标的关系图,假设近剪裁平面为1,远剪裁平面为5:

Perspective Z

如您所见,生成的深度仍然在1到5之间的相同范围内,但它有点弯曲。原因如下:

投影后得到的z值(标准化设备坐标)被写入深度缓冲区(OpenGL会对窗口坐标执行额外的转换,但暂时不要忽略它)。深度缓冲区的固定分辨率通常为24或32位。从理论上讲,您可以将深度编码为浮点数,但这会浪费很多精度。在许多情况下,精确的深度缓冲是必不可少的,以避免闪烁。

因此,z缓冲区被编码为某种整数,缩放到znear和zfar之间的适当范围。因此,上图中的垂直轴被分成相等的步骤。现在,屈曲导致更接近于在深度轴上更大范围内的znear扩散的点。因此,如果该点靠近相机,则某个z范围被编码为具有较大的深度范围,而如果该距离较远,则具有较小的深度范围。这导致相机附近的精度更高(请记住深度轴均匀细分)。而这通常正是你想要的。可以非常详细地看到非常接近相机的物体,并且深度缓冲器中的问题将是显而易见的。然而,很远的物体不能被清楚地看到,并且不需要高深度分辨率。

如前所述,该矩阵不能直接使用。这是因为归一化设备坐标的z值被认为是DirectX的[0,1]范围或OpenGL的[-1,1]范围,其中下部代表近剪裁平面的深度和upper表示远剪裁平面。因此,除非应用了一些额外的转换,否则这些API无法使用生成的深度。