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