OpenGL使用readPixels获取真实深度值

4

我希望从我的相机视图中获取深度缓冲区,以用于3D滤镜应用程序。目前,我使用glReadPixels来获取深度分量。但是,我需要真实的深度缓冲区值,或者相机到世界坐标系中的真实距离。

我尝试通过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

我知道这与从深度缓冲区获取真实的z值类似,但我想将深度值存储在主内存中,而不是在着色器中。

2个回答

3

非常感谢,这个方法很有效。我在调用gluUnproject()时使用了一个身份模型视图矩阵。 - Kevin Watts

2
与其使用[0,1]的值,我需要深度缓冲区中真实的数值,或者是相机到物体在世界坐标系下的真实距离。

深度缓冲区并不包含相机到物体的距离数值。深度值是相机平面上垂直距离的值。因此,如果你确实需要相机到物体的径向距离,你需要在着色器中计算并将它们写入缓冲区;深度缓冲区无法帮助你。

与其在着色器中,我更想将深度值存储在主内存中。

那么就像这些着色器一样,在C/C++(或其他)代码中执行相同的数学运算,而不是在着色器中。两种方法的数学计算是相同的。只需循环遍历深度缓冲区中的每个值并进行转换即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接