【发布时间】: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