| 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 <internalformat> parameter of CompressedTexImage2D and |
| TexStorage2DEXT and the <format> 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 <internalformat> parameter of CompressedTexImage2D and |
| TexStorage2DEXT and the <format> 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: |
| |
| * <xoffset> is not a multiple of eight. |
| * <yoffset> is not a multiple of four. |
| * <width> is not a multiple of eight, except when the sum of <width> |
| and <xoffset> is equal to TEXTURE_WIDTH. |
| * <height> is not a multiple of four, except when the sum of <height> |
| and <yoffset> is equal to TEXTURE_HEIGHT. |
| * <format> 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: |
| |
| * <xoffset> is not a multiple of four. |
| * <yoffset> is not a multiple of four. |
| * <width> is not a multiple of four, except when the sum of <width> |
| and <xoffset> is equal to TEXTURE_WIDTH. |
| * <height> is not a multiple of four, except when the sum of <height> |
| and <yoffset> is equal to TEXTURE_HEIGHT. |
| * <format> 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 <internalformat> and <format> |
| parameters for CompressedTexImage2D and CompressedTexSubImage2D introduced |
| by this specification. |
| |
| INVALID_OPERATION is generated by CompressedTexSubImage2D if <format> |
| 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: |
| <width> is not equal to TEXTURE_WIDTH; <height> is not equal to |
| TEXTURE_HEIGHT; <xoffset> and <yoffset> 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 |