Name

    EXT_light_texture

Name Strings

    GL_EXT_light_texture

Version

    Last Modified Date: September 26, 1998
    Author Revision: $Header: //depot/main/doc/registry/extensions/EXT/light_texture.spec#15 $

Number

    117

Dependencies

    OpenGL 1.1 is required.
    EXT_fragment_lighting is required.
    EXT_multitexture affects the definition of this extension.
    SGIX_shadow affects the definition of this extension.
    SGIX_color_range affects the definition of this extension.

Overview

    This extension defines a general mechanism for substituting the
    fragment color computed during texture environment processing in
    place of other fragment attributes such as the fragment normal, or
    as sources for some of the computations in the fragment processing
    pipeline, for example as material or light parameters in the
    fragment lighting computations.


    Cf ----------------------+
                             |                 +-> to lighting parameters
                             v                 |
    +------------+        +--------+     +-------------+
    |            |        |        |     |             |
    | texel      |------->| texenv |-----| texture     |---> Cf' (to Light Environment
    | generation |        |        |     | application |          or Fog)
    |            |        |        |     |             |
    +------------+        +--------+     +-------------+


Patent Note

    To the extent that SGI has patent rights that are unavoidably
    infringed by all implementations of this extension, SGI will, upon
    request, grant a license under such patent rights to the requesting
    party subject to reasonable terms and conditions, and without
    incremental charge or fee. Such license shall be non-exclusive, and
    non-transferable, and shall be limited to implementations of the
    extension in combination with any conformance certified
    implementation of the OpenGL API. Such license is expressly
    contingent upon a grant back of a non-exclusive, royalty-free,
    perpetual, worldwide license to SGI and its OpenGL licensees under
    the requesting party's patent rights that are unavoidably infringed
    by all implementations of this extension or OpenGL.

Issues

    *  normal3 rather than normal?

    *  other parameters, spotlight fall off, ...

    *  implications of extended range colors. (do we clamp to [0,1]?)

    *  TexturePath or DirectTexture rather than ApplyTexture?

    *  special handling for alpha or luminance textures? (colormask?)

    *  more tokens for driving multiple inputs, e.g. AMBIENT_DIFFUSE_AND_SPECULAR

    *  normals need to be in the range [-1,1]
        
        when a texture is used as a normal, its components are scaled
        and biased to the range [-1,1].


New Procedures and Functions

    void ApplyTextureEXT(enum mode);
    void TextureLightEXT(enum pname)
    void TextureMaterialEXT(enum face, enum mode);

New Tokens

    Accepted by the <mode> parameter of ApplyTextureEXT:

    FRAGMENT_MATERIAL_EXT                       0x8349
    FRAGMENT_NORMAL_EXT                         0x834A
    FRAGMENT_DEPTH_EXT                          0x8452
    FRAGMENT_COLOR_EXT                          0x834C

    (*note*: FRAGMENT_DEPTH_EXT value changed from 0x834B on promotion
    from SGIX, to avoid collision with EXT_fog_coord).

    Accepted by the <pname> parameter of TextureLightEXT:

    ATTENUATION_EXT                             0x834D
    SHADOW_ATTENUATION_EXT                      0x834E

    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv,
    and GetDoublev:

    TEXTURE_APPLICATION_MODE_EXT                0x834F
    TEXTURE_LIGHT_EXT                           0x8350
    TEXTURE_MATERIAL_FACE_EXT                   0x8351
    TEXTURE_MATERIAL_PARAMETER_EXT              0x8352


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

    None

