为什么在 OpenGL 的透视投影中将 Z 除以 W?

问题描述 投票:0回答:2

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

c++ opengl math matrix
2个回答
24
投票

实际上,这个解释更多地与深度缓冲区的限制有关,而不是数学。

最简单地说,“深度缓冲区是一种纹理,其中屏幕上的每个像素都根据其与相机的距离分配一个灰度值。这使得视觉效果可以轻松地随着距离而改变。” 来源

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

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

在下图中说明了 zwz/w 之间的关系,n 等于传递给

zNear
gluPerspective
参数或等效函数,并且 f 等于传递给同一函数的
zFar
参数。

Diagram illustrating the relationship between *z*, *w*, and *z*/*w*

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

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

TL;博士:

  • z 除以 w,因此它始终在 [0, 1] 范围内。
  • W 是相机到片段的距离。

0
投票

从数学上讲,如果您忘记除以包含 -z 的 w,那么您会注意到点或对象距离相机越远,它们不会显得越小。

© www.soinside.com 2019 - 2024. All rights reserved.