如何写入OpenGL深度缓冲区

时间:2010-04-08 19:02:59

标签: opengl buffer textures depth

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

因此,例如,如果你有一个房间的图片,其中一些电线悬挂在前景中的天花板上,这些在深度图中被赋予浅深度值,并且当正确渲染时,允许角色“后面”走电线,但在房间的其他物体前面。

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

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设置为纹理中的值来在像素着色器中执行此操作,但我想知道是否可以使用非像素共享启用的硬件实现此目的?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在尝试获得深度纹理后,我尝试了ARB_fragment_program扩展,看看我是否可以编写一个非常简单的(因此与旧硬件广泛兼容)GPU汇编片段着色器来完成这个技巧,但我最终只是决定使用GLSL,因为ARB_fragment_program扩展似乎已经被弃用,或者至少它们的使用现在已经不受欢迎了。

答案 2 :(得分:0)

您可以尝试使用帧缓冲区对象来执行您想要的操作。

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

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

在每次更新时使用帧缓冲区blit将颜色和深度缓冲区从fbo1 bliv到fbo2。

将其余部分渲染为fbo2

对主显示缓冲区执行fbo2颜色缓冲区的全屏blit。

相关问题