Answers:
写入深度缓冲区的值的范围是您想要的值。通常,它们在0到1的范围内。写入深度缓冲区的实际值是根据NDC空间中顶点的Z值(在视角空间中被裁剪空间中的w除后)在视口转换期间计算的。
NDC深度值(Z,透视图除以W后)按视口变换的深度部分缩放(将X和Y坐标带入与窗口中像素关联的坐标空间),然后按(2^n-1)
-表示为“ 2的幂n
” – n
是深度缓冲区的位精度。结果值将写入深度缓冲区。
OpenGL将视口转换矩阵的定义分为glViewport和glDepthRange调用。glDepthRange是控制比例因子的因素,比例因子负责确定您要询问的深度范围。您可以使用选择器调用glGetFloatvGL_DEPTH_RANGE
以恢复当前范围。这将允许您在不假定范围为0到1的情况下使用该范围(尽管在99.9%的时间中,实际上没有人更改它)。
进一步阅读,如果您想了解如何重构数学以从眼睛空间到深度缓冲区一直遵循Z值。
深度缓冲区中的值始终在0-1之间。零是渲染的片段在近平面的深度中,而1是片段在远平面的深度中。以及它之间的一切。
如果您想知道世界空间中的真实深度,可以很容易地根据深度缓冲区进行计算。
depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;
这就是为什么要在投影矩阵中指定近平面和远平面,以提高深度缓冲区的准确性。
使用深度缓冲区值时,还要注意深度和距离之间的差异。