2016-09-27 134 views
0

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

enter image description here

+1

我认为这一行只是将[近,远]范围缩放到[0,1]中进行剪裁。在这个转换之后,你将看到的所有内容都位于[0,1]范围内,其余部分将被忽略。 – kolenda

回答

0

是的,理论上可以保持z值,因为他们得到的可比性。但是,练习不允许这样做。实际上,这个矩阵不会自行工作。但让我稍后再谈。下面是所得投影Ž相对于输入的z坐标,假定为1的近裁剪面的图和为5的远裁剪面:

Perspective Z

正如你可以看到,所得到的深度仍然在1和5之间的范围相同,但有点扣。其原因如下:

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

所以相反,z缓冲区被编码为某种整数,缩放到znear和zfar之间的适当范围。因此,上图中的垂直轴被分成相同的步骤。现在屈曲的结果更接近于深度轴上更大范围内的Zel散布。因此,如果点靠近摄像机,则某个z范围编码的深度范围较大,如果距离较远,则深度范围较小。这样可以在相机附近获得更高的精度(请记住深度轴均匀细分)。这通常正是你想要的。可以非常详细地看到与摄像机非常接近的对象,并且深度缓冲区中的问题会很明显。然而,距离很远的物体不能被视为清晰,并且不需要高深度分辨率。

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