Name NV_texture_compression_s3tc Name Strings GL_NV_texture_compression_s3tc Contributors Contributors to the OpenGL EXT_texture_compression_s3tc extension Greg Roth, NVIDIA Contact Ian Stewart, NVIDIA Corporation (istewart 'at' nvidia.com) Status Complete. Version Last Modifed Date: Sep 27, 2012 NVIDIA Revision: 1 Number OpenGL ES Extension #128 Dependencies This extension is written against the OpenGL ES 2.0.25 Specification. This extension interacts with NV_texture_array Overview This extension adds support for S3's S3TC texture compression formats, including DXT1, DXT3, and DXT5. For the DXT1 format, this specification supports an RGB-only mode and a special RGBA mode with single-bit alpha. 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 ES. New Tokens Accepted by the parameter of CompressedTexImage2D and CompressedTexSubImage2D: COMPRESSED_RGB_S3TC_DXT1_NV 0x83F0 COMPRESSED_RGBA_S3TC_DXT1_NV 0x83F1 COMPRESSED_RGBA_S3TC_DXT3_NV 0x83F2 COMPRESSED_RGBA_S3TC_DXT5_NV 0x83F3 Additions to Chapter 3 of the OpenGL ES 2.0.25 Specification Modify Section 3.7.3, "Compressed Texture Images" (Replace first two sentences with) Texture images may also be specified or modified using image data already stored in a known compressed image format. The GL defines some specific compressed formats, and others may be defined by GL extensions. (Insert after section describing CompressedTexImage2D) The specific compressed texture formats supported by CompressedTexImage2D, and the corresponding base internal format for each specific format, are defined in table 3.X. Table 3.X: "Specific compressed texture formats" Compressed Internal Formats Base Internal Format =========================== ==================== COMPRESSED_RGB_S3TC_DXT1_NV RGB COMPRESSED_RGBA_S3TC_DXT1_NV RGBA COMPRESSED_RGBA_S3TC_DXT3_NV RGBA COMPRESSED_RGBA_S3TC_DXT5_NV RGBA (Replace last paragraph with) If the internal format is one of COMPRESSED_RGB_S3TC_DXT1_NV, COMPRESSED_RGBA_S3TC_DXT1_NV, COMPRESSED_RGBA_S3TC_DXT3_NV, or COMPRESSED_RGBA_S3TC_DXT5_NV, 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 will result in an INVALID_OPERATION error if one of the following conditions occurs: * is not a multiple of four, and plus is not equal to TEXTURE_WIDTH; * is not a multiple of four, and plus is not equal to TEXTURE_HEIGHT; or * or is not a multiple of four. For any other formats, calling CompressedTexSubImage2D will result in an INVALID_OPERATION error if or is not equal to zero, or if and 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. Interactions with NV_texture_array If NV_texture_array is supported, the S3TC compressed formats may also be used as the internal formats given to CompressedTexImage3DNV and CompressedTexSubImage3DNV. The restrictions for the , , , and parameters of the CompressedTexSubImage2D function when used with S3TC compressed texture formats, described in this extension, also apply to the identically named parameters of CompressedTexSubImage3DNV. Errors INVALID_OPERATION is generated by CopyTexSubImage2D if the texture image bound to has internal format COMPRESSED_RGB_S3TC_DXT1_NV, COMPRESSED_RGBA_S3TC_DXT1_NV, COMPRESSED_RGBA_S3TC_DXT3_NV, or COMPRESSED_RGBA_S3TC_DXT5_NV. INVALID_OPERATION is generated by CompressedTexSubImage2D if is COMPRESSED_RGB_S3TC_DXT1_NV, COMPRESSED_RGBA_S3TC_DXT1_NV, COMPRESSED_RGBA_S3TC_DXT3_NV, or COMPRESSED_RGBA_S3TC_DXT5_NV and any of the following apply: * is not a multiple of four, and plus is not equal to the texture width; * is not a multiple of four, and plus is not equal to the texture height; or * or is not a multiple of four. New State The queries for NUM_COMPRESSED_TEXTURE_FORMATS and COMPRESSED_TEXTURE_FORMATS include COMPRESSED_RGB_S3TC_DXT1_NV, COMPRESSED_RGBA_S3TC_DXT1_NV, COMPRESSED_RGBA_S3TC_DXT3_NV, and COMPRESSED_RGBA_S3TC_DXT5_NV. Appendix S3TC Compressed Texture Image Formats Compressed texture images stored using the S3TC compressed image formats are represented as a collection of 4x4 texel blocks, where each block contains 64 or 128 bits of texel data. The image is encoded as a normal 2D raster image in which each 4x4 block is treated as a single pixel. If an S3TC image has a width or height that is not a multiple of four, the data corresponding to texels outside the image are irrelevant and undefined. When an S3TC image with a width of , height of , and block size of (8 or 16 bytes) is decoded, the corresponding image size (in bytes) is: ceil(/4) * ceil(/4) * blocksize. When decoding an S3TC image, the block containing the texel at offset (, ) begins at an offset (in bytes) relative to the base of the image of: blocksize * (ceil(/4) * floor(/4) + floor(/4)). The data corresponding to a specific texel (, ) are extracted from a 4x4 texel block using a relative (x,y) value of ( modulo 4, modulo 4). There are four distinct S3TC image formats: COMPRESSED_RGB_S3TC_DXT1_NV: Each 4x4 block of texels consists of 64 bits of RGB image data. Each RGB image data block is encoded as a sequence of 8 bytes, called (in order of increasing address): c0_lo, c0_hi, c1_lo, c1_hi, bits_0, bits_1, bits_2, bits_3 The 8 bytes of the block are decoded into three quantities: color0 = c0_lo + c0_hi * 256 color1 = c1_lo + c1_hi * 256 bits = bits_0 + 256 * (bits_1 + 256 * (bits_2 + 256 * bits_3)) color0 and color1 are 16-bit unsigned integers that are unpacked to RGB colors RGB0 and RGB1 as though they were 16-bit packed pixels with a of RGB and a type of UNSIGNED_SHORT_5_6_5. bits is a 32-bit unsigned integer, from which a two-bit control code is extracted for a texel at location (x,y) in the block using: code(x,y) = bits[2*(4*y+x)+1 .. 2*(4*y+x)+0] where bit 31 is the most significant and bit 0 is the least significant bit. The RGB color for a texel at location (x,y) in the block is given by: RGB0, if color0 > color1 and code(x,y) == 0 RGB1, if color0 > color1 and code(x,y) == 1 (2*RGB0+RGB1)/3, if color0 > color1 and code(x,y) == 2 (RGB0+2*RGB1)/3, if color0 > color1 and code(x,y) == 3 RGB0, if color0 <= color1 and code(x,y) == 0 RGB1, if color0 <= color1 and code(x,y) == 1 (RGB0+RGB1)/2, if color0 <= color1 and code(x,y) == 2 BLACK, if color0 <= color1 and code(x,y) == 3 Arithmetic operations are done per component, and BLACK refers to an RGB color where red, green, and blue are all zero. Since this image has an RGB format, there is no alpha component and the image is considered fully opaque. COMPRESSED_RGBA_S3TC_DXT1_NV: Each 4x4 block of texels consists of 64 bits of RGB image data and minimal alpha information. The RGB components of a texel are extracted in the same way as COMPRESSED_RGB_S3TC_DXT1_NV. The alpha component for a texel at location (x,y) in the block is given by: 0.0, if color0 <= color1 and code(x,y) == 3 1.0, otherwise COMPRESSED_RGBA_S3TC_DXT3_NV: Each 4x4 block of texels consists of 64 bits of uncompressed alpha image data followed by 64 bits of RGB image data. Each RGB image data block is encoded according to the COMPRESSED_RGB_S3TC_DXT1_NV format, with the exception that the two code bits always use the non-transparent encodings. In other words, they are treated as though color0 > color1, regardless of the actual values of color0 and color1. Each alpha image data block is encoded as a sequence of 8 bytes, called (in order of increasing address): a0, a1, a2, a3, a4, a5, a6, a7 The 8 bytes of the block are decoded into one 64-bit integer: alpha = a0 + 256 * (a1 + 256 * (a2 + 256 * (a3 + 256 * (a4 + 256 * (a5 + 256 * (a6 + 256 * a7)))))) alpha is a 64-bit unsigned integer, from which a four-bit alpha value is extracted for a texel at location (x,y) in the block using: alpha(x,y) = bits[4*(4*y+x)+3 .. 4*(4*y+x)+0] where bit 63 is the most significant and bit 0 is the least significant bit. The alpha component for a texel at location (x,y) in the block is given by alpha(x,y) / 15. COMPRESSED_RGBA_S3TC_DXT5_NV: Each 4x4 block of texels consists of 64 bits of compressed alpha image data followed by 64 bits of RGB image data. Each RGB image data block is encoded according to the COMPRESSED_RGB_S3TC_DXT1_NV format, with the exception that the two code bits always use the non-transparent encodings. In other words, they are treated as though color0 > color1, regardless of the actual values of color0 and color1. Each alpha image data block is encoded as a sequence of 8 bytes, called (in order of increasing address): alpha0, alpha1, bits_0, bits_1, bits_2, bits_3, bits_4, bits_5 The alpha0 and alpha1 are 8-bit unsigned bytes converted to alpha components by multiplying by 1/255. The 6 "bits" bytes of the block are decoded into one 48-bit integer: bits = bits_0 + 256 * (bits_1 + 256 * (bits_2 + 256 * (bits_3 + 256 * (bits_4 + 256 * bits_5)))) bits is a 48-bit unsigned integer, from which a three-bit control code is extracted for a texel at location (x,y) in the block using: code(x,y) = bits[3*(4*y+x)+2 .. 3*(4*y+x)+0] where bit 47 is the most significant and bit 0 is the least significant bit. The alpha component for a texel at location (x,y) in the block is given by: alpha0, code(x,y) == 0 alpha1, code(x,y) == 1 (6*alpha0 + 1*alpha1)/7, alpha0 > alpha1 and code(x,y) == 2 (5*alpha0 + 2*alpha1)/7, alpha0 > alpha1 and code(x,y) == 3 (4*alpha0 + 3*alpha1)/7, alpha0 > alpha1 and code(x,y) == 4 (3*alpha0 + 4*alpha1)/7, alpha0 > alpha1 and code(x,y) == 5 (2*alpha0 + 5*alpha1)/7, alpha0 > alpha1 and code(x,y) == 6 (1*alpha0 + 6*alpha1)/7, alpha0 > alpha1 and code(x,y) == 7 (4*alpha0 + 1*alpha1)/5, alpha0 <= alpha1 and code(x,y) == 2 (3*alpha0 + 2*alpha1)/5, alpha0 <= alpha1 and code(x,y) == 3 (2*alpha0 + 3*alpha1)/5, alpha0 <= alpha1 and code(x,y) == 4 (1*alpha0 + 4*alpha1)/5, alpha0 <= alpha1 and code(x,y) == 5 0.0, alpha0 <= alpha1 and code(x,y) == 6 1.0, alpha0 <= alpha1 and code(x,y) == 7 Issues None Revision History Rev. Date Author Changes ---- -------- --------- ------------------------------------- 1 09/27/2012 istewart First revision, based of the EXT_texture_compression_s3tc specification. # vim:ai:ts=4:sts=4:expandtab:textwidth=70