Name

    ARB_texture_compression_rgtc

Name Strings

    GL_ARB_texture_compression_rgtc

Contributors

    Mark J. Kilgard, NVIDIA
    Pat Brown, NVIDIA
    Yanjun Zhang, S3
    Attila Barsi, Holografika

Contact

    Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)

Notice

    Copyright (c) 2008-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Approved by the ARB on July 11, 2008

Version

    Last Modified Date: January 27, 2015
    Revision: 1.7

Number

    ARB Extension #52

Dependencies

    OpenGL 1.3 or ARB_texture_compression required

    This extension is written against the OpenGL 2.0 (September 7,
    2004) specification.

    This extension interacts with OpenGL 2.0 and ARB_texture_non_power_of_two.

Overview

    This extension introduces four new block-based texture compression
    formats suited for unsigned and signed red and red-green textures
    (hence the name "rgtc" for Red-Green Texture Compression).

    These formats are designed to reduce the storage requirements
    and memory bandwidth required for red and red-green textures by
    a factor of 2-to-1 over conventional uncompressed luminance and
    luminance-alpha textures with 8-bit components (GL_LUMINANCE8 and
    GL_LUMINANCE8_ALPHA8).

    The compressed signed red-green format is reasonably suited for
    storing compressed normal maps.

    This extension uses the same compression format as the
    EXT_texture_compression_latc extension except the color data is stored
    in the red and green components rather than luminance and alpha.
    Representing compressed red and green components is consistent with
    the BC4 and BC5 compressed formats supported by DirectX 10.

New Procedures and Functions

    None.

New Tokens

    Accepted by the <internalformat> parameter of TexImage2D,
    CopyTexImage2D, and CompressedTexImage2D and the <format> parameter
    of CompressedTexSubImage2D:

        COMPRESSED_RED_RGTC1                       0x8DBB
        COMPRESSED_SIGNED_RED_RGTC1                0x8DBC
        COMPRESSED_RG_RGTC2                        0x8DBD
        COMPRESSED_SIGNED_RG_RGTC2                 0x8DBE

Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation)

    None.

Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)

 -- Section 3.8.1, Texture Image Specification

    Add to Table 3.17 (page 155):  Specific compressed internal formats

        Compressed Internal Format              Base Internal Format
        ---------------------------------       --------------------
        COMPRESSED_RED_RGTC1                    RED
        COMPRESSED_SIGNED_RED_RGTC1             RED
        COMPRESSED_RG_RGTC2                     RG
        COMPRESSED_SIGNED_RG_RGTC2              RG

 -- Section 3.8.2, Alternative Texture Image Specification Commands

    Add to the end of the section (page 163):

    "If the internal format of the texture image
    being modified is COMPRESSED_RED_RGTC1,
    COMPRESSED_SIGNED_RED_RGTC1, COMPRESSED_RG_RGTC2,
    or COMPRESSED_SIGNED_RG_RGTC2, the texture is stored
    using one of the two RGTC compressed texture image encodings (see
    appendix).  Such images are easily edited along 4x4 texel boundaries,
    so the limitations on TexSubImage2D or CopyTexSubImage2D parameters
    are relaxed.  TexSubImage2D and CopyTexSubImage2D will result in
    an INVALID_OPERATION error only if one of the following conditions
    occurs:

        * <width> is not a multiple of four, <width> plus <xoffset> is not
          equal to TEXTURE_WIDTH, and either <xoffset> or <yoffset> is
          non-zero;

        * <height> is not a multiple of four, <height> plus <yoffset> is not
          equal to TEXTURE_HEIGHT, and either <xoffset> or <yoffset> is
          non-zero; or

        * <xoffset> or <yoffset> is not a multiple of four.

    The contents of any 4x4 block of texels of an RGTC compressed texture
    image that does not intersect the area being modified are preserved
    during valid TexSubImage2D and CopyTexSubImage2D calls."

 -- Section 3.8.3, Compressed Texture Images

    Add after the 4th paragraph (page 164) at the end of the
    CompressedTexImage discussion:

    "If <internalformat> is COMPRESSED_RED_RGTC1,
    COMPRESSED_SIGNED_RED_RGTC1, COMPRESSED_RG_RGTC2,
    or COMPRESSED_SIGNED_RG_RGTC2, the compressed texture is
    stored using one of several RGTC compressed texture image formats.
    The RGTC texture compression algorithm supports only 2D images
    without borders.  CompressedTexImage1D and CompressedTexImage3D
    produce an INVALID_ENUM error if <internalformat> is an RGTC format.
    CompressedTexImage2D will produce an INVALID_OPERATION error if
    <border> is non-zero.

    Add to the end of the section (page 166) at the end of the
    CompressedTexSubImage discussion:

    "If the internal format of the texture image
    being modified is COMPRESSED_RED_RGTC1,
    COMPRESSED_SIGNED_RED_RGTC1, COMPRESSED_RG_RGTC2,
    or COMPRESSED_SIGNED_RG_RGTC2, the texture is stored
    using one of the several RGTC compressed texture image formats.
    Since the RGTC texture compression algorithm supports only 2D images,
    CompressedTexSubImage1D and CompressedTexSubImage3D produce an
    INVALID_ENUM error if <format> is an RGTC format.  Since RGTC images
    are easily edited along 4x4 texel boundaries, the limitations on
    CompressedTexSubImage2D are relaxed.  CompressedTexSubImage2D will
    result in an INVALID_OPERATION error only 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.

    The contents of any 4x4 block of texels of an RGTC compressed texture
    image that does not intersect the area being modified are preserved
    during valid TexSubImage2D and CopyTexSubImage2D calls."

 -- Section 3.8.8, Texture Minification

    Add a sentence to the last paragraph (page 174) just prior to the
    "Mipmapping" subheading:

    "If the texture's internal format lacks components that exist in
    the texture's base internal format, such components are considered
    zero when the texture border color is sampled.  (So despite the
    RGB base internal format of the COMPRESSED_RED_RGTC1 and
    COMPRESSED_SIGNED_RED_RGTC1 formats, the green and blue
    components of the texture border color are always considered
    zero.  Likewise for the COMPRESSED_RG_RGTC2, and
    COMPRESSED_SIGNED_RG_RGTC2 formats, the blue component
    is always considered zero.)"

Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment
Operations and the Frame Buffer)

    None.

Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions)

    None.