Additions to Chapter 3 of the 1.1 Specification (Rasterization)

    Immediately before section 3.9 Fog:

    Section 3.X Texture Application

    The command

    ApplyTextureEXT(enum mode);

    determines how the color produced as a result of texture
    environment processing is used for subsequent fragment
    operations. Table 3.X.1 summarizes the interpretation of color
    values for the values of the <mode> parameter.


    --
    FRAGMENT_COLOR_EXT      color is used as fragment color value
    FRAGMENT_DEPTH_EXT      color is used as fragment depth value
    FRAGMENT_LIGHT0_EXT     color is specified parameter for fragment light 0
    ...
    FRAGMENT_LIGHTn_EXT     color is specified parameter for fragment light n
    FRAGMENT_MATERIAL_EXT   color is specified material parameter(s)
    FRAGMENT_NORMAL_EXT     color is used as fragment normal

    Table 3.X.1 ApplyTextureEXT
    --

    If <mode> is FRAGMENT_COLOR_EXT then the post-texture-environment
    color is used as the fragment color during later fragment
    computations.  This is the default behavior.  If <mode> is not
    FRAGMENT_COLOR_EXT then the fragment color is the
    pre-texture-environment color.

    If <mode> is FRAGMENT_DEPTH_EXT then the red component of the
    post-texture-environment color replaces the depth value for the
    fragment.

    If <mode> is FRAGMENT_NORMAL_EXT then the R, G, and B components
    of the post-texture-environment color are used to compute the 
    components nx, ny, and nz of the fragment normal vector as follows:
    
            nx = 2*R-1
            ny = 2*G-1
            nz = 2*B-1
    
    In effect, the post-texture-environment color components are scaled
    and biased so that their range is [-1,1].

    If <mode> is one of FRAGMENT_LIGHT0_EXT .. FRAGMENT_LIGHTn_EXT
    then the post-texture-environment color substitutes a fragment
    lighting parameter of the light indicated by <mode> during the
    lighting computation for that fragment.  The substututed lighting
    parameter is specified by the TextureLightEXT command described
    in Section 3.X.2.

    If <mode> is FRAGMENT_MATERIAL_EXT then the
    post-texture-environment color substitutes a fragment material
    parameter during the lighting computation for that fragment.  The
    fragment material parameter substituted is specified by the
    TextureMaterialEXT command described in Section 3.X.3.

    If <mode> is changed from FRAGMENT_MATERIAL_EXT or
    FRAGMENT_LIGHT0_EXT .. FRAGMENT_LIGHTn_EXT to another value, the
    corresponding material or light parameter reverts back to the
    current state value for that parameter, i.e., the value most
    recently specified with one of the FragmentMaterial{T}[v]EXT or
    FragmentLight{T}[v]EXT commands.  In particular, the state
    parameters corresponding to the portions of the fragment lighting
    computations being substituted by the texture application mode
    continue to track the values specified by the
    FragmentMaterial{T}[v]EXT and FragmentLight{T}[v]EXT commands.


    Section 3.X.2 Texture Applied to Light Parameters

    The command

    TextureLightEXT(enum pname);
    
    determines which fragment light parameter is substituted with the
    post-texture-environment color when the texture application mode
    is one of the fragment lights. <pname> is one of AMBIENT, DIFFUSE,
    SPECULAR, or ATTENUATION_EXT. If <pname> is AMBIENT, DIFFUSE, or
    SPECULAR then the ambient, diffuse, or specular intensity
    parameter is substituted.  If <pname> is ATTENUATION_EXT, then
    the attenuation term att_i from equation (2.4) is subsituted with
    the value of the red component of the post-texture-environment
    color.  If <pname> is SHADOW_ATTENUATION_EXT then the fragment
    lighting equation is augmented with an additional attenuation term
    Shad_i:

    Cl =  Em
       + Am*As
       SUM{_i = 0 through Nf-1} {
       + Shad_i*Atten_i*SpotL_i*{
            + Am*Al_i
            + Dm*Dl_i*(N.L_i)
            + Sm*Sl_i*(N.H_i)^n
          }
        }
    
    with Shad_i coming from the red component of the post-texture-environment
    color.  If a post-environment texture color is not applied to
    SHADOW_ATTENUATION_EXT for fragment light <i>, then Shad_i is effectively
    1.0.


    Section 3.X.3 Texture Applied to Material Parameters

    The command

    TextureMaterialEXT(enum face, enum mode);

    determines which fragment material parameter is substituted with
    the post-texture-environment color when the texture application
    mode is FRAGMENT_MATERIAL_EXT.  <face> is one of FRONT, BACK, or
    FRONT_AND_BACK, indicating whether the front material, back
    material, or both are affected by the current color.  <mode> is on
    of EMISSION, AMBIENT, DIFFUSE, SPECULAR, SHININESS, or
    AMBIENT_AND_DIFFUSE and specifies which material property or
    properties are substituted with the post-texture-environment
    color.  If <mode> is EMISSION, AMBIENT, DIFFUSE, or SPECULAR, then
    the value of e_cm, a_cm, d_cm, or s_cm from the fragment lighting
    equations, respectively, will be substituted with the
    post-texture-environment color.  If <mode> is AMBIENT_AND_DIFFUSE,
    both a_cm and d_cm will be substituted.  If <mode> is SHININESS,
    then s_rm will be substituted with 128.0*r, where r is the value
    of the red component of the post-texture-environment color.

    Section 3.X.4 Interactions with multiple textures

    The color computed during texture environment processing for each
    active texture can be independently controlled using
    ApplyTextureEXT.  In the initial state all texture application
    modes are FRAGMENT_COLOR_EXT and the logical flow of fragment
    information through the OpenGL pipeline is shown in figure 3.X.5
    with the result color of each texture environment stage serving as
    input for the following stage.


             Ct0        Ct1                Ctn
              |          |                  |
          +------+   +------+           +------+
          |      |   |      |           |      |
      Cf -| TE0  |-->| TE1  |--> ... -->| TEn  |--> Cf' (to fragment lighting/fog)
          |      |   |      |           |      |
          +------+   +------+           +------+

    Figure 3.X.5

    If the application mode for texture <i> is set to something other
    than FRAGMENT_COLOR_EXT, then the input for texture environment
    <i+1> becomes the original pre-texturing fragment color Cf.  If
    the application mode for texture <i> is returned to
    FRAGMENT_COLOR_EXT, then the input for texture environment <i+1>
    reverts back to the result from texture environment <i>.  If i is
    the last texture in the chain, then the pre-texturing fragment
    color Cf is used for all subsequent fragment processing.  Figure
    3.X.6 illustrates the case for the application mode for texture 1
    set to something other than FRAGMENT_COLOR_EXT.

             Ct0        Ct1          Ct2             Ctn
              |          |    ^       |               |
          +------+   +------+ |   +------+        +------+
          |      |   |      | |   |      |        |      |
      Cf -| TE0  |-->| TE1  |-+ +-| TE2  | ... -->| TEn  |--> Cf'
       |  |      |   |      |   | |      |        |      |
       |  +------+   +------+   | +------+        +------+
       +------------------------+

    Figure 3.X.6

    It is possible for the application mode for more than one texture
    to refer to the identical parameter, for example, the FRONT
    DIFFUSE material color.  Such conflicts are resolved by having the
    lowest numbered, enabled, texture provide the color value and any
    higher numbered textures are ignored.  Note that when the
    application mode is FRAGMENT_LIGHTi_EXT, the TextureLightEXT
    <pname> parameter must be considered and when the application mode
    is FRAGMENT_MATERIAL_EXT that the <face> and <mode> parameters
    for TextureMaterialEXT must be considered.  A partial overlap
    with the TextureMaterialEXT <face> and <mode> parameter (e.g.,
    FRONT,DIFFUSE and FRONT_AND_BACK,DIFFUSE) is treated as a
    conflict.

    If there is a conflict between a material parameter being substituted
    through FragmentColorMaterialEXT and TextureMaterialEXT, then the color
    value assocaiated with the texture is ignored and the pre-texture fragment
    color value is substituted.


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

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

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

