我正在尝试实现一种老式技术,其中渲染的背景图像和预设深度信息用于遮挡场景中的其他对象。
因此,例如,如果你有一个房间的图片,其中一些电线悬挂在前景中的天花板上,这些在深度图中被赋予浅深度值,并且当正确渲染时,允许角色“后面”走电线,但在房间的其他物体前面。
到目前为止,我尝试使用以下方法创建深度纹理:
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设置为纹理中的值来在像素着色器中执行此操作,但我想知道是否可以使用非像素共享启用的硬件实现此目的?
答案 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。