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_ALPHA8
textureTEXTURE_DIFFUSE
- a framebuffer with another
GL_SRGB8_ALPHA8
texture onGL_COLOR_ATTACHMENT0
and aGL_DEPTH_COMPONENT24
texture onGL_DEPTH_ATTACHMENT
- the back buffer of my default fbo is
GL_LINEAR
GL_FRAMEBUFFER_SRGB
initially disabled.
Now, if I recap the display
metho, this is what I do:
I render the
TEXTURE_DIFFUSE
texture 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_SRGB
is 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);
?