| Name |
| |
| EXT_texture_compression_s3tc_srgb |
| |
| Name Strings |
| |
| GL_EXT_texture_compression_s3tc_srgb |
| |
| Contributors |
| |
| Christophe Riccio, Unity |
| Kai Ninomiya, Google |
| Kenneth Russell, Google |
| Contributors to EXT_texture_compression_s3tc |
| |
| Contact |
| |
| Christophe Riccio, (christophe 'dot' riccio 'at' unity3d 'dot' com) |
| |
| Status |
| |
| FINAL, implemented by ANGLE |
| |
| Version |
| |
| 1 October 2016 |
| |
| Number |
| |
| OpenGL ES Extension #289 |
| |
| Dependencies |
| |
| OpenGL ES 2.0 is required. |
| |
| OpenGL ES 3.0 or EXT_sRGB are required. |
| |
| EXT_texture_compression_s3tc is required. |
| |
| This extension is written against the OpenGL ES 3.0.4 |
| specification with EXT_texture_compression_s3tc extension. |
| |
| This extension is written against the OpenGL ES 2.0.25 |
| specification with EXT_texture_compression_s3tc extension. |
| |
| EXT_texture_storage affects the definition of this |
| extension. |
| |
| Overview |
| |
| This extension adds new compressed color texture formats using S3TC with |
| nonlinear sRGB color components. |
| |
| IP Status |
| |
| Contact S3 Incorporated (http://www.s3.com) regarding any intellectual |
| property issues associated with implementing this extension. |
| |
| WARNING: Vendors able to support S3TC texture compression in Direct3D |
| drivers do not necessarily have the right to use the same functionality in |
| OpenGL. |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| This extension introduces new tokens: |
| |
| COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F |
| |
| In extended OpenGL ES 2.0.25 these new tokens are accepted by the |
| <internalformat> parameter of TexImage2D, CompressedTexImage2D, TexStorage2DEXT, |
| TextureStorage2DEXT and the <format> parameter of CompressedTexSubImage2D. |
| |
| In extended OpenGL ES 3.0.4 these new tokens are also accepted by the |
| <internalformat> parameter of TexImage2D, TexImage3D, CompressedTexImage3D, |
| TexStorage2D, TexStorage3D, TexStorage3DEXT, TextureStorage3DEXT and the <format> |
| parameter of CompressedTexSubImage3D. |
| |
| Additions to Chapter 3 of the OpenGL ES 2.0.25 Specification |
| |
| Modify Section 3.7.1, Texture Image Specification: |
| |
| Change last paragraph on Page 67 as follows |
| (modified by EXT_texture_compression_s3tc): |
| |
| Components are then selected from the resulting R, G, B, or A values |
| to obtain a texture with the base internal format specified by |
| <internalformat>, which must match <format> except when <target> is |
| TEXTURE_2D and <internalformat> is one of the following compressed |
| formats: COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, |
| COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, |
| COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT. |
| In this case, conversion from only RGB and RGBA formats are supported |
| during texture image processing. <format> values other than RGB or RGBA |
| will result in the INVALID_OPERATION error. In all other cases where |
| <internalformat> does not match <format>, the error INVALID_OPERATION is |
| generated. Table 3.8 summarizes the mapping of R, G, B, and A values to |
| texture components, as a function of the base internal format of the |
| texture image. <internalformat> may be one of the five internal format |
| symbolic constants listed in table 3.8 or the four compressed |
| formats: COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, |
| COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, |
| COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT. |
| Specifying a value for <internalformat> that is not one of the above values |
| generates the error INVALID_VALUE. When a compressed <internalformat> is |
| specified, a compressed texture is created and all the associated |
| restrictions mentioned in Section 3.7.3 are imposed. |
| |
| Note that when encoding an RGBA image into a format using 1-bit |
| alpha, any texels with an alpha component less than 0.5 end up |
| with an alpha of 0.0 and any texels with an alpha component |
| greater than or equal to 0.5 end up with an alpha of 1.0. When |
| encoding an RGBA image into the COMPRESSED_RGBA_S3TC_DXT1_EXT or |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT format, the resulting red, |
| green, and blue components of any texels with a final alpha of 0.0 |
| will automatically be zero (black). If this behavior is not desired |
| by an application, it should not use COMPRESSED_RGBA_S3TC_DXT1_EXT or |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT. |
| |
| Modify Section 3.7.2, Alternate Texture Image Specification Commands |
| (modified by EXT_texture_compression_s3tc): |
| |
| Modify last paragraph with: |
| |
| 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_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, |
| the update region specified in TexSubImage2D must be aligned to 4x4 |
| pixel blocks. If <xoffset> or <yoffset> are not multiples of 4 an |
| INVALID_OPERATION error is generated. If <width> is not a multiple |
| of 4 and <xoffset> + <width> is not equal to the width of the LOD |
| then an INVALID_OPERATION error is generated. If <height> is not |
| a multiple of 4 and <yoffset> + <height> is not equal to the |
| height of the LOD then an INVALID_OPERATION error is generated. |
| |
| Modify Section 3.7.3, "Compressed Texture Images" |
| |
| Add 4 new rows to "Specific compressed texture formats" Table 3.X: |
| |
| Compressed Internal Format Base Internal Format |
| ----------------------------------- -------------------- |
| COMPRESSED_SRGB_S3TC_DXT1_EXT RGB |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT RGBA |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT RGBA |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT RGBA |
| |
| Replace last paragraph with: |
| |
| If the internal format is one of COMPRESSED_RGB_S3TC_DXT1_EXT, |
| COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, |
| COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, |
| or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT the compressed texture is stored |
| using one of several S3TC compressed texture image formats and is |
| easily edited along 4x4 texel boundaries. In this case, |
| CompressedTexSubImage2D will result in an INVALID_OPERATION error |
| if one of the following conditions occurs: |
| |
| * <width> is not a multiple of four, and <width> plus |
| <xoffset> is not equal to texture width; |
| |
| * <height> is not a multiple of four, and <height> plus |
| <yoffset> is not equal to texture height; or |
| |
| * <xoffset> or <yoffset> is not a multiple of four. |
| |
| For any other formats, calling CompressedTexSubImage2D will result |
| in an INVALID_OPERATION error if <xoffset> or <yoffset> is not |
| equal to zero, or if <width> and <height> do not match the width |
| and height of the texture, respectively. The contents of any texel |
| outside the region modified by the call are undefined. These |
| restrictions may be relaxed for other specific compressed internal |
| formats whose images are easily modified. |
| |
| Additions to Chapter 3 of the OpenGL ES 3.0.4 Specification |
| (Rasterization) |
| |
| Modify Section 3.8.3, "Texture Image Specification": |
| |
| Modify paragraph starting with "For internalformat different than " |
| (modified by EXT_texture_compression_s3tc): |
| |
| For internalformat different than COMPRESSED_RGB_S3TC_DXT1_EXT, |
| COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, |
| COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, |
| or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT specifying a combination of values |
| for format, type, and internalformat that is not listed as a valid |
| combination in tables 3.2 or 3.3 generates the error INVALID_OPERATION. |
| |
| For internalformat equal to COMPRESSED_RGB_S3TC_DXT1_EXT, |
| COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, |
| COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT only RGB and RGBA formats are supported |
| during texture image processing and for these internalformat values |
| <format> values other than RBA or RGBA will result in the INVALID_OPERATION |
| error. |
| |
| Modify Section 3.8.6. "Compressed Texture Images": |
| |
| Add 4 new rows to "Compressed internal formats" Table 3.19: |
| |
| Compressed Internal Format Base Internal Format |
| ----------------------------------- -------------------- |
| COMPRESSED_SRGB_S3TC_DXT1_EXT RGB |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT RGBA |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT RGBA |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT RGBA |
| |
| Modify paragraph starting with "If the internal format is one of " |
| (added by EXT_texture_compression_s3tc): |
| |
| If the internal format is one of COMPRESSED_RGB_S3TC_DXT1_EXT, |
| COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, |
| COMPRESSED_RGBA_S3TC_DXT5_EXT, COMPRESSED_SRGB_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, |
| or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT the compressed texture is stored |
| using one of several S3TC compressed texture image formats and is easily |
| edited along 4x4 texel boundaries. In this case, |
| CompressedTexImage2D/CompressedTexImage3D will result in an |
| INVALID_OPERATION error if one of the following conditions occurs: |
| |
| * <width> is not a multiple of four, and <width> plus |
| <xoffset> is not equal to texture width; |
| |
| * <height> is not a multiple of four, and <height> plus |
| <yoffset> is not equal to texture height; or |
| |
| * <xoffset> or <yoffset> is not a multiple of four. |
| |
| For any other formats, calling CompressedTexSubImage2D/CompressedTexImage3D |
| will result in an INVALID_OPERATION error if <xoffset> or <yoffset> is not |
| equal to zero, or if <width> and <height> do not match the width and height |
| of the texture, respectively. The contents of any texel outside the region |
| modified by the call are undefined. These restrictions may be relaxed for |
| other specific compressed internal formats whose images are easily |
| modified. |
| |
| Modify Section 3.8.16, "sRGB Texture Color Conversion": |
| |
| Change the first sentence to: |
| |
| If the currently bound texture's internal format is one of SRGB8, |
| SRGB8_ALPHA8, COMPRESSED_SRGB8_ETC2, COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, |
| COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, COMPRESSED_SRGB_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, |
| or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_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.8.10 and 3.8.11. |
| |
| Dependencies on EXT_texture_storage |
| |
| If EXT_texture_storage is not supported, ignore all references to |
| TexStorage2DEXT and TexStorage3DEXT functions. |
| |
| Errors for OpenGL ES 2.0.25 Specification |
| |
| INVALID_OPERATION is generated by CopyTexSubImage2D if the texture |
| image <level> bound to <target> has internal format |
| COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT. |
| |
| INVALID_OPERATION is generated by CompressedTexSubImage2D if |
| <format> is COMPRESSED_SRGB_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 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 TexImage2D and TexSubImage2D if |
| texture has internal format COMPRESSED_SRGB_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT and any of the following apply: |
| |
| * <xoffset> or <yoffset> are not multiples of 4 |
| |
| * <width> is not a multiple of 4 and <xoffset> + <width> is not equal |
| to the width of the LOD |
| |
| * if <height> is not a multiple of 4 and <yoffset> + <height> is not |
| equal to the height of the LOD |
| |
| Errors for OpenGL ES 3.0.4 Specification |
| |
| INVALID_OPERATION is generated by CopyTexSubImage2D / CopyTexSubImage3D if |
| the texture image <level> bound to <target> has internal format |
| COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT. |
| |
| INVALID_OPERATION is generated by CompressedTexSubImage2D / |
| CompressedTexSubImage3D if <format> is COMPRESSED_SRGB_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 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 TexSubImage2D/TexSubImage3D if texture |
| has internal format COMPRESSED_SRGB_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, |
| or COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT and <format> is not RGB or RGBA, or |
| any of the following apply: |
| |
| * <xoffset> or <yoffset> are not multiples of 4 |
| |
| * <width> is not a multiple of 4 and <xoffset> + <width> is not equal |
| to the width of the LOD |
| |
| * if <height> is not a multiple of 4 and <yoffset> + <height> is not |
| equal to the height of the LOD |
| |
| New State for OpenGL ES 2.0.25 and 3.0.2 Specifications |
| |
| The queries for NUM_COMPRESSED_TEXTURE_FORMATS and |
| COMPRESSED_TEXTURE_FORMATS include COMPRESSED_SRGB_S3TC_DXT1_EXT, |
| COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, |
| and COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT. |
| |
| New Implementation Dependent State |
| |
| None |
| |
| Issues |
| |
| (1) Should this be an extension for OpenGL too? |
| |
| sRGB DXT formats are already exposed through OpenGL EXT_texture_sRGB |
| extension. |
| |
| RESOLVED: No |
| |
| (2) Can we use the new compression formats with TexImage2D/TexImage3D? |
| |
| EXT_texture_compression_s3tc supports DXT formats as internalformat of |
| TexImage2D and TexImage3D hence this extension should follow this |
| precedent. |
| |
| RESOLVED: Yes |
| |
| Revision History |
| |
| 2016-10-01 - criccio |
| + Fixed missing formats in Section 3.8.3 |
| |
| 2016-09-30 - criccio |
| + Added issue 2 |
| |
| 2016-09-10 - criccio |
| + Initial draft |