Additions to Chapter 6 of the OpenGL 2.0 Specification (State and
State Requests)

    None.

Additions to Appendix A of the OpenGL 2.0 Specification (Invariance)

    None.

Additions to the AGL/GLX/WGL Specifications

    None.

GLX Protocol

    None.

Dependencies on ARB_texture_compression

    If ARB_texture_compression is supported, all the
    errors and accepted tokens for CompressedTexImage1D,
    CompressedTexImage2D, CompressedTexImage3D, CompressedTexSubImage1D,
    CompressedTexSubImage2D, and CompressedTexSubImage3D also apply
    respectively to the ARB-suffixed CompressedTexImage1DARB,
    CompressedTexImage2DARB, CompressedTexImage3DARB,
    CompressedTexSubImage1DARB, CompressedTexSubImage2DARB, and
    CompressedTexSubImage3DARB.

Dependencies on OpenGL 2.0 or ARB_texture_non_power_of_two

    If OpenGL 2.0 or ARB_texture_non_power_of_two is supported, compressed
    texture images can have sizes that are neither multiples of four nor small
    values like one or two.  The original version of this specification didn't
    allow TexSubImage2D and CompressedTexSubImage2D to update only a portion
    of such images.  The spec has been updated to allow such edits in the
    spirit of the resolution of issue (3) of the EXT_texture_compression_s3tc
    specification.  See the "Implementation Note" section for more details.

