OpenGL,如何使用帧缓冲区中的depthbuffer作为常用的深度缓冲区

OpenGL,如何使用帧缓冲区中的depthbuffer作为常用的深度缓冲区,opengl,framebuffer,depth-buffer,Opengl,Framebuffer,Depth Buffer,我有帧缓冲区,有深度组件和4个颜色附件和4个纹理 我画了一些东西到它和解除绑定后的缓冲区,使用4个纹理的片段着色器(延迟照明)。 稍后我想在屏幕上画更多的东西,使用帧缓冲区中的深度缓冲区,可以吗 我尝试再次绑定帧缓冲区并指定glDrawBuffer(GL_FRONT),但它不起作用。无法将图像(颜色或深度)附加到默认帧缓冲区。类似地,您不能从默认帧缓冲区拍摄图像并将其附加到FBO。正如Nicol所说,您不能直接将FBOs深度缓冲区用作默认帧缓冲区的深度缓冲区 但您可以使用扩展(自GL 3起应为核

我有帧缓冲区,有深度组件和4个颜色附件和4个纹理

我画了一些东西到它和解除绑定后的缓冲区,使用4个纹理的片段着色器(延迟照明)。 稍后我想在屏幕上画更多的东西,使用帧缓冲区中的深度缓冲区,可以吗


我尝试再次绑定帧缓冲区并指定glDrawBuffer(GL_FRONT),但它不起作用。

无法将图像(颜色或深度)附加到默认帧缓冲区。类似地,您不能从默认帧缓冲区拍摄图像并将其附加到FBO。

正如Nicol所说,您不能直接将FBOs深度缓冲区用作默认帧缓冲区的深度缓冲区

但您可以使用扩展(自GL 3起应为核心)将FBO的深度缓冲区复制到默认帧缓冲区:


如果不支持此扩展(当您已经有FBO时,我怀疑这一点),可以使用深度纹理作为FBO的深度附件,并使用带纹理的四边形和写入
gl_FragDepth
的简单通过片段着色器将其渲染到默认帧缓冲区。虽然这可能比仅仅将其点选慢。

我刚刚体验到,在使用glBlitFramebuffer时,将深度缓冲区从renderbuffer复制到主(上下文提供的)深度缓冲区是非常不可靠的。只是因为你不能保证格式匹配。使用GL_DEPTH_COMPONENT24作为内部深度纹理格式在我的AMD Radeon 6950(最新驱动程序)上不起作用,因为Windows(或驱动程序)决定使用等效于GL_DEPTH_24_模具8作为我的前/后缓冲器的深度格式,尽管我没有要求任何模具精度(在像素格式描述符中,模具位设置为0)。当使用GL_DEPTH24_模具8作为帧缓冲区的深度纹理时,闪电按预期工作,但我对此格式有其他问题。第一次尝试在NVIDIA卡上运行良好,因此我非常确定我没有把事情搞砸

根据我的经验,最有效的方法是通过着色器进行复制:

片段程序(又名像素着色器)[GLSL]

< C++复制代码看起来像这样:

glDepthMask(GL_TRUE);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glEnable(GL_DEPTH_TEST); //has to be enabled for some reason
glBindFramebuffer(GL_FRAMEBUFFER, 0);
depthCopyShader->Enable();
DrawFullscreenQuad(depthTextureIndex);

我知道线程很旧,但这是我在谷歌搜索我的问题时的第一个结果之一,所以我想让它尽可能保持一致。

谢谢,用我的集成英特尔图形解决了这个问题。有没有办法在创建默认缓冲区格式并用于创建fbo后获得它?我还想知道@LukeB的情况。因为它会在两个帧缓冲区之间进行blit,知道格式匹配。这也适用于我们想要从默认帧缓冲区进行blit的情况,而默认帧缓冲区不能使用着色器,因为它的深度缓冲区不可访问。也有同样的问题。
#version 150

uniform sampler2D depthTexture;
in vec2 texCoords; //texture coordinates from vertex-shader

void main( void )
{
    gl_FragDepth = texture(depthTexture, texCoords).r;
}
glDepthMask(GL_TRUE);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glEnable(GL_DEPTH_TEST); //has to be enabled for some reason
glBindFramebuffer(GL_FRAMEBUFFER, 0);
depthCopyShader->Enable();
DrawFullscreenQuad(depthTextureIndex);