OpenGL -获取距离相机最远的脸而不是最近的脸的距离



我使用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)

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

然而,我想做的是,不是沿着每条射线获得离相机最近的人脸的深度,而是获得离相机最远的人脸的深度。我想让人脸在渲染时不考虑它们面向哪个方向——也就是说,我不想进行backface- culculp。

我试图通过修改上面的代码来实现这一点,像这样:
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读取深度,但我不确定要改变什么来解决这个问题。

我怎样才能得到离相机最远的脸的深度?

将深度测试切换到GL_GREATER原则上可以做到这一点,您忽略了一个小细节:您需要以不同的方式初始化深度缓冲区。默认情况下,当清除深度缓冲区时,它将被初始化为1.0,因此GL_LESS比较可能会将其更新为小于1.0的值。

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

此外,您自己也提到您不希望为此进行背面剔除。但你也可以使用glCullFace来切换面部剔除,而不是禁用。这里可能需要GL_FRONT,因为GL_BACK是默认值。当然,禁用它也可以。

确保您使用glDepthMask(GL_TRUE);来启用对缓冲区的深度写入

最新更新