Name

    ARB_texture_rg

Name Strings

    GL_ARB_texture_rg

Contributors

    Daniel Koch, TransGaming, Inc.
    Jon Leech, Khronos

Contact

    Daniel Koch, TransGaming, Inc. (daniel 'at' transgaming.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: May 28, 2009
    Author Revision: 6

Number

    ARB Extension #53

Dependencies

    OpenGL 1.1 is required.

    This extension is written against the OpenGL 2.1 Specification.

    EXT_texture_integer affects the definition of this extension.

    ARB_texture_float affects the definition of this extension.

    EXT_packed_depth_stencil affects the definition of this extension.

    This extension interacts with ARB_framebuffer_object and
    EXT_framebuffer_object.

    This extension is subsumed by OpenGL 3.0.

Overview

    Historically one- and two- component textures have been specified in OpenGL
    using the intensity, luminance or luminance-alpha (I/L/LA) formats.
    With the advent of programmable shaders and render-to-texture capabilites
    these legacy formats carry some historical artifacts which are no longer
    useful.

    For example, when sampling from such textures, the luminance values
    are replicated across the color components, and the intensity values are
    replicated across both the color and alpha components. This is no
    longer necessary with programmable shaders.

    It is also desirable to be able to render to one- and two-
    component format textures using capabilities such as framebuffer
    objects (FBO), but rendering to I/L/LA formats is under-specified
    (specifically how to map R/G/B/A values to I/L/A texture channels).

    This extension adds new base internal formats for the one-component RED
    and two-component RG (red green) texture formats as well as sized
    internal formats for fixed-point, floating-point and pure integer texture
    formats. The new texure formats can be used for texturing as well
    as for rendering into with framebuffer objects.

IP Status

    No known IP claims.

New Tokens

    Accepted by the <internalFormat> parameter of TexImage1D, TexImage2D,
    TexImage3D, CopyTexImage1D, and CopyTexImage2D:

        R8                      0x8229
        R16                     0x822A

        RG8                     0x822B
        RG16                    0x822C

        R16F                    0x822D
        R32F                    0x822E

        RG16F                   0x822F
        RG32F                   0x8230

        R8I                     0x8231
        R8UI                    0x8232
        R16I                    0x8233
        R16UI                   0x8234
        R32I                    0x8235
        R32UI                   0x8236

        RG8I                    0x8237
        RG8UI                   0x8238
        RG16I                   0x8239
        RG16UI                  0x823A
        RG32I                   0x823B
        RG32UI                  0x823C

        RED                     0x1903
        RG                      0x8227

        COMPRESSED_RED          0x8225
        COMPRESSED_RG           0x8226

    Accepted by the <format> parameter of TexImage1D, TexImage2D,
    TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D,
    and ReadPixels:

        RG                      0x8227
        RG_INTEGER              0x8228

    Accepted by the <format> parameter of DrawPixels:

        RG                      0x8227

    Accepted by the <param> parameter of the TexParameter{if}*
    functions when <pname> is DEPTH_TEXTURE_MODE:

        RED                     0x1903

    Accepted by the <format> parameter of GetTexImage:

        RG                      0x8227
        RG_INTEGER              0x8228


New Procedures and Functions

    None

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

    None

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

    Modify section 3.6.3 "Pixel Transfer Modes", the "Color Table Specification"
    subsection and in the third paragraph of the definition of ColorTable modify
    the last sentence to read:

    "internalformat must be one of the formats in table 3.15 or table 3.16,
    with the exception of the RED, RG and DEPTH_COMPONENT base and sized
    internal formats."

    (Add the following to Table 3.6: "DrawPixels and ReadPixels formats",
     as modified by EXT_texture_integer)

    Format Name     Element Meaning and Order      Target Buffer
    -----------     -------------------------      -------------
    RG              R, G                           Color
    RG_INTEGER      iR, iG                         Color

    (Add the following to Table 3.15: "Conversion from RGBA and depth
    pixel components to internal texture, table, or filter components")

    Base Internal Format  RGBA and Depth Values   Internal Components
    --------------------  ---------------------   -------------------
    RED                   R                       R
    RG                    R,G                     R,G

    (Add the following to Table 3.16: "Correspondence of sized internal
    formats to base internal formats, and desired component resolutions
    for each sized internal format", as modified by ARB_texture_float and
    ARB_texture_integer)

    Sized           Base              R    G    B    A    L    I    D
    Internal Format Internal Format  bits bits bits bits bits bits bits
    --------------- ---------------  ---- ---- ---- ---- ---- ---- ----
    R8              RED              8
    R16             RED              16
    RG8             RG               8    8
    RG16            RG               16   16
    R16F            RED              f16
    R32F            RED              f32
    RG16F           RG               f16  f16
    RG32F           RG               f32  f32
    R8I             RED              i8
    R8UI            RED              ui8
    R16I            RED              i16
    R16UI           RED              ui16
    R32I            RED              i32
    R32UI           RED              ui32
    RG8I            RG               i8   i8
    RG8UI           RG               ui8  ui8
    RG16I           RG               i16  i16
    RG16UI          RG               ui16 ui16
    RG32I           RG               i32  i32
    RG32UI          RG               ui32 ui32

    (Add the following to Table 3.17: "Generic and specific compressed
    internal formats")

    Compressed Internal Format      Base Internal Format    Type
    --------------------------      --------------------    ---------
    COMPRESSED_RED                  RED                     Generic
    COMPRESSED_RG                   RG                      Generic

    (Modify Table 3.18: "Texure parameters and their values")

    Add RED to the "Legal Values" column for the row containing the
    definition of DEPTH_TEXTURE_MODE.

    Modify the first sentence of section 3.8.5 "Depth Component Textures"
    (as modified by EXT_packed_depth_stencil or ARB_framebuffer_object) to read:

    "Depth textures and the depth components of depth/stencil textures can
     be treated as RED, LUMINANCE, INTENSITY or ALPHA textures during texture
     filtering and application."

    (Add the following to Table 3.20: "Correspondence of filtered texture
     components to texture source components.")

    Texture Base        Texture source color
    Internal Format     C_s             A_s
    ---------------     -------------   ------
    RED                 (R_t, 0, 0)     1
    RG                  (R_t, G_t, 0)   1

    (Modify Table 3.21: "Texture functions REPLACE, MODULATE and DECAL.")

    Add RED and RG to the "Texture Base Internal Format" column for the
    row which defines the behaviour for RGB (or 3).

    (Modify Table 3.22: "Texture functions BLEND and ADD.")

    Add RED and RG to the "Texture Base Internal Format" column for the
    row which defines the behaviour for RGB (or 3).

    Modify Section 3.8.14 "Texture Comparision Modes", the "Depth Texture
    Comparision Mode" subsection, and change the second to last paragraph
    to read:

    "The resulting r is assigned to R_t, L_t, I_t, or A_t if the value of the
    DEPTH_TEXTURE_MODE is respectively RED, LUMINANCE, INTENSITY, or ALPHA."

Additions to Chapter 4 of the OpenGL 2.1 Specification (Per-Fragment Operations
and the Framebuffer)

    In section 4.3.2 "Reading Pixels" the subsection "Obtaining Pixels from
    the framebuffer", modify the first sentence of the 3rd paragraph in the
    definition of ReadBuffer to read:

    "If the GL is in RGBA mode, and format is one of RED, GREEN, BLUE, ALPHA,
    RG, RGB, RGBA, BGR, BGRA, LUMINANCE, or LUMINANCE_ALPHA, then red,
    green, blue, and alpha values are obtained from the selected buffer at
    each pixel location."

    In subsection "Placement in Pixel Pack Buffer or Client Memory," modify
    the second to last sentence to read:

    "Likewise if the format is RG, LUMINANCE_ALPHA, RGB, BGR, only the
    corresponding two or three elements are written."

    In section 4.4.4 "Framebuffer Completeness" as added by
    EXT_framebuffer_object or ARB_framebuffer_object, modify the first bullet
    point and add RED and RG to the list of base internal formats which
    are color-renderable.

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

    None

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

    Modify section 6.1.4 "Texture Queries". Change the second sentence of the
    second paragraph to read:

    "Calling GetTexImage with a color format (one of RED, GREEN, BLUE, ALPHA,
    RG, RGB, BGR, RGBA, BGRA, LUMINANCE, LUMINANCE_ALPHA, or one of the
    *_INTEGER variants) when the base internal format of the texture image is
    not a color format; with a format of DEPTH_COMPONENT when the base internal
    format is not DEPTH_COMPONENT or DEPTH_STENCIL; with a format of
    DEPTH_STENCIL when the base internal format is not DEPTH_STENCIL; with an
    *_INTEGER format when the base internal format is not one of the integral
    types; or with non-integer format when the base internal is an integral
    type, causes the error INVALID_OPERATION."

    (Add the following to Table 6.1: "Texture, table, and filter return values")

    Base Internal Format    R    G   B   A
    --------------------  ---- ----- --- ---
    RED                    R_i   0    0   1
    RG                     R_i   G_i  0   1

Dependencies on EXT_packed_depth_stencil

    If EXT_packed_depth_stencil is not supported then delete any reference to
    depth/stencil textures (unless ARB_framebuffer_objects is supported).

Dependencies on EXT_framebuffer_object

    If EXT_framebuffer_object is not supported then delete any reference to
    framebuffer objects (unless ARB_framebuffer_objects is supported).

Dependencies on ARB_framebuffer_object

    If ARB_framebuffer_object is not supported:
     * delete any reference to depth/stencil textures
       (unless EXT_packed_depth_stencil is supported).
     * delete any reference to framebuffer objects
       (unless EXT_framebuffer_object is supported).

Dependencies on EXT_texture_integer

    If EXT_texture_integer is not supported:
     * delete any reference to the R*I*, R*UI* and *INTEGER* formats.

Dependencies on ARB_texture_float

    If ARB_texture_float is not supported:
     * delete any reference to the R*F* formats.

Issues

    1) What should this extension be called? ARB_rg_formats, ARB_rg_texture,
       ARB_texture_rg, etc

        DECIDED. Using ARB_texture_rg.

    2) Why use RED token used instead of just "R"?

       a) there is already some precedent for using RED for single-component
          images
       b) the "R" token is already used for texcoord generation, and it is
          less confusing if we don't reuse it.

     3) Why use RG instead of REDGREEN?

        The list {RED, RG, RGB, RGBA} is more visually appealing than
        {RED, REDGREEN, RGB, RGBA}.

     4) 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.

     5) What are the default values for the unspecified channels if you sampled
        from an R or RG texture?  Is it (r,0,0,1) or (r,1,1,1).

        CLARIFICATION: As per OpenGL defaults as specified in Table 3.20
        (as modified by this extension) the default values for unspecified
        components are (r,0,0,1).  Note that this does differ from D3D where
        unspecified values would be filled in as (r,1,1,1).

     6) Are the RG formats accepted by the imaging subset of functions?

        RESOLUTION: NO. This extension does not add RG support to the functions
        defined in the imaging subset (that is: [Get]Color[Sub]Table,
        [Get]ConvolutionFilter, [Get]SeparableFilter, GetHistogram, GetMinMax)
        as it is felt that there is little benefit in doing so. This could be
        added as a separate extension if desired.

Revision History

    #6 May 28, 2008, jleech
        - Remove extraneous *_INTEGER formats from table 6.1
    #5 April 8, 2008, dgkoch
        - Address issues raised in Bug 4163
          - clarify that RG_INTEGER is not allowed for DrawPixels
          - added issue 6) and clarify that support for RED and RG formats
            is not added to the imaging subset
          - GetTexImage supports RG (but no conversion)
    #4 November 14, 2008, dgkoch
        - marked issue 1) as resolved.
        - add issue 5) as clarification
        - Better compatibility with GL 3.0 spec
          - allow unsized RED and RG formats as internal formats (Bug 4161)
          - add enums for COMPRESSED_RED/RG and allow as internal formats (Bug 4162)
    #3 August 7, 2008, jleech
        - Remove ARB suffixes.
    #2 June 9, 2008, dgkoch
        - add COMPRESSED_RED/RG generic formats.
        - add CopyTexImage1/2D to list of functions accepting the new
          internalformats.
    #1 June 8, 2008, dgkoch
        - initial version extracted from GL3 core.
