这个透视矩阵的第三行的目的是什么?难道我们不能简单地保留原始的z坐标,并且仍然能够确定应该在别人面前绘制哪些点?如果我们将单元格(3,3)替换为1并将单元格(3,4)替换为0,则该点将绘制在正确的x和y位置,并且仍然可以使用点的第四个坐标作为均匀。我错过了什么?谢谢!了解透视投影矩阵的第三行
0
A
回答
0
是的,理论上可以保持z值,因为他们得到的可比性。但是,练习不允许这样做。实际上,这个矩阵不会自行工作。但让我稍后再谈。下面是所得投影Ž相对于输入的z坐标,假定为1的近裁剪面的图和为5的远裁剪面:
正如你可以看到,所得到的深度仍然在1和5之间的范围相同,但有点扣。其原因如下:
将投影后得到的z值(归一化设备坐标)写入深度缓冲区(OpenGL对窗口坐标执行额外转换,但现在让我们忽略它) 。深度缓冲区的固定分辨率通常为24或32位。理论上,你可以将深度编码为浮点数,但这会浪费很多精度。在许多情况下,精确的深度缓冲区是必不可少的,以避免闪烁。
所以相反,z缓冲区被编码为某种整数,缩放到znear和zfar之间的适当范围。因此,上图中的垂直轴被分成相同的步骤。现在屈曲的结果更接近于深度轴上更大范围内的Zel散布。因此,如果点靠近摄像机,则某个z范围编码的深度范围较大,如果距离较远,则深度范围较小。这样可以在相机附近获得更高的精度(请记住深度轴均匀细分)。这通常正是你想要的。可以非常详细地看到与摄像机非常接近的对象,并且深度缓冲区中的问题会很明显。然而,距离很远的物体不能被视为清晰,并且不需要高深度分辨率。
如前所述,该矩阵不能直接使用。这是因为标准化器件坐标的z值被认为是在DirectX的[0,1]范围内或OpenGL的[-1,1]范围内,其中下部表示近剪裁平面的深度,而上部代表远剪裁平面。因此,除非应用一些额外的转换,否则这些API无法使用生成的深度。
相关问题
- 1. 了解libGDX投影矩阵
- 2. 了解投影矩阵
- 3. OpenGL中的透视投影矩阵
- 4. 如何使用透视投影矩阵?
- 5. 投影矩阵
- 6. 投影矩阵
- 7. 用于3D透视投影的剪贴矩阵
- 8. OpenGL中的投影矩阵真的是“投影矩阵”吗?
- 9. WP7透视变换(3D矩阵vs平面投影)
- 10. 使用MATLAB投影矩阵反投影
- 11. PyOpenGL透视投影
- 12. OpenGL投影,视图和世界矩阵
- 13. 矩阵乘法 - 视图/投影,世界/投影等
- 14. 非对称投影矩阵
- 15. openGL - 正交投影矩阵
- 16. 反向透视投影
- 17. 我需要一个用于右手正投影和透视投影矩阵的公式
- 18. 我可以在DirectX中同时使用正投影和透视投影矩阵吗?我怎么能够?
- 19. 使用透视相机矩阵将3D点投影到2D屏幕空间
- 20. 的OpenGL 3.3投影矩阵错误
- 21. 从OpenGL到DirectX的投影矩阵
- 22. Java中的透视3D投影
- 23. GLM - 计算从投影矩阵
- 24. 投影矩阵似乎是错误
- 25. 投影矩阵OpenGL/GLSL问题
- 26. 投影矩阵 - 如何获得它
- 27. 透视投影(使用GL-矩阵)表示什么都没有,但没有它示出了细
- 28. Fr and和透视矩阵
- 29. 透视图/转换矩阵
- 30. 了解ModelView矩阵
我认为这一行只是将[近,远]范围缩放到[0,1]中进行剪裁。在这个转换之后,你将看到的所有内容都位于[0,1]范围内,其余部分将被忽略。 – kolenda