[英]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.