我有一个渲染系统在哪里画到一个多重采样渲染的FBO,然后将它与纹理的blit到另一FBO,以解决以读出进行后期处理着色纹理采样,同时绘制后备缓冲区( FBO索引0)。
现在,我想获得一些正确的sRGB输出...问题是程序的行为是当我在OS X和Windows上运行它,这也依赖于机器之间变化,而不一致:在Windows与Intel HD 3000它将不会与Nvidia的GTX 670它应用了sRGB的非线性,但我的另一台机器上。 在Intel HD 3000在OS X也将应用它。
因此,这可能意味着我没有设定我GL_FRAMEBUFFER_SRGB
在程序正确的点启用状态。 不过,我似乎无法找到任何教程,居然告诉我什么时候应该启用它,他们只提到过,它的死很容易,并不会增加任何性能损失。
我目前没有任何纹理加载,所以我还没有一个需要处理线性它们的颜色呢。
要强制程序不是简单地吐回了线性颜色值,我曾尝试是简单地注释掉我glDisable(GL_FRAMEBUFFER_SRGB)
线,这实际上意味着该设置对整个管道被启用,而我居然冗余迫使其重新打开每一帧。
我不知道这是否是正确与否。 这肯定是一个适用于非线性化的颜色,但如果这是越来越应用两次(这将是坏的),我不能告诉。 我使我的第一个FBO它可以适用伽马。 它可以做到这一点时,我的blit第一FBO到第二FBO。 为什么不?
到目前为止,我已经来把我的最后一帧的屏幕截图和原始像素的颜色值进行比较,以我将它们设置为在程序中的颜色:
余输入颜色设置为RGB(1,2,3)和所述输出是RGB(13,22,28)。
这似乎是在低端市场相当多的色彩压缩,导致我,如果被越来越多次应用伽玛质疑。
我刚才通过的sRGB方程过去了,我可以确认的转换似乎线性1/255,二百五十五分之二只能使用一次,并且二百五十五分之三确实映射为sRGB二百五十五分之一十三,255分之22和二百五十五分之二十八使用等式1.055*C^(1/2.4)+0.055
。 鉴于扩张是这些低色值真的应该是显而易见的,如果得到应用不止一次sRGB色彩变换如此之大。
所以,我还没有决定怎么做正确的事。 不glEnable(GL_FRAMEBUFFER_SRGB)
只适用于最终的帧缓冲值,在这种情况下,我可以在我的GL初始化程序中只设置这一点,并忘掉它以下简称?