在OpenGL中,如何发现深度缓冲区的深度范围?


11

我正在为iOS开发GL多遍渲染应用程序。第一遍渲染到深度缓冲区纹理。第二遍使用深度缓冲区中的值来控制片段着色器的应用。我想将深度缓冲区中的值重新缩放为有用的值,但是在执行此操作之前,我需要知道深度缓冲区值的深度值范围。我该怎么做呢?

Answers:


10

写入深度缓冲区的值的范围是您想要的值。通常,它们在0到1的范围内。写入深度缓冲区的实际值是根据NDC空间中顶点的Z值(在视角空间中被​​裁剪空间中的w除后)在视口转换期间计算的。

NDC深度值(Z,透视图除以W后)按视口变换的深度部分缩放(将X和Y坐标带入与窗口中像素关联的坐标空间),然后按(2^n-1)-表示为“ 2的幂n” – n是深度缓冲区的位精度。结果值将写入深度缓冲区。

OpenGL将视口转换矩阵的定义分为glViewportglDepthRange调用。glDepthRange是控制比例因子的因素,比例因子负责确定您要询问的深度范围。您可以使用选择器调用glGetFloatvGL_DEPTH_RANGE以恢复当前范围。这将允许您在不假定范围为0到1的情况下使用该范围(尽管在99.9%的时间中,实际上没有人更改它)。

进一步阅读,如果您想了解如何重构数学以从眼睛空间到深度缓冲区一直遵循Z值。


我将把这本书提供给Josh以获取所有其他有用的参考资料,并提供有关三角形平面度的提示。我倾向于做一个hack,将近/远裁剪平面定位在要与我渲染的几何图形的z范围完全匹配的位置,以便深度图具有不错的值。我在忙什么 我想根据#1通道深度图中的情况,在#2通道期间创建有趣的特定于位置的模糊效果。
dugla 2011年

7

深度缓冲区中的值始终在0-1之间。零是渲染的片段在近平面的深度中,而1是片段在远平面的深度中。以及它之间的一切。

如果您想知道世界空间中的真实深度,可以很容易地根据深度缓冲区进行计算。

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

这就是为什么要在投影矩阵中指定近平面和远平面,以提高深度缓冲区的准确性。

使用深度缓冲区值时,还要注意深度和距离之间的差异。


@notebene。差不多好了。我想将depthbuffer中的值范围重新调整为正好是0->1。因此,如果渲染的最小/最大depthvalue是.25 / .75,我想要的是(depthvalue-.25)/(。75-.25)。因此,有一个方法来发现下列通1并用它来通2期间重新调节最小/最大的深度缓存中的
dugla

1
@dugla:由于要渲染平面的三角形,因此强制最小和最大深度值将与场景中的最小和最大顶点相关联。如果您知道这两个,则可以在整个管道中进行手动转换,从而知道要写入深度缓冲区的最小值和最大值。这可能比渲染更容易,然后读取整个深度缓冲区并对其进行迭代。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.