[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Public WebGL] sRGB textures
It is widely acknowledged that it's important to perform calculations to do with radiance in linear space: http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html
If calculations for radiance are not done in linear space odd effects can happen, such as textures brightening on minification and being incorrectly summed up altogether: http://hsivonen.iki.fi/png-gamma/
Transferring/Processing all values in linear space would be preferrable. HDR images (such as PNGs that use alpha as an exponent) are a one solution to this. However this has several drawbacks.
- Half or Single precision floating point textures are large to transfer.
- Using alpha for exponent only works with PNGs and eliminates the alpha channel.
- Blending (also anti-aliasing) will be done in gamma space when manually outputting gamma corrected colors.
- Manual gamma correction is not a "drop in" solution.
sRGB solves these issues:
- reads from sRGB textures are first converted to linear space and all calculations prior to handoff to the fragment program (mipmapping, anisotropy, linear interpolation etc.) are done in linear space.
- writes to sRGB textures are treated as being in linear space encoding to sRGB space happens after fragment program evaluation and blending.
- Shaders need not be modified for gamma, merely texture formats have to be switched.
sRGB also has these drawbacks:
- repeated de/encoding can introduce its own banding
- sRGB assumes consumer grade CRT monitors gamut
- Apple systems are not (by default) configured to run in sRGB space.
- mipmap generation is not supported
- does not support compressed textures (ES extension restriction, desktop defines sRGB for compressed textures).
Mirror Extension Proposal