【问题标题】:How to write to the OpenGL Depth Buffer如何写入 OpenGL 深度缓冲区
【发布时间】:2010-04-08 19:02:58
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我同意 GLSL 是要走的路。总是令人惊讶的是,这并不容易做到。当您以交互方式更改复杂场景的一小部分时,它非常有用。

标签: opengl buffer textures depth


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以尝试使用帧缓冲区对象来做您想做的事情。

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

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

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

    将其余部分渲染到 fbo2

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-27
        • 1970-01-01
        • 2015-12-13
        相关资源
        最近更新 更多