我正在使用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
来读出深度,但是我不确定要修改什么来解决这个问题。
如何获得离相机最远的脸部深度?
答案 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
是默认值。但是,当然,禁用它也会有效。