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

时间:2014-08-07 12:17:18

标签: c++ opengl deferred-rendering

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

我将深度缓冲区/纹理绑定到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深度缓冲区绑定到默认帧缓冲区以进行几何传递的深度测试?

2 个答案:

答案 0 :(得分:2)

您无法将创建的渲染缓冲区或纹理绑定到默认的帧缓冲区。默认帧缓冲是固定的。

但是,通过在片段着色器中设置gl_FragDepth,可以在将GBuffer渲染到默认帧缓冲区时将深度纹理复制到默认帧缓冲区。

答案 1 :(得分:2)

您无法直接将深度纹理用作默认帧缓冲区的深度缓冲区。我能想到两个主要选择:

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

    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类型的采样器对其进行采样,并稍微更直接地获得深度比较结果。