0

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

我像这样制作并将深度缓冲区/纹理绑定到帧缓冲区/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 深度缓冲区绑定到默认帧缓冲区以在几何过程中进行深度测试?

4

2 回答 2

3

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

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

于 2014-08-08T05:07:05.727 回答
2

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

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

于 2014-08-07T14:34:59.953 回答