blob: 5a5563a7f527fd6b3fc3012b467cd0cea1c0b84e [file] [log] [blame]
Name
EXT_sRGB
Name Strings
GL_EXT_sRGB
Contributors
Maurice Ribble
Tero Aurto
Jon Leech
Mark Callow
Daniel Koch
Parts of this extension are copied from ARB_framebuffer_sRGB.
Parts of this extension are copied from EXT_texture_sRGB.
Contact
Maurice Ribble, Qualcomm (mribble 'at' qualcomm.com)
Status
Not complete.
Version
Date: Sept 14, 2011
Number
OpenGL ES Extension #105
Dependencies
This requires OpenGL ES 1.0 or greater. This extension is written based on
the wording of the OpenGL ES 2.0 specification.
This extension requires support for OES_rgb8_rgba8 or equivalent
functionality.
If OES_texture_3D is not supported then the parts of this extension for 3d
textures should be ignored.
If this is being used with ES 1.x then you need to support
OES_framebuffer_object for the framebuffer object related features in this
extension.
Overview
The sRGB color space is based on typical (non-linear) response of the human
eye. It has been standardized by the International Electrotechnical
Commission (IEC) as IEC 61966-2-1. The transfer function of sRGB roughly
corresponds to a power function with a gamma of 2.2.
FRAMEBUFFERS
OpenGL assumes framebuffer color components are stored in a linear color
space. In particular, framebuffer blending is a linear operation.
This extension adds a framebuffer capability for sRGB framebuffer update
and blending. When blending is disabled but the new sRGB updated mode is
enabled (assume the framebuffer supports the capability), high-precision
linear color component values for red, green, and blue generated by
fragment coloring are encoded for sRGB prior to being written into the
framebuffer. When blending is enabled along with the new sRGB update mode,
red, green, and blue framebuffer color components are treated as sRGB
values that are converted to linear color values, blended with the high-
precision color values generated by fragment coloring, and then the blend
result is encoded for sRGB just prior to being written into the
framebuffer.
TEXTURES
Conventional texture formats assume a linear color space. So for a
conventional internal texture format such as GL_RGB8, the 256 discrete
values for each 8-bit color component map linearly and uniformly to the
[0,1] range.
New Procedures and Functions
None
New Tokens
Accepted by the <format> and <internalformat> parameter of TexImage2D, and
TexImage3DOES. These are also accepted by <format> parameter of
TexSubImage2D and TexSubImage3DOES:
SRGB_EXT 0x8C40
SRGB_ALPHA_EXT 0x8C42
Accepted by the <internalformat> parameter of RenderbufferStorage:
SRGB8_ALPHA8_EXT 0x8C43
Accepted by the <pname> parameter of GetFramebufferAttachmentParameteriv:
FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210
Additions to Chapter 3 of the 2.0 Specification (Rasterization)
Modify Section 3.7.1, Texture Image Specification:
Add 2 new rows to Table 3.3
SRGB_EXT R, G, B Color
SRGB_ALPHA_EXT R, G, B, A Color
Add 2 new rows to Table 3.4
SRGB_EXT UNSIGNED_BYTE 3
SRGB_ALPHA_EXT UNSIGNED_BYTE 4
Modify Section 3.7.11: Mipmap Generation
Add the following sentence to the end of this section:
If the format of a texture is sRGB, he error INVALID_OPERATION is
generated.
Add Section 3.7.14, sRGB Texture Color Conversion
If the currently bound texture's internal format is one of SRGB_EXT or
SRGB_ALPHA_EXT the red, green, and blue components are converted from an
sRGB color space to a linear color space as part of filtering described in
sections 3.7.7 and 3.7.8. Any alpha component is left unchanged. Ideally,
implementations should perform this color conversion on each sample prior
to filtering but implementations are allowed to perform this conversion
after filtering (though this post-filtering approach is inferior to
converting from sRGB prior to filtering).
The conversion from an sRGB encoded component, cs, to a linear component,
cl, is as follows.
{ cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045
Assume cs is the sRGB component in the range [0,1]."
Additions to Chapter 4 of the Specification
DELETE the following sentence from section 4.1.6 (Blending) because it is
moved to the new "sRGB Conversion" section:
Each of these floating-point values is clamped to [0,1] and converted back
to a fixed-point value in the manner described in section 2.1.2.
Replace the following sentence:
Destination (framebuffer) components are taken to be fixed-point values
represented according to the scheme in section 2.1.2 (Final Color
Processing), as are source (fragment) components.
with the following sentences:
Destination (framebuffer) components are taken to be fixed-point values
represented according to the scheme in section 2.1.2 (Final Color
Processing). The R G, and B destination color values (after conversion
from fixed-point to floating-point) are considered to be encoded for the
sRGB color space and hence need to be linearized prior to their use in
blending. Each R, G, and B component is linearized by some approximation
of the following:
{ cs / 12.92, cs <= 0.04045
cl = {
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045
where cs is the component value prior to linearization and cl is the
result.
If the value of FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT for the
framebuffer attachment corresponding to the destination buffer is SRGB, the
R, G, and B destination color values (after conversion from fixedpoint to
floating-point) are considered to be encoded for the sRGB color space and
hence must be linearized prior to their use in blending. Each R, G, and B
component is converted in the same fashion described for sRGB texture
components as described below.
If the value of FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT is not SRGB, no
linearization is performed.
The resulting linearized R, G, and B and unmodified A values are
recombined as the destination color used in blending computations.
ADD new section 4.1.X "sRGB Conversion". With this new section added,
understand the "next operation" referred to in the section 4.1.6
(Blending) to now be "sRGB Conversion" (instead of "Dithering").
"If the value of FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT for the
framebuffer attachment corresponding to the destination buffer is SRGB, the
R, G, and B values after blending are converted into the non-linear sRGB
color space by computing:
{ 0.0, cl <= 0
{ 12.92 * c, 0 < cl < 0.0031308
cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1
{ 1.0, cl >= 1
where cl is the R, G, or B element and cs is the result (effectively
converted into an sRGB color space).
The resulting cs values for R, G, and B and the unmodified A form a new
RGBA color value. If the color buffer is fixed-point, the components of
this RGBA color value are clamped to [0,1] and then converted to a fixed-
point value. The resulting four values are sent to the subsequent
dithering operation."
The following should be added to table 4.5 Renderbuffer Image formats:
SRGB8_ALPHA8_EXT color_renderable 8 8 8 8 - -
Additions to Chapter 5 of the 2.0 Specification (Special Functions)
None
Additions to Chapter 6 of the 2.0 Specification (State and State Requests)
Add the following to 6.1.13's description of
GetFramebufferAttachmentParameteriv:
If pname is FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT, param will contain
the encoding of components of the specified attachment, one of LINEAR or
SRGB for linear or sRGB-encoded components, respectively. Only color buffer
components may be sRGB-encoded. For the default framebuffer, color encoding
is determined by the implementation. For framebuffer objects, components
are sRGB-encoded if the internal format of a color attachment is SRGB_EXT, SRGB_ALPHA_EXT, or SRGB8_ALPHA8_EXT.
Add the following to 6.2 State Tables
FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING z2 GetFramebufferAttachementParameteriv
- Encoding of components in the attached image 6.1.13
Additions to the OpenGL Shading Language specification
None
Additions to the GLX Specification
None
Errors
Relaxation of INVALID_ENUM errors
---------------------------------
TexImage2D, TexImage3DOES, and RenderBufferStorage now accept the new
tokens as listed in the "New Tokens" section.
New Implementation Dependent State
None
Issues
1) Do we require SRGB8_EXT be supported for RenderbufferStorage?
No. Some hardware would need to pad this out to RGBA and instead of adding
that unknown for application developers we will simply not support that
format in this extension.
2) Should the SLUMINANCE* family be supported?
No. Luminance is a rarely used format so we won't support it here.
3) Should we allow the SRGB_*_S3TC_DXT* or any of the other COMPRESSED
formats if the implementation supports any of those formats?
No since all hardware doesn't support this. It can be added as a separate
extension if needed.
4) What is the expectation for mipmap generation on SRGB textures? Issue
24 from EXT_texture_sRGB gives two possible ways, will we leave it
similarly undefined, or is this not intended to be supported at all?
No. This in not likely to be used much so for simplicity let's not require
it. This will generate an INVALID_OPERATION error.
Revision History
#06 9/14/2011 Maurice Ribble Removed compressed formats and
disallowed generateMipmaps
#05 9/12/2011 Maurice Ribble Updated issues and added
FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
#04 8/18/2011 Maurice Ribble Fixes and issues from Daniel Koch.
#03 7/21/2011 Maurice Ribble Language cleanup suggested by Jon
Leech and Mark Callow.
#02 7/20/2011 Maurice Ribble Minor updates.
#01 3/17/2011 Maurice Ribble First draft.