【发布时间】:2011-03-05 12:02:18
【问题描述】:
我正在尝试通过在片段着色器中模糊和混合 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 的调用产生预期结果的正确方法是什么?
谢谢,丹尼斯
【问题讨论】:
-
预期的结果是什么?为什么你认为mipmap没有生成?贴一些截图作为例子。
-
Matias - 我基本上是在尝试执行与绽放/余辉的 OpenGL 精湛(第 4 版)中所示相同类型的事情,但目的略有不同。我可以发布我的屏幕图像,但我必须为此设置一些主机,因为我很懒,我不想这样做。如果您有比我在回答中描述的更好的方法,请告诉我。谢谢!
标签: opengl framebuffer fragment-shader mipmaps