I have a small sample, es-300-fbo-srgb, supposed to showing how to manage gamma correction in opengl es3.
Essentially I have:
- a
GL_SRGB8_ALPHA8textureTEXTURE_DIFFUSE - a framebuffer with another
GL_SRGB8_ALPHA8texture onGL_COLOR_ATTACHMENT0and aGL_DEPTH_COMPONENT24texture onGL_DEPTH_ATTACHMENT - the back buffer of my default fbo is
GL_LINEAR GL_FRAMEBUFFER_SRGBinitially disabled.
Now, if I recap the display metho, this is what I do:
I render the
TEXTURE_DIFFUSEtexture on the sRGB fbo and since the source texture is in sRGB space, my fragment shader will read automatically a linear value and write it to the fbo. Fbo should contain now linear values, although it is sRGB, becauseGL_FRAMEBUFFER_SRGBis disabled, so no linear->sRGB conversion is executed.I blit the content of the fbo to the default fbo back buffer (through a program). But since the texture of this fbo has the sRGB component, on the read values a wrong gamma operation will be performed because they are assumed in sRGB space when they are not.
a second gamma operation is performed by my monitor when it renders the content of the default fbo
So my image is, if I am right, twice as wrong..
Now, if I glEnable(GL_FRAMEBUFFER_SRGB); I get instead 
The image looks like it have been too many times sRGB corrected..
If I, instead, leave the GL_FRAMEBUFFER_SRGB disabled and change the format of the GL_COLOR_ATTACHMENT0 texture of my fbo, I get finally the right image..
Why do I not get the correct image with glEnable(GL_FRAMEBUFFER_SRGB);?