Errors

    INVALID_ENUM is generated by CompressedTexImage1D
    or CompressedTexImage3D if <internalformat> is
    COMPRESSED_RED_RGTC1, COMPRESSED_SIGNED_RED_RGTC1,
    COMPRESSED_RG_RGTC2, or
    COMPRESSED_SIGNED_RG_RGTC2.

    INVALID_OPERATION is generated by CompressedTexImage2D
    if <internalformat> is COMPRESSED_RED_RGTC1,
    COMPRESSED_SIGNED_RED_RGTC1, COMPRESSED_RG_RGTC2,
    or COMPRESSED_SIGNED_RG_RGTC2 and <border> is not equal
    to zero.

    INVALID_ENUM is generated by CompressedTexSubImage1D
    or CompressedTexSubImage3D if
    <format> is COMPRESSED_RED_RGTC1,
    COMPRESSED_SIGNED_RED_RGTC1, COMPRESSED_RG_RGTC2,
    or COMPRESSED_SIGNED_RG_RGTC2.

    INVALID_OPERATION is generated by TexSubImage2D or CopyTexSubImage2D if
    TEXTURE_INTERNAL_FORMAT is COMPRESSED_RED_RGTC1,
    COMPRESSED_SIGNED_RED_RGTC1, COMPRESSED_RG_RGTC2, or
    COMPRESSED_SIGNED_RG_RGTC2 and any of the following apply:

        * <width> is not a multiple of four, <width> plus <xoffset> is not
          equal to TEXTURE_WIDTH, and either <xoffset> or <yoffset> is
          non-zero;

        * <height> is not a multiple of four, <height> plus <yoffset> is not
          equal to TEXTURE_HEIGHT, and either <xoffset> or <yoffset> is
          non-zero; or

        * <xoffset> or <yoffset> is not a multiple of four.

    INVALID_OPERATION is generated by CompressedTexSubImage2D if
    TEXTURE_INTERNAL_FORMAT is COMPRESSED_RED_RGTC1,
    COMPRESSED_SIGNED_RED_RGTC1, COMPRESSED_RG_RGTC2, or
    COMPRESSED_SIGNED_RG_RGTC2 and any of the following apply:

        * <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.

    The following restrictions from the ARB_texture_compression
    specification do not apply to RGTC texture formats, since subimage
    modification is straightforward as long as the subimage is properly
    aligned.

    DELETE: INVALID_OPERATION is generated by TexSubImage1D, TexSubImage2D,
    DELETE: TexSubImage3D, CopyTexSubImage1D, CopyTexSubImage2D, or
    DELETE: CopyTexSubImage3D if the internal format of the texture image is
    DELETE: compressed and <xoffset>, <yoffset>, or <zoffset> does not equal
    DELETE: -b, where b is value of TEXTURE_BORDER.

    DELETE: INVALID_VALUE is generated by CompressedTexSubImage1D,
    DELETE: CompressedTexSubImage2D, or CompressedTexSubImage3D if the
    DELETE: entire texture image is not being edited:  if <xoffset>,
    DELETE: <yoffset>, or <zoffset> is greater than -b, <xoffset> + <width> is
    DELETE: less than w+b, <yoffset> + <height> is less than h+b, or <zoffset>
    DELETE: + <depth> is less than d+b, where b is the value of
    DELETE: TEXTURE_BORDER, w is the value of TEXTURE_WIDTH, h is the value of
    DELETE: TEXTURE_HEIGHT, and d is the value of TEXTURE_DEPTH.

    See also errors in the GL_ARB_texture_compression specification.

New State

    4 new state values are added for the per-texture object
    GL_TEXTURE_INTERNAL_FORMAT state.

    In the "Textures" state table( page 278), increment the
    TEXTURE_INTERNAL_FORMAT subscript for Z by 4 in the "Type" row.

    [NOTE: The OpenGL 2.0 specification actually should read "n x Z48*"
    because of the 6 generic compressed internal formats in table 3.18.]

New Implementation Dependent State

    None

