Name

    EXT_texture_env

Name Strings

    GL_EXT_texture_env

Version

    $Date: 1998/05/12 23:52:26 $ $Revision: 1.5 $

Number

    146

Dependencies

    OpenGL 1.1 is required.
    OpenGL 1.2 affects the definition of this spec.
    EXT_multitexture affects the definition of this spec.
    This specification is written against the OpenGL 1.2 specification.

Overview

    A new texture environment is defined which supports the
    following equations:

                        Cv = Cf                 COPY
                        Cv = Ct                 REPLACE
                        Cv = Cf * Ct            MODULATE
                        Cv = Cf + Ct            ADD
                        Cv = Cf - Ct            SUBTRACT
                        Cv = Ct - Cf            REVERSE_SUBTRACT
                        Cv = aCf + (1-a)Ct      BLEND
                        Cv = aCt + (1-a)Cf      REVERSE_BLEND
        where a is the incoming fragment's alpha value

    These functions may be independently selected for color and alpha
    processing.  The BLEND function is not available for alpha processing.
    Additionally a scale factor of 2^0, 2^1, or 2^2 may be applied to the final
    result.

Issues

  * The functions are added as a `suite' in a new texture environment.  An
    alternative would be to retrofit them into the existing texture
    environment.  There would likely be a clash with SGIX_texture_add_env
    and with the DECAL/BLEND environment which are similar yet different
    from the new BLEND function.  Also the separate specification of
    the alpha texture function seems awkward, and we specified a new 
    behavior for the new texture environment when texturing is disabled.

  * I chose the name EXT_texture_env as it really is an extension to
    texture environment to add a new environment.  Should it have some
    other name, e.g., EXT_texture_env1?

  * A new enable is defined for TEXTURE_ENV1_EXT which causes it to
    be activated over TEXTURE_ENV.  No enable is defined for TEXTURE_ENV
    as it is considered to be enabled always.  The OpenGL spec uses
    the term 'currently bound environment' should we be doing something
    that looks more bind like or changing the language to something like
    currently selected/enabled environment?

  * There is no constant color term in TEXTURE_ENV1_EXT.  The functionality
    is still available in TEXTURE_ENV and I'm not sure there is a compelling
    reason to integrate the constant term here.

  * The BLEND function is fairly restrictive.  Should it be more general?
    e.g. reverse the blending factor?

    Resolved: YES.  add REVERSE_BLEND.

  * The rules for alpha-only and alpha-less textures are very regular
    the color components of an alpha-only texture are substituted with zero
    and the alpha component of an alpha-less texture is substituted with one.
    Are these the right rules?

  * If texturing is disabled, environment computations are still
    performed in this new texture environment, whereas they are not in the
    old environment (to preserve compatibility).  This sets the stage for
    texture environments performing functions which do not involve a
    texture though perhaps it is a little awkward.

  * Enumerants are screwy.  Should we add new _EXT enumerants for
    COPY, REPLACE, ADD, MODULATE, BLEND, as was done for the original
    texture extension or reuse these existing tokens and just add
    SUBTRACT, REVERSE_SUBTRACT, and REVERSE_BLEND?

    I chose to add new enumerants which are prefixed with ENV_. The
    main reason is to allow them to have contiguous values and leave
    some room for expansion to ensure that they can be switched
    with minimal parameter validation cost.

  * Should a scale & bias be defined as part of this extension or
    as a separate add-on to the environment processing?

  * Possible add-on extensions (in the context of multitexture):

        1) source and blend factor specification for the BLEND/REVERSE_BLEND
           functions by generalizing BLEND/REVERSE_BLEND to 
                x*Cf + y*Ct   /    x*Ct + y*Cf
           and allow x to be specified by TEXTURE_ENV_SRC_FACTOR and
           y by TEXTURE_ENV_DST_FACTOR with possible src and dst factors
           ONE
           ZERO
           FRAGMENT_ALPHA    alpha from previous environment stage
           TEXTURE_ALPHA     alpha from texture
           PRETEXTURE_ALPHA  original pre-texture alpha value
           FRAGMENT_ALPHA_MINUS_ONE
           TEXTURE_ALPHA_MINUS_ONE
           PRETEXTURE_ALPHA_MINUS_ONE
        
        2) Add some muxing to the inputs of the equations.
           The basic equation set is
                Cf            (copy)
                Cf*Ct         (modulate)
                Cf+Ct         (add/sub/rsub)
                a*Cf+(1-a)*Ct (blend/rblend)
            
            so allow a more flexible binding on Cf & Ct
            TEXTURE_ENV_SRC  (default is FRAGMENT)
            TEXTURE_ENV_DST  (default is TEXTURE)
                choices:
                    FRAGMENT
                    TEXTURE
                    PRETEXTURE

         3) extension 2) gives a good chunk of the functionality of 1)
            perhaps we could avoid 1) altogether or change 1) to allow
            a more restrictive selection of the blend factor (simultaneously
            choosing both a and (1-a):

            TEXTURE_ENV_BLEND_FACTOR
                choices:
                    FRAGMENT
                    TEXTURE
                    PRETEXTURE


New Procedures and Functions

    None

New Tokens

    Accepted by the <target> parameter of TexEnvf, TexEnvi, TexEnvfv, TexEnvfi,
    GetTexEnviv, GetTexEnvfv, GetBooleanv, GetIntegerv, GetFloatv, GetDoublev,
    and the <cap> parameter of Enable, Disable, and IsEnabled

    TEXTURE_ENV0_EXT            0x????
    TEXTURE_ENV1_EXT            TEXTURE_ENV0_EXT+1
    <leave room for 14 more environments>

    Accepted by the <pname> parameter of TexEnvf, TexEnvi, TexEnvfv, TexEnvfi,
    GetTexEnviv and GetTexEnvfv when the <target> parameter value is
    TEXTURE_ENV1_EXT

    TEXTURE_ENV_MODE_ALPHA_EXT  0x????


    Accepted by the <params> parameter of TexEnvf, TexEnvi, TexEnvfv, and
    TexEnvfi when the <target> parameter value is TEXTURE_ENV1_EXT and the
    <pname> parameter value is TEXTURE_ENV_MODE or
    TEXTURE_ENV_MODE_ALPHA_EXT

    ENV_COPY_EXT                0x????
    ENV_REPLACE_EXT             0x????
    ENV_MODULATE_EXT            0x????
    ENV_ADD_EXT                 0x????
    ENV_SUBTRACT_EXT            0x????
    ENV_REVERSE_SUBTRACT_EXT    0x????
    ENV_BLEND_EXT               0x????
    ENV_REVERSE_BLEND_EXT       0x????

    Accepted by the <pname> parameter of TexEnvf, TexEnvi, TexEnvfv, 
    TexEnvfi, GetTexEnviv, and GetTexEnvfv

    TEXTURE_ENV_SHIFT_EXT       0x????



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

        None

Additions to Chapter 3 of the GL Specification (Rasterization)




                                Texture Environment 1
                                ----------------------

        Base Texture Format     COPY  REPLACE  MODULATE  ADD
        -------------------     ----  -------  --------  ---

        ALPHA                    Rf     0        Rf*0    Rf+0
                                 Gf     0        Gf*0    Rf+0
                                 Bf     0        Bf*0    Rf+0
                                 Af     At       Af*At   Af+At

        LUMINANCE                Rf     Lt       Rf*Lt   Rf+Lt
                                 Gf     Lt       Gf*Lt   Gf+Lt
                                 Bf     Lt       Bf*Lt   Bf+Lt
                                 Af     1        Af*1    Af+1

        LUMINANCE_ALPHA          Rf     Lt       Rf*Lt   Rf+Lt
                                 Gf     Lt       Gf*Lt   Gf+Lt
                                 Bf     Lt       Bf*Lt   Bf+Lt
                                 Af     At       Af*At   Af+At

        INTENSITY                Rf     It       Rf*It   Rf+It
                                 Gf     It       Gf*It   Gf+It
                                 Bf     It       Bf*It   Bf+It
                                 Af     It       Af*It   Af+It

        RGB                      Rf     Rt       Rf*Rt   Rf+Rt
                                 Gf     Gt       Gf*Gt   Gf+Gt
                                 Bf     Bt       Bf*Bt   Bf+Bt
                                 Af     1        Af*1    Af+1

        RGBA                     Rf     Rt       Rf*Rt   Rf+Rt
                                 Gf     Gt       Gf*Gt   Gf+Gt
                                 Bf     Bt       Bf*Bt   Bf+Bt
                                 Af     At       Af*At   Af+At


        Base Texture Format  SUBTRACT  REVERSE_      BLEND        REVERSE_
                                       SUBTRACT                   BLEND
        -------------------  --------  --------  ---------------  -------------

        ALPHA                Rf-0      0-Rf     Af*Rf+(1-Af)*0   Af*0+(1-Af)*Rf
                             Gf-0      0-Gf     Af*Gf+(1-Af)*0   Af*0+(1-Af)*Gf
                             Bf-0      0-Bf     Af*Bf+(1-Af)*0   Af*0+(1-Af)*Bf
                             Af-At     At-Af    N/A              N/A

        LUMINANCE            Rf-Lt     Lt-Rf    Af*Rf+(1-Af)*Lt  Af*Lt+(1-Af)*Rf
                             Gf-Lt     Lt-Gf    Af*Gf+(1-Af)*Lt  Af*Lt+(1-Af)*Gf
                             Bf-Lt     Lt-Bf    Af*Bf+(1-Af)*Lt  Af*Lt+(1-Af)*Bf
                             Af-1      1-Af     N/A              N/A

        LUMINANCE_ALPHA      Rf-Lt     Lt-Rf    Af*Rf+(1-Af)*Lt  Af*Lt+(1-Af)*Rf
                             Gf-Lt     Lt-Gf    Af*Gf+(1-Af)*Lt  Af*Lt+(1-Af)*Gf
                             Bf-Lt     Lt-Bf    Af*Bf+(1-Af)*Lt  Af*Lt+(1-Af)*Bf
                             Af-At     At-Af    N/A              N/A

        INTENSITY            Rf-It     It-Rf    Af*Rf+(1-Af)*It  Af*It+(1-Af)*Rf
                             Gf-It     It-Gf    Af*Gf+(1-Af)*It  Af*It+(1-Af)*Gf
                             Bf-It     It-Bf    Af*Bf+(1-Af)*It  Af*It+(1-Af)*Bf
                             Af-It     It-Af    N/A              N/A

        RGB                  Rf-Rt     Rt-Rf    Af*Rf+(1-Af)*Rt  Af*Rt+(1-Af)*Rf
                             Gf-Gt     Gt-Gf    Af*Gf+(1-Af)*Gt  Af*Gt+(1-Af)*Gf
                             Bf-Bt     Bt-Bf    Af*Bf+(1-Af)*Bt  Af*Bt+(1-Af)*Bf
                             Af-1      1-Af     N/A              N/A

        RGBA                 Rf-Rt     Rt-Rf    Af*Rf+(1-Af)*Rt  Af*Rt+(1-Af)*Rf
                             Gf-Gt     Gt-Gf    Af*Gf+(1-Af)*Gt  Af*Gt+(1-Af)*Gf
                             Bf-Bt     Bt-Bf    Af*Bf+(1-Af)*Bt  Af*Bt+(1-Af)*Bf
                             Af-At     At-Af    N/A              N/A


        Tables 3.12 and 3.13: Texture functions for TEXTURE_ENV1.

    Section 3.8.5 Texture Environments and Texture Functions


    The command

    void TexEnv{if}( enum target, enum pname, T param ) ;
    void TexEnv{if}v( enum target, enum pname, T params ) ;

    sets parameters of the <texture environment> that specifies how texture
    values are interpreted when texturing a fragment.  <target> must be the
    symbolic constant TEXTURE_ENV0_EXT or TEXTURE_ENV1_EXT.  <pname> is a
    symbolic constant indicating the parameter to be set.  In the first form of
    the command, <param> is a value to which to set a single-valued parameter;
    in the second form, <params> is point to an array of parameters: either a
    single symbolic constant or a value or group of values to which the
    parameter should be set.  The possible environment parameters are
    TEXTURE_ENV_MODE, TEXTURE_ENV_COLOR, and TEXTURE_ENV_COORD_SET_EXT.
    TEXTURE_ENV_MODE may be set to one of REPLACE, MODULATE, DECAL, or BLEND;
    TEXTURE_ENV_COLOR is set to an RGBA color by providing four
    single-precision floating-point values in the range [0,1](values outside
    this range are clamped to it).  If integers are provided for
    TEXTURE_ENV_COLOR, then they are converted to floating-point as specified
    in Table 2.6 for signed integers.  TEXTURE_ENV_COORD_SET_EXT may be set to
    one of TEXTURE0_EXT .. TEXTURE<n>_EXT where <n> is one less than the
    number of supported texture coordinate sets.  If floating-point values
    are supplied, they are rounded to the nearest integer.

        The value of TEXTURE_ENV_MODE specifies a texture function.  The result
    of this function depends on the fragment and the texture array value.  The
    precise form of the function depends on the base internal formats of the
    texture arrays that were last specified.  In the following two
    tables Rf, Gf, Bf, and Af are the color components of the incoming
    fragment; Rt, Gt, Bt, At, Lt, and It are the filtered texture values; Rc,
    Gc, Bc, and Ac are the texture environment color values; and Rv, Gv, Bv,
    and Av are the color components computed by the texture function.  All of
    these color values are in the range [0,1].  The REPLACE and MODULATE
    texture functions are specified in Table 3.10, and the DECAL and BLEND
    texture functions are specified in Table 3.11.

        The value of TEXTURE_ENV_COORD_SET_EXT specifies which set of fragment
    texture coordinates are used to determine the texture value used in the
    texture function.  The same set of texture coordinates may be
    simultaneously used by multiple textures.

        Specifying Enable with a <cap> parameter of TEXTURE_ENV1_EXT selects an
    alternate texture environment with a different set of texture functions.
    When TEXTURE_ENV1_EXT is enabled this environment supersedes texture
    environment zero.

        Specifying TexEnv with a <target> parameter of TEXTURE_ENV1_EXT
    selects the TEXTURE_ENV1_EXT environment for modification.  The possible
    environment parameters for TEXTURE_ENV1_EXT are TEXTURE_ENV_MODE,
    TEXTURE_ENV_MODE_ALPHA_EXT, TEXTURE_ENV_SHIFT_EXT, and
    TEXTURE_ENV_COORD_SET_EXT.  TEXTURE_ENV_MODE may be set to one of
    ENV_COPY_EXT, ENV_REPLACE_EXT, ENV_MODULATE_EXT, ENV_ADD_EXT,
    ENV_SUBTRACT_EXT, ENV_REVERSE_SUBTRACT_EXT, ENV_BLEND_EXT, or
    ENV_REVERSE_BLEND_EXT.  TEXTURE_ENV_MODE_ALPHA_EXT may be set to one of
    ENV_COPY_EXT, ENV_REPLACE_EXT, ENV_MODULATE_EXT, ENV_ADD_EXT,
    ENV_SUBTRACT_EXT, or ENV_REVERSE_SUBTRACT_EXT.  TEXTURE_ENV_SHIFT_EXT is
    set to a four-value integer scale factor by providing four integers in the
    range [0,2].  TEXTURE_ENV_COORD_SET_EXT may be set to one of
    TEXTURE0_EXT .. TEXTURE<n>_EXT where <n> is the one less than the number
    of supported texture coordinate sets. If floating-point values are
    specified for either TEXTURE_ENV_SHIFT_EXT or TEXTURE_ENV_COORD_SET_EXT
    they are rounded to the nearest integer.

        The value TEXTURE_ENV_MODE specifies a texture function for the R, G,
    and B components and the value of TEXTURE_ENV_MODE_ALPHA_EXT specifies a
    texture function for the A component.  The computed color components Rv,
    Gv, Bv, and Av are given by the equations:

            Rv = Rx*(2^Rs),
            Gv = Gx*(2^Gs),
            Bv = Bx*(2^Bs) and
            Av = Ax*(2^As),

    where the functions for Rx, Gx, Bx, and Ax are specified in Tables 3.12
    and 3.13,  and Rs, Gs, Bs, and As are the scaling factors specified with
    TEXTURE_ENV_SHIFT_EXT. The ENV_COPY_EXT, ENV_REPLACE_EXT,
    ENV_MODULATE_EXT, and ENV_ADD_EXT functions are specified in Table 3.12,
    and the ENV_SUBTRACT_EXT, ENV_REVERSE_SUBTRACT_EXT, ENV_BLEND_EXT, and
    ENV_REVERSE_BLEND_EXT functions are specified in Table 3.13.

        The state required for texture environment TEXTURE_ENV0_EXT consists of
    the four-valued integer indicating the texture function, four floating-
    point TEXTURE_ENV_COLOR values and one MAX_TEXTURE_COORD_SETS_EXT-valued
    integer indicating the texture coordinate set binding.  The state required
    for texture environment TEXTURE_ENV1_EXT consists of the seven-valued
    integer indicating the texture function for the R,G, and B components, the
    five-valued integer indicating the texture function for the A component,
    four integer-valued TEXTURE_ENV_SHIFT_EXT values, one bit indicating
    whether TEXTURE_ENV1 is enabled, and one MAX_TEXTURE_COORD_SETS_EXT-valued
    integer indicating the texture coordinate set binding.  In the initial
    state, the texture functions for both environments is given by MODULATE,
    TEXTURE_ENV_COORD_SET_EXT is given by TEXTURE0_EXT in both environments, 
    TEXTURE_ENV_COLOR in environment zero is (0,0,0,0), TEXTURE_ENV_SHIFT_EXT
    in environment one is (0,0,0,0) and TEXTURE_ENV1_EXT is FALSE.

    3.8.6 Texture Application

    Texture is enabled or disabled using the generic Enable and Disable
    commands, respectively, with the symbolic constant TEXTURE_1D or TEXTURE_2D
    to enable the one-dimensional or two-dimensional texture, respectively.  
    If both one- and two-dimensional textures are enabled, the two dimensional
    texture is used. If all texturing is disabled and the currently bound
    texture environment is TEXTURE_ENV0_EXT, a rasterized fragment is
    passed on unaltered to the next stage of the GL (although its texture
    coordinates may be discarded).  If TEXTURE_ENV1_EXT is the current
    texture environment, the filtered texture values Rt, Gt, Bt, At, Lt, and
    It are replaced with 1.  Otherwise, a texture value is found according
    to the parameter values of the currently bound texture image of the
    appropriate dimensionality using the rules given in sections 3.8.1 and
    3.8.2.  This texture value is used along with the incoming fragment in
    computing the texture function indicated by the currently bound texture
    environment.  The result of this function replaces the incoming fragment's
    R, G, B, and A values.  These are the color values passed to subsequent
    operations.  Other data associated with the incoming fragment remain
    unchanged, except that the texture coordinates may be discarded.
        The required state us two bits indicating whether each of one- or
    two-dimensional texturing is enabled or disabled.  In the initial state,
    all texturing is disabled.


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)

    The value of the texture environment shift is queried by calling 
    GetTexEnviv, and GetTexEnvfv with the <target> parameter set of TEXTURE_ENV1
    and the <pname> parameter to TEXTURE_ENV_SHIFT_EXT.


Additions to the GLX Specification

    None

GLX Protocol

    TBD

Dependencies on EXT_texture3D

    If EXT_texture3D is not supported then the functionality and state
    associated with EXT_texture3D does not exist and is not supported.
    (this is more a note that section 3.8.6 should refer to texture3D too)

Dependencies on EXT_multitexture

   If EXT_multitexture is not supported then the functionality and state
   associated with EXT_multitexture does not exist and the description of
   TEXTURE_ENV_COORD_SET_EXT is void.  If it is supported, then the state
   associated with texture environment TEXTURE_ENV1_EXT exists for each active
   texture.

Errors

    INVALID_VALUE is generated if <params> value for TEXTURE_ENV_SHIFT
    is not one of 0, 1, or 2.

    INVALID_ENUM is generated if <target> parameter of TexEnvi or TexEnvf
    is TEXTURE_ENV1_EXT and <pname> parameter is not TEXTURE_ENV_MODE
    or TEXTURE_ENV_MODE_ALPHA_EXT.

    INVALID_ENUM is generated if <target> parameter of TexEnvi, TexEnvf
    TexEnviv, TexEnvfv, GetTexEnviv, or GetTexEnvfv is TEXTURE_ENV1_EXT
    and <pname> parameter is not TEXTURE_ENV_MODE, TEXTURE_ENV_MODE_ALPHA_EXT,
    or TEXTURE_ENV_SHIFT_EXT.

    INVALID_ENUM is generated if <target> parameter of TexEnvi, TexEnvf
    TexEnviv, or TexEnvfv is TEXTURE_ENV1_EXT, <pname> parameter is
    TEXTURE_ENV_MODE and <param> or <params> value is not one of ENV_COPY_EXT,
    ENV_REPLACE_EXT, ENV_MODULATE_EXT, ENV_ADD_EXT, ENV_SUBTRACT_EXT,
    ENV_REVERSE_SUBTRACT_EXT, ENV_BLEND_EXT, or ENV_REVERSE_BLEND_EXT

    INVALID_ENUM is generated if <target> parameter of TexEnvi, TexEnvf
    TexEnviv, or TexEnvfv is TEXTURE_ENV1_EXT, <pname> parameter is
    TEXTURE_ENV_MODE_ALPHA_EXT and <param> or <params> value is not one of
    ENV_COPY_EXT, ENV_REPLACE_EXT, ENV_MODULATE_EXT, ENV_ADD_EXT,
    ENV_SUBTRACT_EXT, or ENV_REVERSE_SUBTRACT_EXT.

New State

    Get Value               Get Command  Type   Initial Value   Attribute
    ---------               -----------  ----   -------------   ---------
    TEXTURE_ENV1_EXT        IsEnabled     B     FALSE           enable/texture
    TEXTURE_ENV_SHIFT_EXT   GetTexEnviv   Z4    (0, 0, 0, 0)    texture
    TEXTURE_ENV1,MODE       GetTexEnviv   Z7    MODULATE        texture
    TEXTURE_ENV1,MODE_ALPHA GetTexEnviv   Z5    MODULATE        texture


New Implementation Dependent State

    None
