Gamma: Difference between revisions

From vegard.wiki
Jump to navigation Jump to search
Content added Content deleted
(some extra framebuffer info)
(add link)
(3 intermediate revisions by the same user not shown)
Line 7: Line 7:
The corollary is:
The corollary is:
* Image files loaded as textures should be converted from sRGB to RGB (but some decoders do this for you!)
* Image files loaded as textures should be converted from sRGB to RGB (but some decoders do this for you!)
* Since alpha is linear, [[Premultiplied alpha|alpha premultiplication]] should happen in linear space, i.e. after converting to RGB [http://ssp.impulsetrain.com/gamma-premult.html]
* The shader responsible for putting the final pixels on the screen should have a gamma correction step doing:
* The shader responsible for putting the final pixels on the screen should have a gamma correction step doing:
:<source lang="GLSL">
:<source lang="GLSL">
Line 21: Line 22:
</source>
</source>


Note, however, that OpenGL may also perform this step for you on any on-screen framebuffers (i.e. the default framebuffer) if you do <tt>glEnable(GL_FRAMEBUFFER_SRGB)</tt>.
Note, however, that OpenGL may also perform this step for you on any on-screen framebuffers (i.e. the default framebuffer) if you do <code>glEnable(GL_FRAMEBUFFER_SRGB)</code>.


== See also ==
== See also ==
Line 29: Line 30:
* https://en.wikipedia.org/wiki/Gamma_correction
* https://en.wikipedia.org/wiki/Gamma_correction
* https://www.cambridgeincolour.com/tutorials/gamma-correction.htm
* https://www.cambridgeincolour.com/tutorials/gamma-correction.htm
* http://chilliant.blogspot.com/2012/08/srgb-approximations-for-hlsl.html
* https://unlimited3d.wordpress.com/2020/01/08/srgb-color-space-in-opengl/
* https://mynameismjp.wordpress.com/2012/10/24/msaa-overview/ ("Working with HDR and Tone Mapping")


[[Category:Graphics programming]]
[[Category:Graphics programming]]

Revision as of 08:58, 28 November 2020

Quick rules of thumb, since I can never remember which is which:

  • RGB = linear space
  • sRGB = gamma space
  • most image files store sRGB
  • sRGB is unfit for blending

The corollary is:

  • Image files loaded as textures should be converted from sRGB to RGB (but some decoders do this for you!)
  • Since alpha is linear, alpha premultiplication should happen in linear space, i.e. after converting to RGB [1]
  • The shader responsible for putting the final pixels on the screen should have a gamma correction step doing:
const float gamma = 2.2;

out vec4 color;

void main()
{
    // ...

    color = pow(color, 1. / gamma);
}

Note, however, that OpenGL may also perform this step for you on any on-screen framebuffers (i.e. the default framebuffer) if you do glEnable(GL_FRAMEBUFFER_SRGB).

See also