Name

    OES_texture_env_crossbar

Name Strings

    GL_OES_texture_env_crossbar

Contact
    

Notice

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

Status


Version

    Last modified date: May 18, 2005

Number

    OpenGL ES Extension #21    

Dependencies

    OpenGL ES 1.1 is required.

    This extension is based on the ARB_texture_env_crossbar
    extension specification.

Overview

    This extension adds the capability to use the texture color from
    other texture units as sources to the COMBINE enviornment
    function. OpenGL ES 1.1 defined texture combine functions which
    could use the color from the current texture unit as a source. 
    This extension adds the ability to use the color from any texture 
    unit as a source.

Issues

    Please refer to the ARB_texture_env_crossbar extension specification.


New Procedures and Functions

    None

New Tokens

    Accepted by the <params> parameter of TexEnvf, TexEnvi, TexEnvfv,
    and TexEnviv when the <pname> parameter value is SOURCE0_RGB,
    SOURCE1_RGB, SOURCE2_RGB, SOURCE0_ALPHA,
    SOURCE1_ALPHA, or SOURCE2_ALPHA

        TEXTURE<n>                        0x84C0+<n>

    where <n> is in the range 0 to MAX_TEXTURE_UNITS.

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

    None

Additions to Chapter 3 of the GL Specification (Rasterization)

    The arguments Arg0, Arg1 and Arg2 are determined by the values of
    SOURCE<n>_RGB, SOURCE<n>_ALPHA, OPERAND<n>_RGB and
    OPERAND<n>_ALPHA. In the following two tables, Ct and At are
    the filtered texture RGB and alpha values; Ct<n> and At<n> are the
    filtered texture RGB and alpha values from the texture bound to
    texture unit <n>; Cc and Ac are the texture environment RGB and
    alpha values; Cf and Af are the RGB and alpha of the primary color
    of the incoming fragment; and Cp and Ap are the RGB and alpha
    values resulting from the previous texture environment. On texture
    environment 0, Cp and Ap are identical to Cf and Af, respectively.
    The relationship is described in table 3.5 and 3.6 of the OpenGL ES 1.2
    specification.

    Added to table 3.5 of the OpenGL ES 1.2 specification:

        SOURCE<n>_RGB       OPERAND<n>_RGB         Argument
        -------------       --------------         --------

        TEXTURE<n>          SRC_COLOR               Ct<n>
                            ONE_MINUS_SRC_COLOR     (1-Ct<n>)
                            SRC_ALPHA               At<n>
                            ONE_MINUS_SRC_ALPHA     (1-At<n>)

        Table 3.6: COMBINE_RGB texture functions

    Added to table 3.6 of the OpenGL ES 1.2 specification:


        SOURCE<n>_ALPHA     OPERAND<n>_ALPHA       Argument
        ---------------     ----------------       --------

        TEXTURE<n>          SRC_ALPHA               At<n>
                            ONE_MINUS_SRC_ALPHA     (1-At<n>)

        Table 3.6: COMBINE_ALPHA texture functions

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

    None

Additions to Chapter 5 of the GL Specification (Special Functions)

    None

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

    None

Additions to Appendix F of the GL Specification (ARB Extensions)

    Inserted after the second paragraph of F.2.12:

    If the value of TEXTURE_ENV_MODE is COMBINE, the texture
    function associated with a given texture unit is computed using
    the values specified by SOURCE<n>_RGB, SOURCE<n>_ALPHA,
    OPERAND<n>_RGB and OPERAND<n>_ALPHA. If TEXTURE<n> is
    specified as SOURCE<n>_RGB or SOURCE<n>_ALPHA, the texture
    value from texture unit <n> will be used in computing the texture
    function for this texture unit.

    Inserted after the third paragraph of F.2.12:

    If a texture environment for a given texture unit references a
    texture unit that is disabled or does not have a valid texture
    object bound to it, then it is as if texture blending is disabled 
    for the given texture unit. Every texture unit implicitly 
    references the texture object that is bound to it, regardless 
    of the texture function specified by COMBINE_RGB or COMBINE_ALPHA.

Additions to the GLX Specification

    None

GLX Protocol

    None

Errors

    INVALID_ENUM is generated if <params> value for SOURCE0_RGB,
    SOURCE1_RGB, SOURCE2_RGB, SOURCE0_ALPHA,
    SOURCE1_ALPHA or SOURCE2_ALPHA is not one of TEXTURE,
    CONSTANT, PRIMARY_COLOR, PREVIOUS, or TEXTURE<n>,
    where <n> is in the range 0 to MAX_TEXTURE_UNITS.

New State

    None