Appendix

    RGTC Compressed Texture Image Formats

    Compressed texture images stored using the RGTC compressed image
    encodings 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 RGTC 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 RGTC image with a width of <w>, height of <h>, and block
    size of <blocksize> (8 or 16 bytes) is decoded, the corresponding
    image size (in bytes) is:

        ceil(<w>/4) * ceil(<h>/4) * blocksize.

    When decoding an RGTC image, the block containing the texel at offset
    (<x>, <y>) begins at an offset (in bytes) relative to the base of the
    image of:

        blocksize * (ceil(<w>/4) * floor(<y>/4) + floor(<x>/4)).

    The data corresponding to a specific texel (<x>, <y>) are extracted
    from a 4x4 texel block using a relative (x,y) value of

        (<x> modulo 4, <y> modulo 4).

    There are four distinct RGTC image formats:


    COMPRESSED_RED_RGTC1:  Each 4x4 block of texels consists of
    64 bits of unsigned red image data.

    Each red image data block is encoded as a sequence of 8 bytes, called
    (in order of increasing address):

            red0, red1, bits_0, bits_1, bits_2, bits_3, bits_4, bits_5

        The 6 "bits_*" bytes of the block are decoded into a 48-bit bit
        vector:

            bits   = bits_0 +
                     256 * (bits_1 +
                            256 * (bits_2 +
                                   256 * (bits_3 +
                                          256 * (bits_4 +
                                                 256 * bits_5))))

        red0 and red1 are 8-bit unsigned integers that are unpacked to red
        values RED0 and RED1 as though they were pixels with a <format>
        of LUMINANCE and a type of UNSIGNED_BTYE.

        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 red value R for a texel at location (x,y) in the block is
        given by:

            RED0,              if red0 > red1 and code(x,y) == 0
            RED1,              if red0 > red1 and code(x,y) == 1
            (6*RED0+  RED1)/7, if red0 > red1 and code(x,y) == 2
            (5*RED0+2*RED1)/7, if red0 > red1 and code(x,y) == 3
            (4*RED0+3*RED1)/7, if red0 > red1 and code(x,y) == 4
            (3*RED0+4*RED1)/7, if red0 > red1 and code(x,y) == 5
            (2*RED0+5*RED1)/7, if red0 > red1 and code(x,y) == 6
            (  RED0+6*RED1)/7, if red0 > red1 and code(x,y) == 7

            RED0,              if red0 <= red1 and code(x,y) == 0
            RED1,              if red0 <= red1 and code(x,y) == 1
            (4*RED0+  RED1)/5, if red0 <= red1 and code(x,y) == 2
            (3*RED0+2*RED1)/5, if red0 <= red1 and code(x,y) == 3
            (2*RED0+3*RED1)/5, if red0 <= red1 and code(x,y) == 4
            (  RED0+4*RED1)/5, if red0 <= red1 and code(x,y) == 5
            MINRED,            if red0 <= red1 and code(x,y) == 6
            MAXRED,            if red0 <= red1 and code(x,y) == 7

        MINRED and MAXRED are 0.0 and 1.0 respectively.

    Since the decoded texel has a red format, the resulting RGBA value
    for the texel is (R,0,0,1).


    COMPRESSED_SIGNED_RED_RGTC1:  Each 4x4 block of texels consists of
    64 bits of signed red image data.  The red values of a texel are
    extracted in the same way as COMPRESSED_RED_RGTC1 except red0, red1,
    RED0, RED1, MINRED, and MAXRED are signed values defined as follows:

        red0 and red1 are 8-bit signed (two's complement) integers.

               { red0 / 127.0, red0 > -128
        RED0 = {
               { -1.0,         red0 == -128

               { red1 / 127.0, red1 > -128
        RED1 = {
               { -1.0,         red1 == -128

        MINRED = -1.0

        MAXRED =  1.0

    CAVEAT for signed red0 and red1 values: the expressions "red0 >
    red1" and "red0 <= red1" above are considered undefined (read: may
    vary by implementation) when red0 equals -127 and red1 equals -128,
    This is because if red0 were remapped to -127 prior to the comparison
    to reduce the latency of a hardware decompressor, the expressions
    would reverse their logic.  Encoders for the signed LA formats should
    avoid encoding blocks where red0 equals -127 and red1 equals -128.


    COMPRESSED_RG_RGTC2:  Each 4x4 block of texels consists of
    64 bits of compressed unsigned red image data followed by 64 bits
    of compressed unsigned green image data.

    The first 64 bits of compressed red are decoded exactly like
    COMPRESSED_RED_RGTC1 above.

    The second 64 bits of compressed green are decoded exactly like
    COMPRESSED_RED_RGTC1 above except the decoded value R for this
    second block is considered the resulting green value G.

    Since the decoded texel has a red-green format, the resulting RGBA
    value for the texel is (R,G,0,1).


    COMPRESSED_SIGNED_RG_RGTC2:  Each 4x4 block of texels consists
    of 64 bits of compressed signed red image data followed by 64 bits
    of compressed signed green image data.

    The first 64 bits of compressed red are decoded exactly like
    COMPRESSED_SIGNED_RED_RGTC1 above.

    The second 64 bits of compressed green are decoded exactly like
    COMPRESSED_SIGNED_RED_RGTC1 above except the decoded value R
    for this second block is considered the resulting green value G.

    Since this image has a red-green format, the resulting RGBA value is
    (R,G,0,1).

Issues

    1)  What should these new formats be called?

        RESOLVED: "rgtc" for Red-Green Texture Compression.

    2)  How should the uncompressed and filtered texels be returned by
        texture fetches?

        RESOLVED:  Red values show up as (R,0,0,1) where R is the red
        value, green and blue are forced to 0, and alpha is forced to 1.
        Likewise, red-green values show up as (R,G,0,1) where G is the
        green value.

        Prior extensions such as NV_float_buffer and NV_texture_shader
        have introduced formats such as GL_FLOAT_R_NV and GL_DSDT_NV where
        one- and two-component texture formats show up as (X,0,0,1) or
        (X,Y,0,1) RGBA texels.  The RGTC formats mimic these two-component
        formats.

        The (X,Y,0,1) convention, particularly with signed components,
        is nice for normal maps because a normalized vector can be
        formed by a shader program by computing sqrt(abs(1-X*X-Y*Y))
        for the Z component.

        While GL_RED is a valid external format, core OpenGL provides
        no GL_RG external format.  Applications can either use
        GL_RGB or GL_RGBA and pad out the blue and alpha components,
        or use the two-component GL_LUMINANCE_ALPHA color format and
        use the color matrix functionality to swizzle the luminance and
        alpha values into red and green respectively.

    3)  Should red and red-green compression formats with signed
        components be introduced when the core specification lacked
        uncompressed red and red-green texture formats?

        RESOLVED:  Yes, signed red and red-green compression formats
        should be added.

        Signed red-green formats are suited for compressed normal maps.
        Compressed normal maps may well be the dominant use of this
        extension.

        Unsigned red-green formats require an extra "expand normal"
        operation to convert [0,1] to [-1,+1].  Direct support for signed
        red-green formats avoids this step in a shader program.

    4)  Should there be a mix of signed red and unsigned green or
        vice versa?

        RESOLVED:  No.

        NV_texture_shader provided an internal format
        (GL_SIGNED_RGB_UNSIGNED_ALPHA_NV) with mixed signed and unsigned
        components.  The format saw little usage.  There's no reason to
        think a GL_SIGNED_RED_UNSIGNED_GREEN format would be any more
        useful or popular.

    5)  How are signed integer values mapped to floating-point values?

        RESOLVED:  A signed 8-bit two's complement value X is computed to
        a floating-point value Xf with the formula:

                 { X / 127.0, X > -128
            Xf = {
                 { -1.0,      X == -128

        This conversion means -1, 0, and +1 are all exactly representable,
        however -128 and -127 both map to -1.0.  Mapping -128 to -1.0
        avoids the numerical awkwardness of have a representable value
        slightly more negative than -1.0.

        This conversion is intentionally NOT the "byte" conversion listed
        in Table 2.9 for component conversions.  That conversion says:

            Xf = (2*X + 1) / 255.0

        The Table 2.9 conversion is incapable of exactly representing
        zero.

    6)  How will signed components resulting
        from GL_COMPRESSED_SIGNED_RED_RGTC1 and
        GL_COMPRESSED_SIGNED_RG_RGTC2 texture fetches interact
        with fragment coloring?

        RESOLVED:  The specification language for this extension is silent
        about clamping behavior leaving this to the core specification
        and other extensions.  The clamping or lack of clamping is left
        to the core specification and other extensions.

        For assembly program extensions supporting texture fetches
        (ARB_fragment_program, NV_fragment_program, NV_vertex_program3,
        etc.) or the OpenGL Shading Language, these signed formats will
        appear as expected with unclamped signed components as a result
        of a texture fetch instruction.

        If ARB_color_buffer_float is supported, its clamping controls
        will apply.

        NV_texture_shader extension, if supported, adds support for
        fixed-point textures with signed components and relaxed the
        fixed-function texture environment clamping appropriately.  If the
        NV_texture_shader extension is supported, its specified behavior
        for the texture environment applies where intermediate values
        are clamped to [-1,1] unless stated otherwise as in the case
        of explicitly clamped to [0,1] for GL_COMBINE.  or clamping the
        linear interpolation weight to [0,1] for GL_DECAL and GL_BLEND.

        Otherwise, the conventional core texture environment clamps
        incoming, intermediate, and output color components to [0,1].

        This implies that the conventional texture environment
        functionality of unextended OpenGL 1.5 or OpenGL 2.0 without
        using GLSL (and with none of the extensions referred to above)
        is unable to make proper use of the signed texture formats added
        by this extension because the conventional texture environment
        requires texture source colors to be clamped to [0,1].  Texture
        filtering of these signed formats would be still signed, but
        negative values generated post-filtering would be clamped to
        zero by the core texture environment functionality.  The
        expectation is clearly that this extension would be co-implemented
        with one of the previously referred to extensions or used with
        GLSL for the new signed formats to be useful.

    7)  Should a specific normal map compression format be added?

        RESOLVED:  No.

        It's probably short-sighted to design a format just for normal
        maps.  Indeed, NV_texture_shader added a GL_SIGNED_HILO_NV
        format with exactly the kind of "hemisphere remap" useful for
        normal maps and the format went basically unused.  Instead,
        this extension provides the mechanism for compressed normal maps
        based on the more conventional red-green format.

        The GL_COMPRESSED_RG_RGTC2 and
        GL_COMPRESSED_SIGNED_RG_RGTC2 formats are sufficient
        for normal maps with additional shader instructions used to
        generate the 3rd component.

    8)  Should uncompressed signed red and red-green formats be added
        by this extension?

        RESOLVED:  No, this extension is focused on just adding compressed
        texture formats.

        The NV_texture_shader extension adds such uncompressed signed
        texture formats.  A distinct multi-vendor extension for signed
        fixed-point texture formats could provide all or a subset of
        the signed fixed-point uncompressed texture formats introduced
        by NV_texture_shader.

    9)  What compression ratios does this extension provide?

        The RGTC1 formats are 8 bytes (64 bits) per 4x4 pixel block.
        A 4x4 block of GL_LUMINANCE8 data requires 16 bytes (1 byte
        per texel).  This is a 2-to-1 compression ratio.

        The RGTC2 formats are 16 bytes (128 bits) per 4x4 pixel block.
        A 4x4 block of GL_LUMINANCE8_ALPHA8 data requires 32 bytes
        (2 bytes per texel).  This is again a 2-to-1 compression ratio.

        In contrast, the comparable compression ratio for the S3TC
        formats is 4-to-1.

        Arguably, the lower compression ratio allows better compression
        quality particularly because the RGTC formats compress each
        component separately.

    10) How do these new formats compare with the existing GL_LUMINANCE4,
        GL_LUMINANCE4_ALPHA4, and GL_LUMINANCE6_ALPHA2 internal formats?

        RESOLVED:  The existing GL_LUMINANCE4, GL_LUMINANCE4_ALPHA4,
        and GL_LUMINANCE6_ALPHA2 internal formats provide a similar
        2-to-1 compression ratio but mandate a uniform quantization
        for all components.  In contrast, this extension provides a
        compression format with 3-bit quantization over a specifiable
        min/max range that can vary per 4x4 texel tile.

        Additionally, many OpenGL implementations do not natively support
        the GL_LUMINANCE4, GL_LUMINANCE4_ALPHA4, and GL_LUMINANCE6_ALPHA2
        internal formats but rather silently promote these formats
        to store 8 bits per component, thereby eliminating any
        storage/bandwidth advantage for these formats.

    11) Does this extension require EXT_texture_compression_s3tc?

        RESOLVED:  No.

        As written, this specification does not rely on wording of the
        EXT_texture_compression_s3tc extension.  For example, certain
        discussion added to Sections 3.8.2 and 3.8.3 is quite similar
        to corresponding EXT_texture_compression_s3tc language.

    12) Should anything be said about the precision of texture filtering
        for these new formats?

        RESOLVED:  No precision requirements are part of the specification
        language since OpenGL extensions typically leave precision
        details to the implementation.

        Realistically, at least 8-bit filtering precision can be expected
        from implementations (and probably more).

    13) Should these formats be allowed to specify 3D texture images
        when NV_texture_compression_vtc is supported?

        RESOLVED: The NV_texture_compression_vtc stacks 4x4 blocks into
        4x4x4 bricks.  It may be more desirable to represent compressed
        3D textures as simply slices of 4x4 blocks.

        However the NV_texture_compression_vtc extension expects data
        passed to the glCompressedTexImage commands to be "bricked"
        rather than blocked slices.

    14) How is the texture border color handled for the blue component
        of an RGTC2 texture and the green and blue components of an
        RGTC1 texture?

        RESOLVED:  The base texture format is RGB for the RGTC1 and
        RGTC2 texture formats.  This would mean table 3.15 would be
        used to determine how the texture border color is interpreted
        and which components are considered.

        However since only red or red/green components exist for the
        RGTC1 and RGTC2 formats, it makes little sense to require
        the blue component be supplied by the texture border color and
        hence be involved (meaningfully only when the border is sampled)
        in texture filtering.

        For this reason, a statement is added to section 3.8.8 says that
        if a texture's internal format lacks components that exist in
        the texture's base internal format, such components contain
        zero (ignoring the texture's corresponding texture border color
        component value) when the texture border color is sampled.

        So the green and blue components of the filtered result of a
        RGTC1 texture are always zero, even when the border is sampled.
        Similarly the blue component of the filtered result of a RGTC2
        texture is always zero, even when the border is sampled.

    15) What should glGetTexLevelParameter return for
        GL_TEXTURE_GREEN_SIZE and GL_TEXTURE_BLUE_SIZE for the RGTC1
        formats?  What should glGetTexLevelParameter return for
        GL_TEXTURE_BLUE_SIZE for the RGTC2 formats?

        RESOLVED:  Zero bits.

        These formats always return 0.0 for these respective components
        and have no bits devoted to these components.

        Returning 8 bits for red size of RGTC1 and the red and green
        sizes of RGTC2 makes sense because that's the maximum potential
        precision for the uncompressed texels.

    16) Should the token names contain R and RG or RED and RED_GREEN?

        RESOLVED:  RED and RG. See issue #3 in the ARB_texture_rg
        specification.

    17) Can you use the GL_RED external format with glTexImage2D and other
        such commands to load textures with the
        GL_COMPRESSED_RED_RGTC1 or GL_COMPRESSED_SIGNED_RED_RGTC1
        internal formats?

        RESOLVED: Yes.

        GL_RED has been a valid external format parameter to glTexImage
        and similar commands since OpenGL 1.0.

    18) Should any of the generic compression GL_COMPRESSED_* tokens in
        OpenGL 2.1 map to RGTC formats?

        RESOLVED:  No.  The RGTC formats are missing color components
        so are not adequate implementations for any of the generic
        compression formats.

    19) Should the GL_NUM_COMPRESSED_TEXTURE_FORMATS and
        GL_COMPRESSED_TEXTURE_FORMATS queries return the RGTC formats?

        RESOLVED:  No.

        The OpenGL 2.1 specification says "The only values returned
        by this query [GL_COMPRESSED_TEXTURE_FORMATS"] are those
        corresponding to formats suitable for general-purpose usage.
        The renderer will not enumerate formats with restrictions that
        need to be specifically understood prior to use."

        Compressed textures with just red or red-green components are
        not general-purpose so should not be returned by these queries
        because they have restrictions.

        Applications that seek to use the RGTC formats should do so
        by looking for this extension's name in the string returned by
        glGetString(GL_EXTENSIONS) rather than
        what GL_NUM_COMPRESSED_TEXTURE_FORMATS and
        GL_COMPRESSED_TEXTURE_FORMATS return.

    20) Why don't the new tokens and entry points in this extension have
        "ARB" suffixes like other ARB extensions?

        RESOLVED: Unlike most ARB extensions, this is a strict subset
        of functionality already approved in OpenGL 3.0. This extension
        exists only to support that functionality on older hardware that
        cannot implement a full OpenGL 3.0 driver. Since there are no
        possible behavior changes between the ARB extension and core
        features, source code compatibility is improved by not using
        suffixes on the extension.

