为什么OpenGL在使用FBO进行多重采样时会减轻我的场景?

时间:2012-02-01 23:23:13

标签: opengl framebuffer multisampling

我只是将我的OpenGL绘图代码从绘图切换到显示直接使用附加渲染缓冲区的屏幕外FBO。当我分配正常的渲染缓冲区存储时,屏幕外的FBO会正确显示在屏幕上。

但是,当我在渲染缓冲区上启用多重采样时(通过glRenderbufferStorageMultisample),场景中的每种颜色看起来都变得明亮(因此提供的颜色与非多重采样部分不同)。

我怀疑我需要设置一些glEnable选项来保持相同的颜色,但我似乎无法在其他地方找到这个问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

由于样本位置不匹配导致缺乏适当的下采样,我偶然发现了同样的问题。对我有用的是:

  • 一个单独的“单个样本”FBO,具有相同的附件,格式和尺寸(附带纹理或渲染缓冲)以进行下采样,然后将其绘制/ blit到窗口缓冲区
  • 通过使用GLSL片段着色器传递每个片段的所有相应样本,将多样本窗口缓冲区渲染为多样本窗口缓冲区,其具有与输入相同的样本计数。这适用于启用样本着色,并且是延迟着色的过度杀伤方法,因为您可以计算每个样本的光照,阴影,AO等。
  • 我还使用GLSL手动下采样到单个样本帧缓冲区,我必须使用texelFetch()分别获取每个样本。

多重采样事情变得非常缓慢。虽然CSAA比MSAA表现好,我建议看看FXAA着色器后期处理的相当另类,当性能是一个问题,或者那些需要相当新的扩展名,如 ARB_texture_multisample 后,将不可用。

在GLSL中访问样本:

vec4 texelDownsampleAvg(sampler2DMS sampler,ivec2 texelCoord,const int sampleCount)
{
    vec4 accum = texelFetch(sampler,texelCoord,0);
    for(int sample = 1; sample < sampleCount; ++sample) {
        accum += texelFetch(sampler,texelCoord,sample);
    }
    return accum / sampleCount;
}

11)不同位大小的缓冲区之间是否应该允许blits?

Resolved: Yes, for color buffers only.  Attempting to blit
between depth or stencil buffers of different size generates
INVALID_OPERATION.

13)BlitFramebuffer的色彩空间转换应该如何     指定?我们是否允许上下文钳位状态影响     的blit?

Resolved: Blitting to a fixed point buffer always clamps,
blitting to a floating point buffer never clamps.  The context
state is ignored.

答案 1 :(得分:1)

对我有用的解决方案是更改渲染缓冲区颜色格式。我选择了GL_RGBA32FGL_DEPTH_COMPONENT32F(认为我想要最高精度),NVIDIA驱动程序解释的方式不同(我怀疑sRGB补偿,但我可能错了)。

我发现工作的渲染缓冲图像格式为GL_RGBA8 GL_DEPTH_COMPONENT24