2014-08-30 88 views
8

我想这是一个数学问题,而不是OpenGL的问题,但我离题了。无论如何,如果透视分割的全部目的是获得可用的x和y坐标,为什么麻烦将z除以w?另外我怎样才能获得w?为什么我用W在OpenGL的透视投影中将W除以W?

+0

http://en.wikipedia。org/wiki/Transformation_matrix#Perspective_projection – 2014-08-30 16:46:51

+0

这与均匀坐标有关。他们映射R^3 - > R^4显然不是一对一的。 w因子可以'cannonized'为1.但是应用4x4矩阵算子的结果'w'可能会改变。如果我没有记错,均匀坐标的一个优点是将翻译作为线性算子。 – Yotam 2014-08-30 17:53:34

回答

12

实际上,这个解释与深度缓冲区的局限性有很大关系。

简单来说,“深度缓冲区是一种纹理,其中每个屏幕上的像素都会根据其离摄像机的距离分配一个灰度值,从而使视觉效果可以随距离轻松改变。 Source

更准确地说,一个深度缓冲器是含有ž/的瓦特值对于每个fragment,其中纹理:

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

在示出Ž瓦特,和ž /瓦特之间的关系在下图中,Ñ等于zNear参数传递给gluPerspective或等效的功能,和f等于参数zFar传递给同一个函数。

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

一目了然,这个系统看起来不直观。但作为一个结果,ž /瓦特总是0和1之间的浮点值(0/Ñ˚F/˚F),并且因此可以被表示为一个单信道质地。

第二个重要注意事项:深度缓冲区是非线性的,这意味着深度缓冲区中精确位于近距离和远距离剪切平面之间的物体无法接近0.5值。如上所示,它将与深度缓冲区中的值0.999相关联。根据你的观点,这可能是好的或坏的;你可能希望深度缓冲区更加详细的特写(它是),或者在整个过程中提供更详细的信息(它没有)。

TL; DR:

  • 您划分Ž通过瓦特所以它总是在范围[0,1]。
  • W是从相机到片段的距离。
+4

我真的不完全同意这个答案,这个问题属于纯数学问题,这里解释的是opengl和z-buffer算法的实现细节(深度缓冲区)。 – 2014-08-31 14:05:32

+0

NDC中的z在范围[-1,1]中,而不是[0,1],这是DirectX约定。 – SnappleLVR 2017-05-30 13:26:51

相关问题