Implementation Note

    This extension allows TexSubImage2D and CompressedTexSubImage2D to perform
    partial updates to compressed images, but generally requires that the
    updated area be aligned to 4x4 block boundaries.  If the width or height
    is not a multiple of four, there will be 4x4 blocks at the edge of the
    image that contain "extra" texels that are not part of the image.  This
    spec has an exception allowing edits that partially cover such blocks as
    long as the edit covers all texels in the block belonging to the image.
    For example, in a 2D texture of size 70x50, it is legal to update the
    single partial block covering the four texels from (68,48) to (69,49) by
    setting (<xoffset>, <yoffset>) to (68,48) and <width> and <height> to 2.

    This specification derived some of its language from the
    EXT_texture_compression_s3tc specification.  When that extension was
    originally written, non-bordered textures were required to have widths and
    heights that were powers of two.  Therefore, the only cases where partial
    blocks could occur were if the width or height of the texture image was
    one or two.  The original spec language allowed partial block edits only
    if the width or height of the region edited was equal to the full texture
    size.  That language didn't handle cases such as the 70x50 example above.

    This specification was updated in May, 2009 to allow such edits.
    Multiple OpenGL implementers correctly implemented the original
    restriction, and partial edits that include partially covered tiles will
    result in INVALID_OPERATION errors on older drivers.

