延迟渲染:使用默认framebuffer中Gbuffer的深度缓冲区

Deferred Rendering: Use depth buffer from Gbuffer in default framebuffer

本文关键字:Gbuffer 深度 缓冲区 framebuffer 默认 延迟      更新时间:2023-10-16

我正在使用c++和OpenGL制作延迟渲染应用程序。在完成几何和光线传递之后,我想渲染一些粒子。但我需要对它们进行深度测试。所以我想做的是使用深度缓冲区绑定到我的GBuffer做一些深度测试时,绘制到默认的OpenGL framebuffer。

我创建并绑定深度缓冲区/纹理到framebuffer/GBuffer,像这样

glGenTextures(1, &_depthTextureID);
glBindTexture(GL_TEXTURE_2D, _depthTextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, _width, _height, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, _depthTextureID, 0);

如何将Gbuffer深度缓冲区绑定到默认的帧缓冲区上进行几何通道的深度测试?

你不能直接使用深度纹理作为默认framebuffer的深度缓冲区。我能想到的主要有两个选项:

  1. 您可以使用glBlitFramebuffer()将深度缓冲区从FBO复制到默认的framebuffer。主调用看起来像这样:

    glBindFramebuffer(GL_READ_FRAMEBUFFER, fboId);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
    glBlitFramebuffer(0, 0, _width, _height, 0, 0, _width, _height,
                      GL_DEPTH_BUFFER_BIT, GL_NEAREST);
    
  2. 如果你只需要深度测试,但没有更新深度缓冲,在渲染到默认帧缓冲的过程中,你可以简单地绑定深度纹理,并在你的片段着色器中采样。然后将采样的深度值与片段的传入深度值进行比较,并丢弃未通过深度测试的像素。或者用sampler2DShadow型采样器采样,可以更直接地得到深度比较结果。

你不能将创建的渲染缓冲区或纹理绑定到默认的framebuffer。默认的framebuffer是固定的。

但是你可以在渲染GBuffer时通过在你的片段着色器中设置gl_FragDepth将深度纹理复制到默认framebuffer。