【问题标题】:Blurring the depth buffer in OpenGL - how to access mipmap levels in a fragment shader?模糊 OpenGL 中的深度缓冲区 - 如何在片段着色器中访问 mipmap 级别?
【发布时间】: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


【解决方案1】:

好的 - 我想我明白了……我的深度缓冲区没有生成 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 级别的片段。

【讨论】:

  • 所以错误不是在正确的纹理中创建 mipmap 对吗?
  • 是的 - 我没有在纹理上生成 mipmap。再次感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 2011-11-04
  • 2016-11-27
相关资源
最近更新 更多