2

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

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

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

有任何想法吗?

4

2 回答 2

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.
于 2012-02-02T20:31:43.397 回答
1

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

GL_RGBA8我发现可以使用的渲染缓冲区图像格式是GL_DEPTH_COMPONENT24.

于 2012-02-08T16:39:11.403 回答