我猜这不是一个OpenGL问题,而是一个数学问题,但我离题了。无论如何,如果透视除法的全部目的是获得可用的x和y坐标,为什么还要麻烦用w除z?另外,我如何首先获得w?

最佳答案

实际上,这种解释与深度缓冲区的限制比数学上的要重要得多。

最简单地说,“深度缓冲区是一种纹理,在该纹理中,屏幕上的每个像素均根据其与相机的距离分配一个灰度值。这使视觉效果易于随距离而变化。” Source

更准确地说,深度缓冲区是包含每个fragment的z/w值的纹理,其中:

  • Z是从近裁剪平面到片段的距离。
  • W是从相机到片段的距离。

  • 在说明z,w和z/w之间关系的下图中,n等于传递给 zNear gluPerspective参数或等效函数,f等于传递给相同功能的zFar参数。

    乍一看,该系统看起来并不直观。但是结果是,z/w始终是介于0和1(0/n和f/f)之间的浮点值,因此可以表示为纹理的单个 channel 。

    第二个重要注意事项:深度缓冲区是非线性的,这意味着恰好在近裁剪面和远裁剪面之间的对象在深度缓冲区中的值远不为0.5。如上所示,它将与深度缓冲区中的0.999值相关。根据您的观点,这可能是好是坏。您可能希望深度缓冲区更详细(它是特写),或者甚至提供整个细节(不是)。

    TL; DR:
  • 将z除以w,使其始终在[0,1]范围内。
  • W是从相机到片段的距离。
  • 10-04 21:16