Name

    EXT_texture_perturb_normal

Name Strings

    GL_EXT_texture_perturb_normal

Version

    $Date: 1999/07/29 23:28:10 $

Number

    147

Dependencies

    OpenGL 1.1 is required.
    EXT_coordinate_frame is required.
    EXT_light_texture is required.
    The language is written against the OpenGL 1.2 specification.

Overview

    This extension defines a mechanism for using texture values to perturb
    the fragment normal vector prior to fragment lighting.  It enables a
    direct implementation of the original formulation of bump mapping by
    Blinn.

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

    *  do we need to specify how evaluators compute the tangent and binormal
       in a way different than the EXT_coordinate_frame spec does?

    *  TextureLightEXT effectively defines a set of orthogonal binding
       points.  TextureNormalEXT defines modes for how the NORMAL binding
       works, either as a perturbation or a straight replacement.  An
       alternate way to define TextureNormalEXT which might be more
       symmetric is to allow it to define two binding points: the
       base normal and the perturbation and allow binding to either.
       If no texture is bound to the perturbation, it is treated as
       zero.  A disadvantage is that it provides generality that may be
       unwarranted such as the ability to bind one texture to the base
       and another texture to the perturbation.  Which way should we
       do this?

    *  the naming scheme doesn't seem consistent.  light_texture.spec
       defines TextureLightEXT and the extension name EXT_light_texture.
       texture_perturb_normal.spec defines TextureNormalEXT and the extension
       name EXT_texture_perturb_normal.  Perhaps light_texture should be
       renamed EXT_texture_light or rename this one?

New Procedures and Functions

    void TextureNormalEXT(enum mode)

New Tokens

    Accepted by the <mode> parameter of TextureNormalEXT:

    PERTURB_EXT                         0x85AE

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

    TEXTURE_NORMAL_EXT                  0x85AF

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

    None

Additions to Chapter 3 of the 1.2 Specification (Rasterization)

    The command

    TextureNormalEXT(enum mode)

    determines how the fragment normal vector is modified by the post-
    texture-environment color when the texture application mode is
    FRAGMENT_NORMAL_EXT.  <mode> is one of REPLACE or PERTURB_EXT.

    If <mode> is REPLACE, then the R, G, and B components of the
    post-texture-environment color replace the normal for the fragment,
    as defined in the light_texture specification.  This is the default
    behavior.

    If <mode> is PERTURB_EXT, then the R and A components of the
    post-texture-environment color are used, along with the tangent and
    binormal vectors of the fragment, to perturb the normal vector of the
    fragment.  The tangent vector for the fragment is multiplied by the
    range-shifted R component (2*R-1) of the post-texture-environment
    color, and the binormal vector for the fragment is multiplied by the
    range-shifted A component (2*A-1) of the post-texture-environment
    color.  The vectors thus obtained are added to the normal for the
    fragment and the resultant vector is normalized. This normalized
    resultant vector replaces the normal for the fragment.

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

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

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

    The texture normal mode is queried using GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev with the <pname> parameter set to
    TEXTURE_NORMAL_EXT.

Additions to the GLX Specification

    None

GLX Protocol

    TBD

Dependencies on EXT_coordinate_frame

    EXT_coordinate_frame is required since this extension requires
    the tangent and binormal to perturb the normal vector and this
    extension makes no sense without the tangent and binormal.

Dependencies on EXT_light_texture

    EXT_light_texture is required since this extension pertains to how
    textures are used in the fragment lighting computations and makes
    no sense without light texture.

Errors

    INVALID_ENUM is generated if TextureNormalEXT parameter <pname> is
    not REPLACE or PERTURB_EXT.

    INVALID_OPERATION is generated if TextureNormalEXT is executed between
    execution of Begin and the corresponding execution of End.

New State

    Get Value           Get Command     Type    Initial Value       Attribute
    ---------           -----------     ----    -------------       ---------
    TEXTURE_NORMAL_EXT  GetIntegerv     Z2      REPLACE             texture

New Implementation Dependent State

    None
