Name EXT_pvrtc_sRGB Name Strings GL_EXT_pvrtc_sRGB Contributors Gokhan Avkarogullari, Apple Ben Bowman, Imagination Technologies Benj Lipchak, Apple John Rosasco, Apple Richard Schreyer, Apple Anthony Tai, Apple Contact Benj Lipchak, Apple Inc., (lipchak 'at' apple.com) Status Complete Version Last Modified Date: June 26, 2013 Revision: 3 Number OpenGL ES Extension #155 Dependencies OpenGL ES 2.0 is required. IMG_texture_compression_pvrtc is required. This extension extends the OpenGL ES 2.0.25 (Full Specification) and the OpenGL ES Shading Language Specification v1.00 revision 16. This extension follows precedent and issue resolution of the following specifications except where otherwise noted: http://www.opengl.org/registry/specs/EXT/texture_sRGB.txt http://www.khronos.org/registry/gles/extensions/OES/OES_framebuffer_object.txt For single-reference completeness, some of the issues from the issues lists of these specifications have been copied into this extension. This extension follows the conventions of and extends the EXT_sRGB extension at: http://www.khronos.org/registry/gles/extensions/EXT/EXT_sRGB.txt EXT_texture_storage affects the definition of this extension. IMG_texture_compression_pvrtc2 affects the definition of this extension. Overview The response from electronic display systems given RGB tristimulus values for each pixel is non-linear. Gamma correction is the process of encoding or decoding images in a manner that will correct for non-linear response profiles of output devices. The displayed results of gamma-corrected pixel data are more consistent and predictable for the author of such pixel data than it would otherwise be with linearly encoded pixel data. This EXT_pvrtc_sRGB extension specifies additional tokens for gamma corrected PVRTC compressed sRGB data. Texture assets are developed and evaluated for use in OpenGL applications using electronic displays with non-linear responses. This extension provides a better measure of consistency between textures developed within an asset toolchain and their final rendered result with an OpenGL application that uses those textures. Conventional OpenGL texture tristimulus values as well as their alpha component are encoded linearly. The textures introduced by this extension are encoded with gamma correction in the tristimulus components but linearly in the alpha component. When gamma corrected texture samples are fetched and operated on by ALU operations in an OpenGL shading program those samples will be converted from gamma corrected space to linear space for logical simplicity and performance of the shader. Texture filtering operations as well as mipmap generation are carried out in linear space. IP Status No known IP issues outstanding. Issues (1) What must be specified as far as how do you convert to and from sRGB and linear RGB color spaces? RESOLVED: The specification language needs to only supply the sRGB to linear RGB conversion. For completeness, the accepted linear RGB to sRGB conversion is as follows: Given a linear RGB component, cl, convert it to an sRGB component, cs, in the range [0,1], with this pseudo-code: if (isnan(cl)) { /* Map IEEE-754 Not-a-number to zero. */ cs = 0.0; } else if (cl > 1.0) { cs = 1.0; } else if (cl < 0.0) { cs = 0.0; } else if (cl < 0.0031308) { cs = 12.92 * cl; } else { cs = 1.055 * pow(cl, 0.41666) - 0.055; } sRGB components are typically stored as unsigned 8-bit fixed-point values. If cs is computed with the above pseudo-code, cs can be converted to a [0,255] integer with this formula: csi = floor(255.0 * cs + 0.5) (2) Does this extension guarantee images rendered with sRGB textures will "look good" when output to a device supporting an sRGB color space? RESOLVED: No. With this extension, artists can author content in an sRGB color space and provide that sRGB content for use as texture imagery that can be properly converted to linear RGB and filtered as part of texturing in a way that preserves the sRGB distribution of precision, but that does NOT mean sRGB pixels are output to the framebuffer. Indeed, this extension provides texture formats that convert sRGB to linear RGB as part of filtering. With programmable shading, an application could perform a linear RGB to sRGB conversion just prior to emitting color values from the shader. Even so, OpenGL blending (other than simple modulation) will perform linear math operations on values stored in a non-linear space which is technically incorrect for sRGB-encoded colors. One way to think about these sRGB texture formats is that they simply provide color components with a distribution of values distributed to favor precision towards 0 rather than evenly distributing the precision with conventional non-sRGB formats such as GL_RGB8. (3) Should the square compressed texture restriction be applied to this extension given the current state of hardware on which compressed sRGB textures are expected to be implemented ? RESOLVED: Yes This extension does not relax any constraint established by the IMG_texture_compression_pvrtc specification upon which it is dependent. The compressed gamma-corrected formats provided in this extension have the same characteristics and constraints as their non-gamma-corrected counterparts in the IMG_texture_compression_pvrtc specification. (4) If hardware doesn't support rendering to sRGB textures to levels other than the base level 0 how is this expressed through the API? RESOLVED: Yes N/A. This specification only includes compressed formats which are not color-renderable per the ES 2.0 specification. (5) Can PVRTC gamma corrected textures, as described in this specification, cannot be used as a framebuffer-attachable image and thus cannot be rendered to: RESOLVED: No Rendering to PVRTC textures is not usually supported by embedded hardware and this specification makes no exceptions to that effect. (6) The desktop extension EXT_texture_sRGB_decode to allow toggling texel fetch gamma decoding on and off. Is this capability warranted for this OpenGL ES specification ? RESOLVED: Yes Decode will not be included in this specification. This feature can be added as an amendment / separate extension if sufficient demand warrants it. (7) Generating mipmaps without hardware support for linearizing, processing then re-applying gamma is a costly operation and brings into question having sRGB support for GenerateMipmaps(). Evaluate hardware aspects to this issue and update this specification accordingly. RESOLVED: No (8) Should there be an interaction with IMG_texture_compression_pvrtc2? RESOLVED: Yes If PVRTC2 is supported, then further enums are added to enable sRGB decode of those formats. Note that these formats are not available on all implementations (namely iOS), so be sure to check for the extension string. New Procedures and Functions None New Tokens Accepted by the parameter of CompressedTexImage2D and TexStorage2DEXT and the parameter of CompressedTexSubImage2D: COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 Additions to Chapter 3 of the 2.0.25 Specification (Rasterization) -- Section 3.7.3, Compressed Texture Images Add Table 3.9.1 "Gamma Corrected Compressed Texture Formats" COMPRESSED_SRGB_PVRTC_2BPPV1_EXT COMPRESSED_SRGB_PVRTC_4BPPV1_EXT COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT -- Section 3.8, Texture Access, Add paragraph after first paragraph (page 85): When a texture, of formats included in table 3.9.1, sample is performed from a bound texture that is gamma corrected the sample will be implicitly converted to its corresponding linear value. Additions to Chapter 8 "Built-in Functions" of the OpenGL ES Shading Language document version 1.00, document revision 16: -- Section 8.7 "Texture Lookup Functions", add paragraph after 2nd paragraph (page 71): Then the 2D texture currently bound to "sampler" in the texture lookup functions is a gamma corrected 2D texture (as listed in Table 3.9.1 of the OpenGL ES 2.0 specification) the vec4 return value of the sampler functions will be converted into its linear space equivalent value in accordance with the parameters established by the EXT_pvrtc_sRGB extension. Dependencies on IMG_texture_compression_pvrtc2 If IMG_texture_compression_pvrtc2 is supported, then COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG 0x93F0 COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG 0x93F1 are accepted by the parameter of CompressedTexImage2D and TexStorage2DEXT and the parameter of CompressedTexSubImage2D, and are added to table 3.9.1 "Gamma Corrected Compressed Texture Formats". Errors Modify the errors introduced by IMG_texture_compression_pvrtc2 as below: INVALID_OPERATION is generated by CompressedTexSubImage2D if INTERNAL_FORMAT is COMPRESSED_RGBA_PVRTC_2BPPV2_IMG or COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG and any of the following apply: * is not a multiple of eight. * is not a multiple of four. * is not a multiple of eight, except when the sum of and is equal to TEXTURE_WIDTH. * is not a multiple of four, except when the sum of and is equal to TEXTURE_HEIGHT. * does not match the internal format of the texture image being modified. INVALID_OPERATION is generated by CompressedTexSubImage2D if INTERNAL_FORMAT is COMPRESSED_RGBA_PVRTC_4BPPV2_IMG or COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG and any of the following apply: * is not a multiple of four. * is not a multiple of four. * is not a multiple of four, except when the sum of and is equal to TEXTURE_WIDTH. * is not a multiple of four, except when the sum of and is equal to TEXTURE_HEIGHT. * does not match the internal format of the texture image being modified. Dependencies on EXT_texture_storage If EXT_texture_storage is not supported, then all references to TexStorage2DEXT should be ignored. Errors Relax INVALID_ENUM errors for the new and parameters for CompressedTexImage2D and CompressedTexSubImage2D introduced by this specification. INVALID_OPERATION is generated by CompressedTexSubImage2D if is COMPRESSED_SRGB_PVRTC_4BPPV1_EXT, COMPRESSED_SRGB_PVRTC_2BPPV1_EXT, COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT, or COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT and any of the following apply: is not equal to TEXTURE_WIDTH; is not equal to TEXTURE_HEIGHT; and are not zero. Revision History #1 February 6 2013, Benj Lipchak - initial version #2 June 26 2013, Benj Lipchak - promotion from APPLE to EXT #3 June 28 2013, Ben Bowman - Added issue 8 and interaction with IMG_texture_compression_pvrtc2