我刚刚将我的 OpenGL 绘图代码从绘图直接切换到显示,以使用附加了渲染缓冲区的屏幕外 FBO。当我分配正常的渲染缓冲区存储时,屏幕外 FBO 会正确地传送到屏幕上。
但是,当我在渲染缓冲区上启用多重采样(通过glRenderbufferStorageMultisample
)时,场景中的每种颜色似乎都被变亮了(因此提供了与非多重采样部分不同的颜色)。
我怀疑我需要设置一些glEnable
选项来保持相同的颜色,但我似乎在其他地方找不到任何提到这个问题的地方。
有任何想法吗?
我刚刚将我的 OpenGL 绘图代码从绘图直接切换到显示,以使用附加了渲染缓冲区的屏幕外 FBO。当我分配正常的渲染缓冲区存储时,屏幕外 FBO 会正确地传送到屏幕上。
但是,当我在渲染缓冲区上启用多重采样(通过glRenderbufferStorageMultisample
)时,场景中的每种颜色似乎都被变亮了(因此提供了与非多重采样部分不同的颜色)。
我怀疑我需要设置一些glEnable
选项来保持相同的颜色,但我似乎在其他地方找不到任何提到这个问题的地方。
有任何想法吗?
我偶然发现了同样的问题,因为由于样本位置不匹配而缺乏适当的下采样。对我有用的是:
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;
}
http://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_multisample.txt
http://developer.download.nvidia.com/opengl/specs/GL_EXT_framebuffer_blit.txt
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.
对我有用的解决方案是更改渲染缓冲区颜色格式。我选择了GL_RGBA32F
和GL_DEPTH_COMPONENT32F
(认为我想要最高精度),而 NVIDIA 驱动程序对此的解释不同(我怀疑 sRGB 补偿,但我可能是错的)。
GL_RGBA8
我发现可以使用的渲染缓冲区图像格式是GL_DEPTH_COMPONENT24
.