Additions to the GLX Specification

    None
    
GLX Protocol

    TBD

Dependencies on EXT_fragment_lighting

    EXT_fragment_lighting is required since this extension pertains to how
    fragment lighting computations are performed and this extension makes no
    sense without fragment lighting.

Dependencies on SGIX_color_range

    <this is a note, not a true dependency -db>
    The scale and bias of performed on colors when converting them
    to fragment normals is done regardless of whether SGIX_color_range is
    supported.

Dependencies on EXT_multitexture

    If EXT_multitexture is not supported only the single
    post-texture-environment color is available for substitution and the
    discussion of multiple textures in section 3.X.4 is void.

Dependencies on SGIX_shadow

    If SGIX_shadow is not supported then this extension does not define
    the attenuation multiplier term SHADOW_ATTENUATION_EXT.  All discussion
    of this attenuation term is void.

Errors

    INVALID_ENUM is generated if ApplyTextureEXT parameter <mode> is
    not FRAGMENT_MATERIAL_EXT, FRAGMENT_LIGHT0_EXT
    .. FRAGMENT_LIGHTn_EXT (where n is the value returned by querying
    MAX_FRAGMENT_LIGHTS_EXT), FRAGMENT_NORMAL_EXT,
    FRAGMENT_DEPTH_EXT, or FRAGMENT_COLOR_EXT.

    INVALID_ENUM is generated if TextureLightEXT parameter <pname> is
    not AMBIENT, DIFFUSE, SPECULAR, ATTENUATION_EXT, or
    SHADOW_ATTENUATION_EXT.

    INVALID_ENUM is generated if TextureMaterialEXT parameter <face>
    is not FRONT, BACK, or FRONT_AND_BACK or if parameter <mode> is
    not EMISSION, AMBIENT, DIFFUSE, SPECULAR, SHININESS, or
    AMBIENT_AND_DIFFUSE.

    INVALID_OPERATION is generated if ApplyTextureEXT,
    TextureLightEXT, or TextureMaterialEXT is executed between
    execution of Begin and the corresponding execution of End.

New State

    Get Value                           Get Command     Type    Initial Value       Attribute
    ---------                           -----------     ----    -------------       ---------
    TEXTURE_APPLICATION_MODE_EXT        GetIntegerv     Z10     FRAGMENT_COLOR_EXT  texture
    TEXTURE_LIGHT_EXT                   GetIntegerv     Z5      DIFFUSE             texture
    TEXTURE_MATERIAL_FACE_EXT           GetIntegerv     Z3      FRONT_AND_BACK      texture
    TEXTURE_MATERIAL_PARAMETER_EXT      GetIntegerv     Z6      AMBIENT_AND_DIFFUSE texture

New Implementation Dependent State

    None
