| Name |
| |
| NV_sRGB_formats |
| |
| Name Strings |
| |
| GL_NV_sRGB_formats |
| |
| Contributors |
| |
| Contributors to ARB_framebuffer_sRGB and EXT_texture_sRGB |
| Mathias Heyer, NVIDIA |
| Jussi Rasanen, NVIDIA |
| Greg Roth, NVIDIA |
| |
| Contact |
| |
| Greg Roth, NVIDIA (groth 'at' nvidia.com) |
| |
| Status |
| |
| Complete |
| |
| Version |
| |
| Date: 17 Jan, 2013 |
| Revision: 5 |
| |
| Number |
| |
| OpenGL ES Extension #148 |
| |
| Dependencies |
| |
| OpenGL ES 2.0 is required. |
| |
| This extension is written against the OpenGL ES 2.0.25 |
| specification. |
| |
| Requires EXT_sRGB. |
| |
| OES_compressed_ETC1_RGB8_texture affects the definition of this |
| extension. |
| |
| EXT_texture_storage affects the definition of this extension. |
| |
| NV_texture_array affects the definition of this extension. |
| |
| NV_texture_compression_s3tc affects the definition of this |
| extension. |
| |
| NV_texture_compression_s3tc_update affects the definition of this |
| extension. |
| |
| Overview |
| |
| This extension adds new uncompressed and compressed color texture |
| formats with nonlinear sRGB color components. |
| |
| Luminance and luminance alpha provide support for textures |
| containing sRGB values with identical red, green, and blue |
| components. |
| |
| Compressed texture formats using S3TC and ETC1 compression |
| algorithms are also added to provide compressed sRGB texture |
| options. |
| |
| Finally, sized variant of sRGB, sLuminace, and sLuminance_alpha are |
| provided for immutable textures defined using the EXT_texture_storage |
| extension. |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| Accepted by the <format> and <internalformat> parameter of |
| TexImage2D, and TexImage3DNV. These are also accepted by <format> |
| parameter of TexSubImage2D and TexSubImage3DNV: |
| |
| SLUMINANCE_NV 0x8C46 |
| SLUMINANCE_ALPHA_NV 0x8C44 |
| |
| Accepted by the <internalformat> parameter of RenderbufferStorage, |
| TexStorage2DEXT, and TexStorage3DEXT: |
| SRGB8_NV 0x8C41 |
| |
| Accepted by the <internalformat> parameter of TexStorage2DEXT and |
| TexStorage3DEXT: |
| SLUMINANCE8_NV 0x8C47 |
| SLUMINANCE8_ALPHA8_NV 0x8C45 |
| |
| Accepted by the <internalformat> parameters of TexImage2D, |
| TexImage3DNV, CompressedTexImage2D, and CompressedTexImage3DNV as |
| well as the <format> parameter of TexSubImage2D, TexSubImage3DNV, |
| CompressedTexSubImage2D, and CompressedTexSubImage3DNV: |
| |
| COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F |
| |
| Accepted by the <internalformat> parameter of CompressedTexImage2D, |
| and CompressedTexImage3DNV: |
| |
| ETC1_SRGB8_NV 0x88EE |
| |
| Additions to Chapter 3 of the OpenGL ES 2.0.25 Specification |
| (Rasterization) |
| |
| Modify Section 3.7.1, "Texture Image Specification": |
| |
| Add 2 new rows to Table 3.3, "TexImage2D and ReadPixels formats": |
| |
| Element Meaning |
| Format Name and Order Target Buffer |
| ---------------- --------------- ------------- |
| SLUMINANCE_NV Luminance Color |
| SLUMINANCE_ALPHA_NV Luminance, A Color |
| |
| Add 2 new rows to Table 3.4, "Valid pixel format and type |
| combinations": |
| |
| Format Type Bytes per Pixel |
| ---------------- --------------- --------------- |
| SLUMINANCE_NV UNSIGNED_BYTE 1 |
| SLUMINANCE_ALPHA_NV UNSIGNED_BYTE 2 |
| |
| Add 2 new rows to "Valid combinations of format, type, and sized |
| internal-format" Table: |
| |
| Internal Format Format Type |
| ---------------- -------- ------ |
| SLUMINANCE8_NV SLUMINANCE_NV UNSIGNED_BYTE |
| SLUMINANCE8_ALPHA8_NV SLUMINANCE_ALPHA_NV UNSIGNED_BYTE |
| |
| |
| Add 5 new rows to "Specific Compressed Internal Formats" Table |
| |
| Compressed Internal Format Base Internal Format |
| ----------------------------------- -------------------- |
| COMPRESSED_SRGB_S3TC_DXT1_NV RGB |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV RGBA |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV RGBA |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV RGBA |
| ETC1_SRGB8_NV RGB |
| |
| Modify Section 3.7.2 "Alternate Texture Image Specification |
| Commands" |
| |
| Modify the first sentence of the last paragraph (added by |
| NV_texture_compression_s3tc_update): |
| |
| When the internal format of the texture object is |
| COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, |
| COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, |
| COMPRESSED_SRGB_S3TC_DXT1_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV, or COMPRESSED_SRGB_ALPHA_- |
| S3TC_DXT5_NV the update region specified in TexSubImage2D must be |
| aligned to 4x4 pixel blocks. ... |
| |
| Modify Section 3.7.3 "Compressed Texture Images" |
| |
| Add to the description of CompressedTexImage* |
| |
| If <internalformat> is COMPRESSED_SRGB_S3TC_DXT1_NV, |
| COMPRESSED_SRGBA_S3TC_DXT1_NV, COMPRESSED_SRGBA_S3TC_DXT3_NV, or |
| COMPRESSED_SRGBA_S3TC_DXT5_NV, the compressed texture is stored |
| using one of several S3TC compressed texture image formats. The |
| S3TC texture compression algorithm supports only 2D images. |
| CompressedTexImage3DNV produce an INVALID_OPERATION error if |
| <internalformat> is an S3TC format and <target> is not TEXTURE_- |
| 2D_ARRAY_NV. |
| |
| If <internalformat> is ETC1_SRGB8_NV, the compressed texture is an |
| ETC1 compressed texture. |
| |
| Change the penultimate paragraph describing CompressedTexSubImage* |
| (added by NV_texture_compression_s3tc): |
| |
| If the internal format is one of COMPRESSED_RGB_S3TC_DXT1_NV, |
| COMPRESSED_RGBA_S3TC_DXT1_NV, COMPRESSED_RGBA_S3TC_DXT3_NV, |
| COMPRESSED_RGBA_S3TC_DXT5_NV, COMPRESSED_SRGBA_S3TC_DXT1_NV, |
| COMPRESSED_SRGBA_S3TC_DXT3_NV, or COMPRESSED_SRGBA_S3TC_DXT5_NV |
| the compressed texture is stored using one of several S3TC |
| compressed texture image formats ... |
| |
| Modify Section 3.7.14, "sRGB Texture Color Conversion": |
| |
| Change the first sentence to: |
| |
| "If the currently bound texture's internal format is one |
| of SRGB_EXT, SRGB_ALPHA_EXT, SLUMINANCE_ALPHA_NV, SLUMINANCE_NV, |
| COMPRESSED_SRGB_S3TC_DXT1_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV, |
| or ETC1_SRGB8_NV 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. ..." |
| |
| Additions to Chapter 4 of the OpenGL ES 2.0.25 Specification (Per- |
| Fragment Operations and the Framebuffer) |
| |
| The following should be added to table 4.5 "Renderbuffer Image |
| formats": |
| |
| SRGB8_NV color_renderable 8 8 8 - - - |
| |
| Additions to Chapter 6 of the OpenGL ES 2.0.25 Specification (State and |
| State Requests) |
| |
| In section 6.1.3, modify the last sentence of the description of |
| GetFramebufferAttachmentParameteriv: |
| |
| "... For framebuffer objects, components are sRGB-encoded if the |
| internal format of a color attachment is SRGB_EXT, SRGB8_NV, |
| SRGB_ALPHA_EXT, SRGB8_ALPHA8_EXT, SLUMINANCE_NV, SLUMINANCE8_NV, |
| SLUMINANCE_ALPHA_NV, SLUMINANCE8_ALPHA8_NV, COMPRESSED_SRGB_S3TC_- |
| DXT1_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV, COMPRESSED_SRGB_ALPHA_- |
| S3TC_DXT3_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV, or ETC1_SRGB8_NV." |
| |
| Dependencies on OES_compressed_ETC1_RGB8_texture |
| |
| If OES_compressed_ETC1_RGB8_texture is not supported, ignore all |
| references to ETC1_SRGB8_NV. |
| |
| Dependencies on EXT_texture_storage |
| |
| If EXT_texture_storage is not supported, ignore all references to |
| glTexStorage2DEXT and TexStorage3DEXT functions, additions to the |
| "Valid combinations of format, type, and sized internal-format" |
| Table, and LUMINANCE8_NV and LUMINANCE8_ALPHA8_NV tokens. |
| |
| Dependencies on NV_texture_array |
| |
| If NV_texture_array is not supported, ignore all references to |
| TexImage3DNV, TexSubImage3DNV, CompressedTexImage3DNV, and |
| CompressedTexSubImage3DNV. |
| |
| Dependencies on NV_texture_compression_s3tc |
| |
| If EXT_texture_compression_s3tc is not supported, ignore the new |
| COMPRESSED_*_S3TC_DXT* tokens, the additions to the "Compressed |
| Internal Format" table, errors related to the COMPRESSED_*_S3TC_DXT* |
| tokens, and related discussion. Also ignore edits to decription |
| of CompressedTexSubImage*. |
| |
| Dependencies on NV_texture_compression_s3tc_update |
| |
| If NV_texture_compression_s3tc_update is not supported, passing |
| COMPRESSED_SRGB_NV, COMPRESSED_SRGB_ALPHA_NV, |
| COMPRESSED_SLUMINANCE_NV, COMPRESSED_SLUMINANCE_ALPHA_NV, |
| COMPRESSED_SRGB_S3TC_DXT1_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV, or COMPRESSED_SRGB_ALPHA_S3TC_- |
| DXT5_NV to the <internalformat> parameter of TexImage2D, |
| TexImage3DNV, is not supported and will produce an INVALID_VALUE |
| |
| Errors |
| |
| INVALID_OPERATION is generated by CompressedTexSubImage* if |
| <internalformat> is COMPRESSED_SRGB_S3TC_DXT1_NV, |
| COMPRESSED_SRGBA_S3TC_DXT1_NV, COMPRESSED_SRGBA_S3TC_DXT3_NV, or |
| COMPRESSED_SRGBA_S3TC_DXT5_NV and any of the following apply: |
| * <width> is not a multiple of four, and <width> plus |
| <xoffset> is not equal to the texture width; |
| * <height> is not a multiple of four, and <height> plus |
| <yoffset> is not equal to the texture height; or |
| * <xoffset> or <yoffset> is not a multiple of four. |
| |
| INVALID_OPERATION is generated by CompressedTexImage3DNV if |
| <internalformat> is COMPRESSED_SRGB_S3TC_DXT1_NV, COMPRESSED_SRGB_- |
| ALPHA_S3TC_DXT1_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV, or ETC1_SRGB8_NV and <target> is |
| not TEXTURE_IMAGE_2D_ARRAY_NV. |
| |
| INVALID_OPERATION is generated by CompressedTexSubImage2D, |
| TexSubImage2D, CompressedTexSubImage3DNV, or TexSubImage3DNV, if the |
| texture image <level> bound to <target> has internal format |
| ETC1_SRGB8_NV. |
| |
| New State |
| |
| None |
| |
| New Implementation Dependent State |
| |
| None |
| |
| Issues |
| |
| 1) Should this be one extension or two? |
| |
| RESOLVED: one. Desktop GL divided this functionality between |
| texture_sRGB and framebuffer_sRGB, but the ES extension EXT_sRGB |
| which took some features from each of those was only one. For |
| consistency with EXT_sRGB, this is a single extension. |
| |
| 2) Should inherently incomplete compressed sRGB texture attachments |
| still return sRGB for FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT |
| queries? |
| |
| RESOLVED: Yes. Just because they are incomplete doesn't mean they |
| aren't attached. Such a query might be performed to determine |
| why an FBO is incomplete. |
| |
| 3) Should formats for sRGB luminance values be supported? |
| |
| RESOLVED: Yes. Implementations can always support luminance |
| and luminance-alpha sRGB formats as an RGB8 or RGBA8 format with |
| replicated R, G, and B values. |
| |
| For lack of a better term, "SLUMINANCE" will be used within |
| token names to indicate sRGB values with identical red, green, |
| and blue components. |
| |
| 4) Should all component sizes be supported for sRGB components or |
| just 8-bit? |
| |
| RESOLVED: Just 8-bit. For sRGB values with more than 8 bit of |
| precision, a linear representation may be easier to work with |
| and adequately represent dim values. Storing 5-bit and 6-bit |
| values in sRGB form is unnecessary because applications |
| sophisticated enough to sRGB to maintain color precision will |
| demand at least 8-bit precision for sRGB values. |
| |
| Because hardware tables are required sRGB conversions, it doesn't |
| make sense to burden hardware with conversions that are unlikely |
| when 8-bit is the norm for sRGB values. |
| |
| 5) Should generic compressed sRGB formats be supported? |
| |
| RESOLVED: Yes. Implementations are free simply to use |
| uncompressed sRGB formats to implement the GL_COMPRESSED_SRGB_* |
| formats. |
| |
| 6) Should S3TC compressed sRGB formats be supported? |
| |
| RESOLVED: Yes, but only if EXT_texture_compression_s3tc is also |
| advertised. For competitive reasons, we expect OpenGL ES will |
| need an S3TC-based block compression format for sRGB data. |
| |
| Rather than expose a separate "sRGB_compression" extension, |
| it makes more sense to specify a dependency between |
| EXT_texture_compression_s3tc and this extension such that when |
| BOTH extensions are exposed, the GL_COMPRESSED_SRGB*_S3TC_DXT*_NV |
| tokens are accepted. |
| |
| We avoid explicitly requiring S3TC formats when EXT_texture_sRGB |
| is advertised to avoid IP encumbrances. |
| |
| 7) How is the texture border color handled for sRGB formats? |
| (Only relevant if NV_texture_border_clamp is supported. |
| |
| RESOLVED: The texture border color is specified as four |
| floating-point values. Given that the texture border color can |
| be specified at such high precision, it is always treated as a |
| linear RGBA value. |
| |
| Only texel components are converted from the sRGB encoding to a |
| linear RGB value ahead of texture filtering. The border color |
| can be used "as is" without any conversion. |
| |
| By keeping the texture border color specified as a linear |
| RGB value at the API level allows developers to specify the |
| high-precision texture border color in a single consistent color |
| space without concern for how the sRGB conversion is implemented |
| in relation to filtering. |
| |
| An implementation that does post-filtering sRGB conversion is |
| likely to convert the texture border color to sRGB within |
| the driver so it can be filtered with the sRGB values coming |
| from texels and then the filtered sRGB value is converted to |
| linear RGB. |
| |
| By maintaining the texture border color always in linear RGB, |
| we avoid developers having to know if an implementation is |
| performing the sRGB conversion (ideally) pre-filtering or (less |
| ideally) post-filtering. |
| |
| 8) Should sRGB framebuffer support affect the pixel path? |
| |
| RESOLVED: No. |
| |
| sRGB conversion only applies to color reads for blending and |
| color writes. Color reads for glReadPixels have no sRGB |
| conversion applied. |
| |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- --------- ------------------------------------- |
| 5 17 Jan 2013 groth Add sized L and LA sRGB formats |
| Drastically flesh out interactions. |
| 4 11 sep 2012 groth Further clarify interactions |
| 3 21 Aug 2012 groth Reorganzied issues. Clarified some. |
| 2 15 Aug 2012 groth Clarified mheyer feedback. |
| 1 13 Aug 2012 groth Initial draft based off EXT_texture_sRGB |