Name

    ARB_shadow_ambient

Name Strings

    GL_ARB_shadow_ambient

Contact

    Brian Paul (brian_e_paul 'at' yahoo.com)

Notice

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

Status

    Complete. Approved by ARB on February 14, 2002.

Version

    Last Modified Date: 12 December 2001

Number

    ARB Extension #24

Dependencies

    OpenGL 1.1 is required.
    ARB_shadow is required.
    ARB_depth_texture is required.
    This extension is written against the OpenGL 1.3 Specification.

Overview

    This is based on the GL_SGIX_shadow_ambient extension and is layered
    upon the GL_ARB_shadow extension.

    Basically, this extension allows the user to specify the texture
    value to use when the texture compare function fails.  Normally
    this value is zero.  By allowing an arbitrary value we can get
    functionality which otherwise requires an advanced texture
    combine extension (such as GL_NV_register_combiners) and multiple
    texture units.

IP Status

    None.

Issues

    (1) How is this extension different from GL_SGIX_shadow_ambient?

      It's functionally identical.  Since the original spec isn't in
      the extension registry this one was written from scratch.

    (2) Is this extension really needed?

      RESOLUTION: Yes, if an advanced texture combine extension is not
      available.  From Mark Kilgard's GDC presentation on shadow mapping:

      The desired color for a lit, textured, shadow fragment is:

      ( ambient + diffuseShade * diffuse) * decal + specular * shade

      where diffuseShade = dimming + ( 1.0 - dimming ) * shade, and
      shade is the result of the shadow test in [0,1].  dimming
      expresses the scattered light in a scene.

      If we limit shade to the range [<dimming>, 1] (where <dimming> is
      TEXTURE_FAIL_VALUE_ARB) then we can express the diffuse term with
      the standard GL_MODULATE texture env mode.

      Furthermore, this extension allows implementing shadow arithmetic
      with a single texture stage.  Otherwise, two texture stages are
      needed in order to compute diffuseShade * diffuse * decal.

      This extension is also useful for implementing shadowed lighting
      expressions other than the one above.  In particular, a "poor-man's"
      shadow mode can be implemented by setting TEXTURE_FAIL_VALUE_ARB to
      the scene's ambient intensity and the texture environment mode to
      GL_MODULATE.  This is the intention of the original
      GL_SGIX_shadow_ambient extension.

    (3) What are the downsides of this extension?

      This extension places some arithmetic in the texture sampling logic
      which would otherwise be better implemented in the texture combine
      logic.

      Also, there probably aren't many (if any) other uses for this logic
      other than shadow ambient term.

      Those who already implement advanced texture combine modes probably
      won't want to implement this extension.

    (4) What should the "shadow ambient" variable be named:

      RESOLUTION: TEXTURE_COMPARE_FAIL_VALUE_ARB since this extension
      specifies the value used when the texture comparison function fails.

    (5) Is GL_ARB_shadow_ambient a good name for this extension?

      RESOLUTION:  Probably.  Even though this extension is phrased in
      general terms, it's going to be used almost exclusively for shadow
      mapping applications.

    (6) Should TEXTURE_COMPARE_FAIL_VALUE_ARB be an alias for
      GL_SHADOW_AMBIENT_SGIX (from GL_SGIX_shadow_ambient)?

      RESOLUTION: Yes.  It serves the same purpose and avoids adding
      yet more state to texture objects.

New Procedures and Functions

    None

New Tokens

    Accepted by the <pname> parameter of TexParameterf, TexParameteri,
    TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv:

    TEXTURE_COMPARE_FAIL_VALUE_ARB  0x80BF  (same as SHADOW_AMBIENT_SGIX)

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

    None

Additions to Chapter 3 of the 1.3 Specification (Rasterization)

    Section 3.8.4, Texture Parameters, p. 133, append table 3.19 with the
    following:

        Name                            Type   Legal Values
        ------------------------------  -----  --------------------
        TEXTURE_COMPARE_FAIL_VALUE_ARB  float   any value in [0, 1]

    Section 3.8.4, Texture Parameters, append last paragraph with:

        "The value set by TEXTURE_COMPARE_FAIL_VALUE_ARB is clamped to
        lie in [0, 1]."

    Modify section 3.8.13.1, defined in the GL_ARB_shadow specification,
    as follows:

        "3.8.13.1 Depth Texture Comparison Mode

        [...]
        else if TEXTURE_COMPARE_MODE_ARB = COMPARE_R_TO_TEXTURE_ARB

            if TEXTURE_COMPARE_FUNC_ARB = LEQUAL

                     { 1.0,                             if R <= Dt
                 r = {
                     { TEXTURE_COMPARE_FAIL_VALUE_ARB,  if R > Dt

            else, if TEXTURE_COMPARE_FUNC_ARB = GEQUAL

                     { 1.0,                             if R >= Dt
                 r = {
                     { TEXTURE_COMPARE_FAIL_VALUE_ARB,  if R < Dt

            endif

        [...]

        If TEXTURE_MAG_FILTER is not NEAREST or TEXTURE_MIN_FILTER is
        not NEAREST or NEAREST_MIPMAP_NEAREST then r may be computed by
        comparing more than one depth texture value and texture R
        coordinate.  The details of this are implementation-dependent
        but r should be a value in the range
        [TEXTURE_COMPARE_FAIL_VALUE_ARB, 1] and proportional to the
        number of comparison passes or failures.

        [...]

Additions to Chapter 4 of the 1.3 Specification (Per-Fragment Operations
and the Frame Buffer)

    None

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

    None

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

    In section 6.1.3, p. 200, change the paragraph introduced by the
    ARB_shadow extension to be:

    "The texture compare mode, function, result format and comparison
    failure value may be queried by calling GetTexParameteriv or
    GetTexParameterfv with <pname> set to TEXTURE_COMPARE_MODE_ARB,
    TEXTURE_COMPARE_FUNC_ARB, TEXTURE_COMPARE_RESULT_ARB, or
    TEXTURE_COMPARE_FAIL_VALUE_ARB, respectively."

Additions to the GLX Specification

    None

Errors

    None.

New State

    In table 6.16, Texture Objects, p. 224, add the following:

    Get Value                      Type   Get Command          Init Val Description                Sec.   Attribute
    ------------------------------ ------ -------------------- -------- -------------------------- ------ ---------
    TEXTURE_COMPARE_FAIL_VALUE_ARB R[0,1] GetTexParameter[if]v   0.0    texture compare fail value 3.8.13 texture

New Implementation Dependent State

    None

Revision History

    16 April 2001
        - initial version
    22 April 2001
        - rename TEXTURE_FAIL_LUMINANCE_ARB to TEXTURE_FAIL_VALUE_ARB.
    23 April 2001
        - minor tweaks
    16 November 2001
        - rename TEXTURE_FAIL_VALUE_ARB to TEXTURE_COMPARE_FAIL_VALUE_ARB
    17 November 2001
        - adjusted 3.8.7.1 section number
    18 November 2001
        - Clarify that TEXTURE_COMPARE_FAIL_VALUE_ARB is clamped to [0,1]
        - added issue 6
        - let TEXTURE_COMPARE_FAIL_VALUE_ARB be the same as SHADOW_AMBIENT_SGIX
    12 December 2001
        - rewritten against the OpenGL 1.3 spec
        - fixed some typos
