elect February 2016

Small sample in opengl es 3, wrong gamma correction

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 texture TEXTURE_DIFFUSE
  • a framebuffer with another GL_SRGB8_ALPHA8 texture on GL_COLOR_ATTACHMENT0 and a GL_DEPTH_COMPONENT24 texture on GL_DEPTH_ATTACHMENT
  • the back buffer of my default fbo is GL_LINEAR
  • GL_FRAMEBUFFER_SRGB initially disabled.

I get this

instead of this

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, because GL_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

Answers


Simon Thum February 2016

I think you are basically right: you get the net effect of two decoding conversions where one (the one in your monitor) would be enough. I suppose that either your driver or your code breaks something so OpenGL doesn't 'connect the dots' properly; perhaps this answer helps you:

When to call glEnable(GL_FRAMEBUFFER_SRGB)?

Post Status

Asked in February 2016
Viewed 1,151 times
Voted 10
Answered 1 times

Search




Leave an answer