在opengl 3中的小样本,错误的伽马校正

时间:2016-02-08 11:31:18

标签: opengl-es jogl srgb

我有一个小样本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最初已停用。

我得到this

而不是this

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

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

  • 我将fbo的内容blit到默认的fbo后台缓冲区(通过程序)。但由于此fbo的纹理具有sRGB组件,因此在读取值时将执行错误的伽玛操作,因为它们在sRGB空间中被假定为不存在。

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

所以我的形象是,如果我是对的,错误的两倍......

现在,如果我glEnable(GL_FRAMEBUFFER_SRGB);我改为this

图像看起来已经过多次修正sRGB ..

如果我改为禁用GL_FRAMEBUFFER_SRGB并更改我的fbo的GL_COLOR_ATTACHMENT0纹理格式,我最终会获得正确的图像..

为什么我无法使用glEnable(GL_FRAMEBUFFER_SRGB);获得正确的图像?

1 个答案:

答案 0 :(得分:0)

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

When to call glEnable(GL_FRAMEBUFFER_SRGB)?