Name

    EXT_shadow_funcs

Name Strings

    GL_EXT_shadow_funcs

Contact

    Mark J. Kilgard (mjk 'at' nvidia.com)

Status

    Complete

Version

    Last Modified Date:  $Date: 2002/03/22 $
    NVIDIA Revision:  $Revision: #5 $

Number

    267

Dependencies

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

Overview

    This extension generalizes the GL_ARB_shadow extension to support all
    eight binary texture comparison functions rather than just GL_LEQUAL
    and GL_GEQUAL.

IP Status

    None.

Issues

    (1) What should this extension be called?

      RESOLUTION: EXT_shadow_funcs.  The extension adds new texture
      compare (shadow) comparison functions to ARB_shadow.

    (2) Are there issues with GL_EQUAL and GL_NOTEQUAL?

      The GL_EQUAL mode (and GL_NOTEQUAL) may be difficult to obtain
      well-defined behavior from. This is because there is no guarantee
      that the divide done by the shadow mapping r/q division is going
      to exactly match the z/w perspective divide and depth range scale
      & bias used to generate depth values.  Perhaps it can work in a
      well-defined manner in orthographic views or if you can guarantee
      that the texture hardware's r/q is computed with the same hardware
      used to compute z/w (NVIDIA's NV_texture_shader extension can
      provide such a guarantee).

      Similiarly, GL_LESS and GL_GREATER or only different from GL_LEQUAL
      and GL_GEQUAL respectively by a single unit of depth precision
      which may make the difference between these modes very subtle.

New Procedures and Functions

    None

New Tokens

    None

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, update table 3.19 with the
    following new legal values for TEXTURE_COMPARE_FUNC_ARB:

        Name                        Type  Legal Values
        --------------------------  ----  -------------------------------
        TEXTURE_COMPARE_FUNC_ARB    enum  LEQUAL, GEQUAL, LESS, GREATER,
                                          EQUAL, NOTEQUAL, ALWAYS, NEVER

    After section 3.8.12, Texture Environments and Texture Functions,
    p. 149, update the texture compare pseudo-code in section 3.8.13.1
    (as added by ARB_shadow):

        if TEXTURE_COMPARE_MODE_ARB = NONE

            r = Dt

        else if TEXTURE_COMPARE_MODE_ARB = COMPARE_R_TO_TEXTURE_ARB

            if TEXTURE_COMPARE_FUNC_ARB = LEQUAL

                 { 1.0,  if R <= Dt
             r = {
                 { 0.0,  if R > Dt
    
            else if TEXTURE_COMPARE_FUNC_ARB = GEQUAL
    
                 { 1.0,  if R >= Dt
             r = {
                 { 0.0,  if R < Dt
    
            else if TEXTURE_COMPARE_FUNC_ARB = LESS
    
                 { 1.0,  if R < Dt
             r = {
                 { 0.0,  if R >= Dt
    
            else if TEXTURE_COMPARE_FUNC_ARB = GREATER
    
                 { 1.0,  if R > Dt
             r = {
                 { 0.0,  if R <= Dt
    
            else if TEXTURE_COMPARE_FUNC_ARB = EQUAL
    
                 { 1.0,  if R == Dt
             r = {
                 { 0.0,  if R != Dt
    
            else if TEXTURE_COMPARE_FUNC_ARB = NOTEQUAL
    
                 { 1.0,  if R != Dt
             r = {
                 { 0.0,  if R == Dt
    
            else if TEXTURE_COMPARE_FUNC_ARB = ALWAYS
    
             r = 1.0
    
            else if TEXTURE_COMPARE_FUNC_ARB = NEVER
    
             r = 0.0

            endif

            if DEPTH_TEXTURE_MODE_ARB = LUMINANCE
    
                Lt = r
    
            else if DEPTH_TEXTURE_MODE_ARB = INTENSITY
    
                It = r
    
            else if DEPTH_TEXTURE_MODE_ARB = ALPHA
    
                At = r
    
            endif

        endif

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)

    None

Additions to the GLX Specification

    None

Errors

    INVALID_ENUM is generated if TexParameter[if][v] parameter <pname>
    is TEXTURE_COMPARE_FUNC_ARB and parameter <param> is not one of
    LEQUAL, GEQUAL, LESS, GREATER, EQUAL, NOTEQUAL, ALWAYS, or NEVER.

New State

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

    Get Value                   Type  Get Command           Initial Value  Description     Sec.   Attribute
    --------------------------  ----  --------------------  -------------  --------------  -----  ---------
    TEXTURE_COMPARE_FUNC_ARB    Z_8   GetTexParameter[if]v  LEQUAL         compare func    3.8.13 texture

New Implementation Dependent State

    None

Revision History

    None

NV20 Implementation Details

    NV20 (GeForce3 and Quadro DCC) will fallback to software rasterization
    if two or more texture units have distinct TEXTURE_COMPARE_FUNC_ARB
    settings that are not opposites (eg, GL_EQUAL and GL_NOTEQUAL).
    This is not an issue on NV25 (GeForce4 and Quadro4).