Revision History

    Revision 1.1, April 24, 2007: mjk
        -  Add caveat about how signed LA decompression happens when
           lum0 equals -127 and lum1 equals -128.  This caveat matches
           a decoding allowance in DirectX 10.

    Revision 1.2, January 21, 2008: mjk
        -  Add issues #18 and #19.

    Revision 1.3, June 30, 2008: js
        - trivial conversion to ARB from EXT

    Revision 1.4, August 7, 2008: jleech
        - Remove ARB suffixes.

    Revision 1.5, May 29, 2009: jleech
        - Sync with pbrown's fixes to the EXT version of this extension:
          Add interaction with non-power-of-two textures from OpenGL 2.0
          / ARB_texture_non_power_of_two. Allow CompressedTexSubImage2D
          to perform edits that include partial tiles at the edge of the
          image as long as the specified width/height parameters line up
          with the edge. Thanks to Emil Persson for finding this issue.

    Revision 1.6, April 17, 2014: jleech
        - Fix table 3.17 so base type for COMRPESSED*RG_RGTC2 formats
          is RG instead of RGB, matching core GL spec (Bug 7812).

    Revision 1.7, January 27, 2015: jleech
        - Fix table 3.17 so base type for COMRPESSED*RED_RGTC1 formats 
          is RED instead of RGB, matching core GL spec (Bug 13260).
