3

我试图通过在片段着色器中模糊和混合 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 的调用给出预期结果的正确方法是什么?

谢谢,丹尼斯

4

1 回答 1

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);

完成后,增加纹理 2D 中的偏差(采样器,坐标,偏差)会按预期提供来自 mipmap 级别的片段。

于 2010-06-18T17:30:15.967 回答