【问题标题】:Use default framebuffer depth buffer in a fbo在 fbo 中使用默认帧缓冲区深度缓冲区
【发布时间】:2018-12-10 13:55:16
【问题描述】:

我想在我的游戏中为某些演员实现后期处理轮廓效果,并且我希望轮廓被靠近相机的其他演员遮挡。为此,我计划在 FBO 和轮廓着色器中渲染应为轮廓的元素。要丢弃被遮挡的像素,我想使用默认帧缓冲区的深度缓冲区。

我阅读并搜索了但我没有找到如何在另一个帧缓冲区中正确使用默认帧缓冲区深度缓冲区或如何复制或无论如何在 fbo 上使用默认深度缓冲区信息。

我怎样才能实现它?

【问题讨论】:

    标签: opengl libgdx framebuffer depth-buffer


    【解决方案1】:

    我阅读并搜索了但我没有找到如何在另一个帧缓冲区中正确使用默认帧缓冲区深度缓冲区

    不幸的是,OpenGL 没有办法做到这一点。

    或如何复制或无论如何使用 fbo 上的默认深度缓冲区信息。

    这很容易。只需创建一个带有适当深度附件的 FBO(无论是纹理还是渲染缓冲区),并 blit 为其设置默认深度缓冲区:

    glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, your_target_fbo);
    glBlitFramebuffer(0,0,width,height,0,0,width,height,GL_DEPTH_BUFFER_BIT, GL_NEAREST);
    

    但是,由于无论如何都要进行一些后期处理,因此将初始场景渲染到 FBO 中并在不同的 FBO 中重复使用相同的深度缓冲区可能是一个不错的选择。

    【讨论】:

      【解决方案2】:

      不幸的是,无法将默认深度缓冲区附加到 FBO 或从着色器中读取它。

      您可以将默认帧缓冲区复制到渲染缓冲区(或附加帧缓冲区的纹理,请参阅glBlitFramebuffer),但这可能相对较慢。

      另一种选择是先将整个场景渲染到一个 FBO(颜色 + 深度),然后使用轮廓着色器从该 FBO 中读取,将结果与轮廓计算相结合,并将最终结果写入默认帧缓冲区。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        相关资源
        最近更新 更多