我试图通过在片段着色器中模糊和混合 mipmap 级别来模糊深度纹理。
我有两个帧缓冲区对象:
1)附加了深度渲染对象的颜色帧缓冲区。
2) 附加了深度纹理的 z 帧缓冲区。
一旦我将场景渲染到颜色帧缓冲区对象,我就可以对深度缓冲区对象进行 blit,并且可以成功渲染它(输出是 GL_LUMINANCE 深度纹理)。
我可以通过在绘制深度缓冲区之前选择它来成功访问任何给定的 mipmap 级别,例如,我可以渲染 mipmap 级别 3,如下所示:
// FBO setup - all buffer objects created successfully and are complete and the color
// framebuffer has been rendered to (it has a depth renderbuffer attached), and no
// OpenGL errors are issued:
glBindFramebuffer(GL_READ_FRAMEBUFFER, _fbo_color);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo_z);
glBlitFramebuffer(0,0,_w, _h, 0, 0, _w, _h, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
glGenerateMipmap(GL_TEXTURE_2D);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// This works:
// Select mipmap level 3
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3);
draw_depth_texture_on_screen_aligned_quad();
// Reset mipmap
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1000);
作为替代方案,我想将偏差参数添加到 texture2D() GLSL 函数,或者使用 texture2DLod() 并使用单个纹理采样器进行操作,但是每当我选择超过 0 的级别时,mipmap 似乎没有'未生成:
// fragment shader (Both texture2DLod and texture2D(sampler, tcoord, bias)
// are behaving the same.
uniform sampler2D zbuffer;
uniform int mipmap_level;
void main()
{
gl_FragColor = texture2DLod(zbuffer, gl_TexCoord[0].st, float(mipmap_level));
}
我不确定 mipmapping 如何与 glBlitFramebuffer() 一起工作,但我的问题是设置程序以使对 texture2D/texture2DLod 的调用给出预期结果的正确方法是什么?
谢谢,丹尼斯