[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Public WebGL] Re: sRGB textures



The extension proposal is now online, please review it and note any changes you desire: http://www.khronos.org/registry/webgl/extensions/proposals/EXT_sRGB/


On Sun, Dec 16, 2012 at 2:06 PM, Florian Bösch <pyalot@gmail.com> wrote:
Motivation

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).
Specifications
Support
Mirror Extension Proposal
https://github.com/KhronosGroup/WebGL/pull/112