我有一个小样本es-300-fbo-srgb,应该展示如何在opengl es3中管理伽马校正。
基本上我有:
GL_SRGB8_ALPHA8
纹理TEXTURE_DIFFUSE
GL_SRGB8_ALPHA8
上有另一个GL_COLOR_ATTACHMENT0
纹理,GL_DEPTH_COMPONENT24
上有一个GL_DEPTH_ATTACHMENT
纹理GL_LINEAR
GL_FRAMEBUFFER_SRGB
最初已停用。现在,如果我回顾一下display
方法,我就是这样做的:
我在sRGB fbo上渲染TEXTURE_DIFFUSE
纹理,由于源纹理在sRGB空间,我的片段着色器将自动读取一个线性值并将其写入fbo。 Fbo现在应该包含线性值,尽管它是sRGB,因为GL_FRAMEBUFFER_SRGB
被禁用,因此不执行线性 - > sRGB转换。
我将fbo的内容blit到默认的fbo后台缓冲区(通过程序)。但由于此fbo的纹理具有sRGB组件,因此在读取值时将执行错误的伽玛操作,因为它们在sRGB空间中被假定为不存在。
我的显示器在呈现默认fbo的内容时执行第二次伽马操作
所以我的形象是,如果我是对的,错误的两倍......
现在,如果我glEnable(GL_FRAMEBUFFER_SRGB);
我改为
图像看起来已经过多次修正sRGB ..
如果我改为禁用GL_FRAMEBUFFER_SRGB
并更改我的fbo的GL_COLOR_ATTACHMENT0
纹理格式,我最终会获得正确的图像..
为什么我无法使用glEnable(GL_FRAMEBUFFER_SRGB);
获得正确的图像?
答案 0 :(得分:0)
我认为你基本上是正确的:你得到两个解码转换的净效果,其中一个(显示器中的那个)就足够了。我想你的驱动程序或代码都会破坏某些东西,所以OpenGL没有正确地“连接点”;也许这个答案可以帮助你: