如何向OpenGL深度缓冲区写入数据

4

我正在尝试实现一种旧式技术,其中渲染的背景图像和预设深度信息用于遮挡场景中的其他对象。

例如,如果您有一张房间照片,前景中有一些悬挂在天花板上的电线,这些电线在深度图中被赋予较浅的深度值。正确渲染后,角色可以“穿过”电线,但在房间中的其他物体前面走。

到目前为止,我尝试使用以下方式创建深度纹理:

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, Image.GetWidth(), Image.GetHeight(), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);

然后只需将其绑定到一个四边形并在屏幕上渲染即可,但它不会写入来自纹理的深度值。

我还尝试过:

glDrawPixels(Image.GetWidth(), Image.GetHeight(), GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);

但这会将我的帧速降至约0.25 fps……

我知道你可以通过将gl_fragDepth设置为来自纹理的值,在像素着色器中执行此操作,但我想知道是否可以在非像素着色器启用的硬件上实现此操作?


1
我同意GLSL是正确的选择。令人惊讶的是这并不容易做到。当你交互式地改变一个复杂场景的一小部分时,它非常有用。 - Michael Daum
3个回答

0

禁用写入颜色缓冲区(使用:glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)),然后使用适当的Z坐标渲染代表您“前面”图像的多边形。


0
尝试让深度纹理生效后,我尝试使用ARB_fragment_program扩展来编写一个非常简单的GPU汇编片段着色器以解决问题,但最终我还是决定使用GLSL,因为ARB_fragment_program扩展似乎已经被弃用,或者至少现在不提倡使用它们。

0

你可以尝试使用帧缓冲对象来实现你想要的效果。

创建fbo1并附加颜色和深度缓冲区。渲染或设置背景场景。

创建fbo2并附加颜色和深度缓冲区。

在每次更新时使用帧缓冲区复制将fbo1的颜色和深度缓冲区复制到fbo2中。

将其余部分渲染到fbo2中

将fbo2颜色缓冲区全屏复制到主显示缓冲区。


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