OpenGL - 距离相机最远的面部而不是最近的面部

时间:2014-08-13 19:05:38

标签: opengl graphics pyopengl depth-buffer

我正在使用OpenGL(使用Python绑定)来渲染保存为.obj文件的模型的深度贴图。输出是一个numpy数组,每个像素的对象深度。

我正在使用的代码中看似相关的部分如下所示:

glDepthFunc(GL_LESS)                # The Type Of Depth Test To Do
glEnable(GL_DEPTH_TEST)             # Enables Depth Testing

... load the vertices and triangles, set the camera viewing position ...

depth = np.array(glReadPixels(0, 0, Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT), dtype=np.float32)

我可以用它来成功渲染物体的深度图像。

但是,我想做的是,不是沿着每条光线获得最靠近相机的脸部深度,我想获得距离相机最远的脸部深度。我希望无论面向哪个方向都要渲染面孔 - 即我不想背面剔除。

我尝试通过修改上面的代码来实现这一点:

glDisable(GL_CULL_FACE)             # Turn off backface culling
glDepthFunc(GL_GREATER)             # The Type Of Depth Test To Do
glEnable(GL_DEPTH_TEST)             # Enables Depth Testing

... load the vertices and triangles, set the camera viewing position ...

depth = np.array(glReadPixels(0, 0, Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT), dtype=np.float32)

然而,当我这样做时,我没有得到任何深度。我怀疑这是因为我使用GL_DEPTH_COMPONENT来读出深度,但是我不确定要修改什么来解决这个问题。

如何获得离相机最远的脸部深度?

2 个答案:

答案 0 :(得分:1)

确保使用glDepthMask(GL_TRUE);启用深度写入缓冲区。

答案 1 :(得分:1)

在原则中将深度测试切换到GL_GREATER就可以了,你只是忽略了一个小细节:你需要以不同的方式初始化深度缓冲区。默认情况下,在清除深度缓冲区时,它将初始化为1.0,以便GL_LESS比较可以将其更新为小于1.0的值。

现在,您希望它以相反的方式工作,因此您必须将其初始化为0.0。为此,只需在(0.0f)之前添加glClearDepth glClear(... | GL_DEPTH_BUFFER_BIT)即可。

此外,您自己提到您不希望背面剔除。但是,除了禁用之外,您还可以使用glCullFace切换面部剔除。您可能需要GL_FRONT,因为GL_BACK是默认值。但是,当然,禁用它也会有效。