繁体   English   中英

如何写入OpenGL深度缓冲区

[英]How to write to the OpenGL Depth Buffer

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

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

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

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

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

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

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

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

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

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

将其余部分渲染为fbo2

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM