【问题标题】:True depth values using OpenGL readPixels使用 OpenGL readPixels 的真实深度值
【发布时间】:2011-10-03 06:14:48
【问题描述】:

我想从我的相机视图中检索 3D 过滤应用程序的深度缓冲区。目前,我正在使用 glReadPixels 来获取深度组件。而不是 [0,1] 值,我需要深度缓冲区的真实值,或者在世界坐标中到相机的真实距离。

我尝试通过 GL_DEPTH_BIAS 和 GL_DEPTH_SCALE 转换深度值,但没有成功。

glReadPixels(0, 0, width_, height_, GL_DEPTH_COMPONENT, GL_FLOAT, depth_buffer);
glGetDoublev(GL_DEPTH_BIAS,  &depth_bias);  // Returns 0.0
glGetDoublev(GL_DEPTH_SCALE, &depth_scale); // Returns 1.0

我意识到这类似于Getting the true z value from the depth buffer,但我想将深度值放入主内存,而不是在着色器中。

【问题讨论】:

    标签: opengl depth-buffer


    【解决方案1】:

    在像以前一样从 Z 缓冲区检索归一化深度值后尝试使用gluUnproject()。您需要提供模型视图矩阵、投影矩阵和视口值,您可以使用glGetDoublev()glGetIntegerv() 检索它们。

    【讨论】:

    • 非常感谢,这有效。我使用身份模型视图矩阵来调用 gluUnproject()。
    【解决方案2】:

    我需要深度缓冲区的真实值而不是 [0,1] 值,或者在世界坐标中到相机的真实距离。

    深度缓冲区不包含与相机的距离值。深度值是与相机平面的垂直距离。因此,如果您真的需要到相机的径向距离,您需要在着色器中计算它们并将它们写入缓冲区;深度缓冲区无济于事。

    但我想将深度值放到主内存中,而不是在着色器中。

    然后做那些着色器所做的事情,除了在 C/C++(或其他)代码中而不是在着色器中。无论哪种方式,数学都是相同的。只需遍历深度缓冲区中的每个值并对其进行转换。

    【讨论】:

      猜你喜欢
      • 2014-07-20
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多