【问题标题】:When to call glEnable(GL_FRAMEBUFFER_SRGB)?何时调用 glEnable(GL_FRAMEBUFFER_SRGB)?
【发布时间】:2012-07-08 07:53:43
【问题描述】:

我有一个渲染系统,在该系统中,我使用多重采样渲染缓冲区绘制到 FBO,然后将其传送到具有纹理的另一个 FBO 以解析样本,以便在绘制到时读取纹理以执行后处理着色后备缓冲区(FBO 索引 0)。

现在我想获得一些正确的 sRGB 输出...问题是当我在 OS X 和 Windows 上运行程序时,程序的行为相当不一致,这也取决于机器:在 Windows 上英特尔 HD 3000 它不会应用 sRGB 非线性,但在我的另一台带有 Nvidia GTX 670 的机器上它会应用。在 OS X 中的 Intel HD 3000 上,它也将应用它。

所以这可能意味着我没有在程序的正确位置设置我的GL_FRAMEBUFFER_SRGB 启用状态。但是我似乎找不到任何教程可以真正告诉我什么时候应该启用它,他们只提到它非常容易并且没有性能成本。

我目前没有加载任何纹理,所以我还不需要处理线性化它们的颜色。

为了强制程序不要简单地吐出线性颜色值,我尝试的是简单地注释掉我的 glDisable(GL_FRAMEBUFFER_SRGB) 行,这实际上意味着为整个管道启用此设置,我实际上是多余地强制它回到每一帧。

我不知道这是否正确。它确实对颜色应用了非线性化,但我不知道这是否被应用了两次(这会很糟糕)。它可以在我渲染到我的第一个 FBO 时应用伽玛。当我将第一个 FBO 传送到第二个 FBO 时,它可以做到这一点。为什么不?

我已经对最后一帧进行了屏幕截图,并将原始像素颜色值与我在程序中设置的颜色进行比较:

我将输入颜色设置为 RGB(1,2,3),输出颜色为 RGB(13,22,28)。

这似乎在低端进行了相当多的色彩压缩,这让我怀疑伽玛是否被多次应用。

我刚刚完成了 sRGB 方程,我可以验证转换似乎只应用了一次,因为线性 1/255、2/255 和 3/255 确实映射到 sRGB 13/255、22/ 255 和 28/255 使用等式 1.055*C^(1/2.4)+0.055。鉴于对于这些低颜色值的扩展如此之大,如果多次应用 sRGB 颜色变换,它确实应该很明显。

所以,我还没有确定正确的做法是什么。 glEnable(GL_FRAMEBUFFER_SRGB) 是否仅适用于最终的帧缓冲区值,在这种情况下,我可以在我的 GL 初始化例程中设置它然后忘记它吗?

【问题讨论】:

    标签: opengl colors framebuffer srgb


    【解决方案1】:

    启用GL_FRAMEBUFFER_SRGB 时,所有使用an sRGB image format 写入图像的操作都将假定输入颜色(正在写入的颜色)在线性颜色空间中。因此,它将它们转换为 sRGB 颜色空间。

    sRGB 格式的图像的任何写入都不应受到影响。因此,如果您正在写入浮点图像,则不会发生任何事情。因此,您应该能够将其打开并保持这种状态; OpenGL 会知道您何时渲染到 sRGB 帧缓冲区。

    一般来说,您希望尽可能长时间地在线性色彩空间中工作。只有经过后期处理后的最终渲染应该涉及 sRGB 颜色空间。因此,您的多重采样帧缓冲区可能应该保持线性(尽管您应该为其颜色提供更高的分辨率以保持准确性。使用GL_RGB10_A2GL_R11F_G11F_B10FGL_RGBA16F 作为最后的手段)。

    至于这个:

    在带有 Intel HD 3000 的 Windows 上,它不会应用 sRGB 非线性

    这几乎可以肯定是因为英特尔在编写 OpenGL 驱动程序方面做得很糟糕。如果在您启用 GL_FRAMEBUFFER_SRGB 时它没有做正确的事情,那是因为英特尔,而不是您的代码。

    当然,也可能是英特尔的驱动程序一开始就没有为您提供 sRGB 图像(如果您要渲染到默认帧缓冲区)。

    【讨论】:

    • 好吧,事情就是这样。当我在初始化时启用GL_FRAMEBUFFER_SRGB 并且之后永远不要触摸它,即使在 Windows 中的 Intel HD 3000 上它也会进行正确的转换。只是它似乎需要为更多的代码路径启用它而不是在 Nvidia 上。
    • 你所说的很有意义,缓冲区的 sRGB 格式应该确定是否将 sRGB 值写入它们。我将对此进行测试,看看它是否正确实现,它肯定会让我从每个通道的 8 位中获得更多的里程。我希望多重采样解析步骤也能正确执行此操作:我之前遇到过不正确的多重采样解析结果,但当时我可能一直在错误的模式下工作。 (看这个话题opengl.org/discussion_boards/showthread.php/…
    • 英特尔是否为 Apple 机器上的处理器维护 OpenGL 驱动程序?我的印象是 Apple 自己编写了所有内容(根据我的经验,这可以解释为什么他们的 AMD 驱动程序漏洞百出。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2021-10-02
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    相关资源
    最近更新 更多