在OpenGL中模糊深度缓冲区 - 如何在片段着色器中访问mipmap级别?

时间:2010-06-18 15:34:02

标签: opengl framebuffer fragment-shader mipmaps

我试图通过模糊和模糊来模糊深度纹理。在片段着色器中混合mipmap级别。

我有两个frambuffer对象:
1)附有深度renderobject的彩色frambuffer 2)附有深度纹理的z帧缓冲区。

一旦我将场景渲染到颜色帧缓冲对象,然后我将blit到深度缓冲对象,并且可以成功渲染(输出是GL_LUMINANCE深度纹理)。

我可以通过在绘制深度缓冲区之前选择它来成功访问任何给定的mipmap级别,例如,我可以按如下方式渲染mipmap level 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);

作为替代方案,我想将bias参数添加到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进行调用会得到预期的结果?

谢谢,丹尼斯

1 个答案:

答案 0 :(得分:3)

好的 - 我想我已经得到了......我的深度缓冲区没有生成mipmap级别。我正在使用多纹理,在渲染过程中,我正在激活纹理单元0用于颜色帧缓冲纹理,而纹理单元1用于深度缓冲纹理。当我激活/绑定纹理时,我按如下方式调用glGenerateMipmap(GL_TEXTURE_2D):

glActiveTextureARB(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, _color_texture);
glGenerateMipmap(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, _zbuffer_texture);
glGenerateMipmap(GL_TEXTURE_2D);

完成此操作后,增加 texture2D(sampler,coord,bias)中的偏差可以按照预期从mipmap级别提供片段。