1

我有一个小样本es-300-fbo-srgb,应该展示如何在 opengl es3 中管理伽马校正。

基本上我有:

  • GL_SRGB8_ALPHA8纹理_TEXTURE_DIFFUSE
  • 一个带有另一个GL_SRGB8_ALPHA8纹理GL_COLOR_ATTACHMENT0和一个GL_DEPTH_COMPONENT24纹理的帧缓冲区GL_DEPTH_ATTACHMENT
  • 我的默认 fbo 的后台缓冲区是GL_LINEAR
  • GL_FRAMEBUFFER_SRGB最初禁用。

我明白了这个

代替这个

现在,如果我回顾一下display方法,这就是我要做的:

  • TEXTURE_DIFFUSE在 sRGB fbo 上渲染纹理,由于源纹理位于 sRGB 空间中,我的片段着色器将自动读取线性值并将其写入 fbo。Fbo 现在应该包含线性值,虽然它是 sRGB,因为GL_FRAMEBUFFER_SRGB被禁用,所以没有执行线性->sRGB 转换。

  • 我将 fbo 的内容 blit 到默认的 fbo 后台缓冲区(通过程序)。但是由于这个 fbo 的纹理具有 sRGB 分量,因此在读取的值上将执行错误的 gamma 操作,因为它们被假定在 sRGB 空间中,而实际上它们不是。

  • 当我的显示器呈现默认 fbo 的内容时,它会执行第二次伽马操作

所以我的形象是,如果我是对的,那就是错误的两倍。

现在,如果glEnable(GL_FRAMEBUFFER_SRGB);我得到这个

图像看起来已经被 sRGB 校正了太多次..

相反,如果我保留GL_FRAMEBUFFER_SRGB禁用并更改GL_COLOR_ATTACHMENT0我的 fbo 纹理的格式,我最终会得到正确的图像..

为什么我没有得到正确的图像glEnable(GL_FRAMEBUFFER_SRGB);

4

1 回答 1

0

我认为你基本上是对的:你得到了两个解码转换的净效果,其中一个(显示器中的那个)就足够了。我想您的驱动程序或您的代码破坏了某些东西,因此 OpenGL 不能正确地“连接点”;也许这个答案可以帮助你:

何时调用 glEnable(GL_FRAMEBUFFER_SRGB)?

于 2016-02-09T12:43:03.037 回答