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

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

到目前为止,我已经尝试使用以下方法创建深度纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, Image.GetWidth(), Image.GetHeight(), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);
然后将它绑定(bind)到一个四边形并在屏幕上渲染它,但它不会从纹理中写入深度值。

我也试过:
glDrawPixels(Image.GetWidth(), Image.GetHeight(), GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);
但这会使我的帧速率降低到大约 0.25 fps ...

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

最佳答案

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

关于opengl - 如何写入 OpenGL 深度缓冲区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2602647/

10-15 22:25