何时调用glEnable(GL_FRAMEBUFFER_SRGB)?(When to call gl

2019-06-26 03:30发布

我有一个渲染系统在哪里画到一个多重采样渲染的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初始化程序中只设置这一点,并忘掉它以下简称?

Answer 1:

GL_FRAMEBUFFER_SRGB启用时,所有写入与图像的的sRGB图像格式将假设输入色彩(被写入的颜色)为线性颜色空间。 因此,将它们转换为sRGB色彩空间。

不在此sRGB格式图像的任何写操作应该不会受到影响。 所以,如果你正在写一个浮点图像,没有什么应该发生。 因此,你应该能够只是打开它,离开它的方式; 当你渲染的帧缓冲区的sRGB的OpenGL就知道了。

在一般情况下,你想在一个线性色彩空间的工作,只要可能的。 只有你最后的渲染,后期处理后,应当包括sRGB颜色空间中。 所以,你的多重采样帧缓冲区或许应该保持线性(虽然你应该给它更高的分辨率,它的颜色保持精度。使用GL_RGB10_A2GL_R11F_G11F_B10F ,或GL_RGBA16F作为最后的手段)。

至于这样的:

在Windows与Intel HD 3000将不适用的sRGB非线性

这几乎可以肯定是由于英特尔在写OpenGL驱动程序吸吮。 如果没有做正确的事情,当你启用GL_FRAMEBUFFER_SRGB ,这是因为英特尔的,不是你的代码。

当然,这也可能是英特尔的驱动程序没有给你一个的sRGB图像与开始(如果你渲染到默认的帧缓冲)。



文章来源: When to call glEnable(GL_FRAMEBUFFER_SRGB)?