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

Noo*_*ble 12 c++ opengl math matrix

我想这是一个数学问题而不是OpenGL问题,但我离题了.无论如何,如果透视分割的整个目的是获得可用的x和y坐标,为什么还要将z除以w呢?另外我如何在第一时间获得w?

Pro*_*oxy 15

实际上,解释与深度缓冲区的限制有很大关系,而不是数学.

最简单的是,"深度缓冲区是一种纹理,其中每个屏幕上的像素都根据其与相机的距离分配灰度值.这样可以随着距离轻松改变视觉效果." 资源

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

  • Z是从近剪裁平面到片段的距离.
  • W是摄像机到片段的距离.

在下图中,说明了z,wz/w之间的关系,n等于zNear传递给的参数gluPerspective或等效函数,f等于zFar传递给同一函数的参数.

说明*z*,*w*和*z*/*w*之间关系的图

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

第二个重要注意事项:深度缓冲区是非线性的,这意味着在深度缓冲区中,近距离和远距离剪切平面之间的对象远未接近0.5的值.如上所示,它将与深度缓冲区中的值0.999相关联.根据您的观点,这可能是好的也可能是坏的; 你可能希望深度缓冲区更加详细(特写),或者提供整个细节(它没有).

TL; DR:

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

  • 我真的不太同意这个答案,这个问题属于一个纯粹的数学问题,这里解释的是一个opengl和z-buffer算法实现细节(深度缓冲区). (5认同)