我正在使用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深度缓冲区绑定到默认帧缓冲区以进行几何传递的深度测试?
答案 0 :(得分:2)
您无法将创建的渲染缓冲区或纹理绑定到默认的帧缓冲区。默认帧缓冲是固定的。
但是,通过在片段着色器中设置gl_FragDepth
,可以在将GBuffer渲染到默认帧缓冲区时将深度纹理复制到默认帧缓冲区。
答案 1 :(得分:2)
您无法直接将深度纹理用作默认帧缓冲区的深度缓冲区。我能想到两个主要选择:
您可以使用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);
如果您只需要深度测试,但不需要更新深度缓冲区,则在渲染到默认帧缓冲区的传递过程中,您可以简单地绑定深度纹理,并在片段着色器中对其进行采样。然后将采样深度值与片段的传入深度值进行比较,并丢弃未通过深度测试的像素。或者您可以使用sampler2DShadow
类型的采样器对其进行采样,并稍微更直接地获得深度比较结果。