Name

    ARB_fragment_program_shadow

Name Strings

    GL_ARB_fragment_program_shadow

Contributors

    Pat Brown
    Benj Lipchak
    Eric Werness

    and contributors to the ARB_vertex_program and
    ARB_fragment_program working groups, the products
    of which provided the basis for this spec.

Contact

    Bill Licea-Kane, AMD (bill.licea-kane 'at' amd.com)

Notice

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

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

IP Status

    Unknown, but Microsoft claims to own intellectual property
    related to ARB_fragment_program.  This extension is
    an extension to ARB_fragment_program.

Status

    Complete.  Approved by ARB on December 16, 2003

Version

    Last Modified Date: November 4, 2006
    Revision: 6

Number

    ARB Extension #36

Dependencies

    The extension is written against the OpenGL 1.3 Specification.

    ARB_fragment_program is required.

    ARB_shadow is required.

    EXT_texture_rectange affects the definition of this extension.

Overview

    This extension extends ARB_fragment_program to remove
    the interaction with ARB_shadow.

    This extension defines the program option
    "ARB_fragment_program_shadow".

    If a fragment program specifies the option "ARB_fragment_program_shadow"

        SHADOW1D, SHADOW2D, SHADOWRECT

    are added as texture targets.  When shadow map comparisons are
    desired, specify the SHADOW1D, SHADOW2D, or SHADOWRECT texture
    targets in texture instructions.

    Programs must assure that the comparison mode for each depth
    texture (TEXTURE_COMPARE_MODE) and/or the internal texture
    format (DEPTH_COMPONENT) and the targets of the texture lookup
    instructions match.  Otherwise, if the comparison mode
    and/or the internal texture format are inconsistent with the
    texture target, the results of the texture lookup are undefined.

Issues

    (1) What should this extension be called?

      RESOLVED:  ARB_fragment_program_shadow.  Shadow support
      is the only new feature.  The name ARB_fragment_program2
      should be used for a far more major revision to
      ARB_fragment_program.  ARB_fragment_program1_1 is
      less descriptive.

    (2) Should this extension use the header string "!!ARBfp1.1" or
    a program option "ARB_fragment_program_shadow"?

      RESOLVED: Program option "ARB_fragment_program_shadow".

    (3) What form should the ARB_fragment_program_shadow option take?

        a.  New sampler instructions.
            SHX result.color.a, fragment.texcoord[1], texture[0], 2D;

        b.  New texture modifiers.
            TEX result.color.a, fragment.texcoord[1], texture[0], 2D,SHADOW;

        c.  New texture targets.
            TEX result.color.a, fragment.texcoord[1], texture[0], SHADOW2D;

        d.  New sampler instructions AND new texture modifiers.
            SHX result.color.a, fragment.texcoord[1], texture[0], 2D,SHADOW;

        e.  New sampler instructions AND new texture targets.
            SHX result.color.a, fragment.texcoord[1], texture[0], SHADOW2D;

    RESOLVED:  Choose the simplest option c, add new texture targets.

    All of the above forms are functionally equivalent.

    An earlier draft proposed option a, adding six new shadow
    instructions.  The required shadow instructions are
    three variants of shadow instruction (non-projective, projective,
    and biased), and the same instructions with the modifier _SAT.

    Option b adds texture modifiers but requires additional semantic
    restrictions.

    Option c adds texture targets only.  It is a sufficient
    and simple change to one grammar rule.

    Option d and e are listed for completeness.  They require
    additional instructions and additional semantic restrictions.

    Note that option e is most similar to the resolution of
    this issue by ARB_fragment_shader and the OpenGL Shading Language.
    The OpenGL Shading Language has both built-in texture and
    shadow functions and sampler types, analogous to texture
    instructions and texture targets.  The resolution here
    drops the added reduntancy and potential error checking
    in favor of simplicity, but is otherwise consistent.
    This resolution is also consistent with the precident
    already established in ARB_fragment_program, since
    we have a TEX instruction, not a TEX1D, TEX2D, TEXCUBE,
    TEX3D, TEXRECT instructions.

    (4) How should ARB_fragment_program_shadow function?

        a. Simply remove the interaction with ARB_shadow so that
           TEXTURE_COMPARE_MODE behaves exactly as specified in the
           OpenGL 1.4 specification.

        b. Add "SHADOW" targets to texture lookup instructions.
           TEXTURE_COMPARE_MODE is ignored.  For samples from a SHADOW target
           TEXTURE_COMPARE_MODE is treated as COMPARE_R_TO_TEXTURE;
           otherwise, it is treated as NONE.

        c. Like (b), but with undefined results if TEXTURE_COMPARE_MODE and/or
           the internal format of the texture does not match the target.

        d. A hybrid of (a) and (b), where the SHADOW target means to use the
           TEXTURE_COMPARE_MODE state.

      RESOLVED - Option c, undefined behavior when the target and
      mode do not match.

      Program text is not simply loaded, it is compiled, optimized and
      then loaded.  Options a and d would remove information from the optimizer.
      Which components of the texture coordinate are required for the sample?
      Specifically, is the r component of the texture coordinate required?
      Options b and c are both sufficient and retain the information
      required by optimizers.  Option c is consistent with the resolution
      chosen by ARB_fragment_shader.

    (5) What if additional texture compare modes are added by
    future extensions to ARB_SHADOW?

    We do not anticipate future extensions adding additional
    texture compare modes.  Only the additional mode COMPARE_T_TO_TEXTURE
    has even marginal utility, and then only for SHADOW1D targets.
    However, a future extension adding additional texture compare
    modes is not precluded.  The language in this specification
    is carefully, if somewhat awkwardly, written to say the
    TEXTURE_COMPARE_MODE either "is NONE" or "is not NONE.

    (6) Does EXT_shadow_funcs interact with this extension?

       RESOLVED:  It doesn't.  ARB_shadow supports LEQUAL or GEQUAL
       comparison functions.  EXT_shadow_funcs simply adds
       the additional functions LESS, GREATER, EQUAL, NOTEQUAL,
       ALWAYS, and NEVER.  Whichever function is specified will
       be used for the comparison function.

    (7) Does ARB_shadow_ambient interact with this extension?

       RESOLVED:  It doesn't.  ARB_shadow returns a result
       in the range [0,1].  ARB_shadow_ambient simply
       maps this range to [TEXTURE_COMPARE_FAIL_ARB, 1].
       The result will be returned in the specified range.

    (8) How would an existing fragment program be ported to use the
    program option ARB_fragment_program_shadow?

       RESOLVED:  Fairly simply, but with a caveat on undefined behavior.

       !!ARBfp1.0
       # A simple example of shadow map (R <= Dt)
       #
       # SHOULD make sure that the 2D texture bound to texture unit 0:
       #    texture format of DEPTH_COMPONENT (for highest quality comparison)
       #    TEXTURE_MAG_FILTER is NEAREST
       #    TEXTURE_MIN_FILTER is NEAREST or NEAREST_MIPMAP_NEAREST
       # Assumes DEPTH_TEXTURE_MODE is LUMINANCE or INTENSITY
       #
       TEMP Result;
       ALIAS Dt = Result;
       TEX Dt, fragment.texcoord[0], texture[0], 2D;
       SGE Result, Dt.x, fragment.texcoord[0].z;      # R <= Dt

       !!ARBfp1.0
       OPTION ARB_fragment_program_shadow;
       # A simple example of shadow map (R<= Dt)
       #
       # MUST make sure that the 2D texture bound to texture unit 0:
       #    texture format of DEPTH_COMPONENT and a
       #    TEXTURE_COMPARE_MODE of COMPARE_R_TO_TEXTURE
       # Otherwise, the Result is undefined.
       #
       # Remember also that to get R <= Dt to set:
       #    TEXTURE_COMPARE_FUNC of LEQUAL
       #
       # A single compare equivalent to the above example will result if:
       #    TEXTURE_MAG_FILTER is NEAREST
       #    TEXTURE_MIN_FILTER is NEAREST or NEAREST_MIPMAP_NEAREST
       # Otherwise, percent closer filtering may be applied.
       #
       TEMP Result;
       TEX Result, fragment.texcoord[0], texture[0], SHADOW2D;

New Procedures and Functions

    None

New Tokens

    None

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

    None

Additions to Chapter 3 of the OpenGL 1.3 Specification (Rasterization)

    Modify Section 3.11.2  Fragment Program Grammar and Semantic Restrictions

    Replace <texTarget> grammar rule with

    <texTarget>            ::= "1D"
                             | "2D"
                             | "3D"
                             | "CUBE"
                             | "RECT"
                             | <shadowTarget> (if program option is present)

    <shadowTarget>         ::= "SHADOW1D"
                             | "SHADOW2D"
                             | "SHADOWRECT"

    Add Section 3.11.4.5.3  Fragment Program Shadow Option

    If a fragment program specifies the "ARB_fragment_program_shadow"
    program option, the <texTarget> rule is modified to add the
    texture targets SHADOW1D, SHADOW2D and SHADOWRECT (See Section 3.11.2).

    Modify Section 3.11.6  Fragment Program Texture Instruction Set

    (replace 1st through 4th paragraphs with the following paragraphs)

    The first three texture instructions described below specify the
    mapping of 4-tuple input vectors to 4-tuple output vectors.
    The sampling of the texture works as described in section 3.8,
    except that texture environments and texture functions are not
    applicable, and the texture enables hierarchy is replaced by explicit
    references to the desired texture target (i.e., 1D, 2D, 3D, cube map,
    rectangle).  These texture instructions specify how the 4-tuple is
    mapped into the coordinates used for sampling.  The following function
    is used to describe the texture sampling in the descriptions below:

      vec4 TextureSample(float s, float t, float r, float lodBias,
                         int texImageUnit, enum texTarget);

    Note that not all three texture coordinates, s, t, and r, are
    used by all texture targets.  In particular, 1D texture targets only
    use the s component.  2D and RECT (non-power-of-two) texture
    targets only use the s and t components.  SHADOW1D texture
    targets only use the s and r components.  The descriptions of the
    texture instructions below supply all three components, as would
    be the case with CUBE, 3D, SHADOW2D, and SHADOWRECT targets.

    If a fragment program samples from a texture target on a texture
    image unit where the bound texture object is not complete, as
    defined in section 3.8.9, the result will be the vector
    (R, G, B, A) = (0, 0, 0, 1).

    If a fragment program does not specify the "ARB_fragment_program_shadow"
    program option, and if a fragment program samples from a texture
    target of 1D, 2D, or RECT, it is as if TEXTURE_COMPARE_MODE_ARB is NONE.

    If a fragment program specifies the "ARB_fragment_program_shadow"
    program option, the result returned of a sample from a texture target on
    a texture image unit is undefined if:

      the texture target is 1D, 2D, or RECT, and
      the texture object's internal format is DEPTH_COMPONENT_ARB, and
      the TEXTURE_COMPARE_MODE_ARB is not NONE;

    or

      the texture target is SHADOW1D, SHADOW2D, SHADOWRECT, and
        the texture object's internal format is DEPTH_COMPONENT_ARB, and
      the TEXTURE_COMPARE_MODE_ARB is NONE;

    or

      the texture target is SHADOW1D, SHADOW2D, SHADOWRECT, and
        the texture object's internal format is not DEPTH_COMPONENT_ARB.

    A fragment program will fail to load if it attempts to sample from
    multiple texture targets on the same texture image unit.  For
    example, the following programs would fail to load:

      !!ARBfp1.0
      TEX result.color.rgb, fragment.texcoord[0], texture[0], 2D;
      TEX result.color.a,   fragment.texcoord[1], texture[0], 3D;
      END

      !!ARBfp1.0
      OPTION ARB_fragment_program_shadow;
      TEX result.color.rgb, fragment.texcoord[0], texture[0], 2D;
      TEX result.color.a,   fragment.texcoord[1], texture[0], SHADOW2D;
      END

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

    None

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

    None

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

    None

Additions to Appendix A of the OpenGL 1.3 Specification (Invariance)

    None

Additions to the AGL/GLX/WGL Specifications

    None

Dependencies on EXT_texture_rectangle

    If EXT_texture_rectangle is not supported:

    Section 3.11.2 should be modified by removing the line:

      | "SHADOWRECT"

    from the <shadowTarget> grammar rule;

    and Section 3.11.6 should be modified by removing the discussion
    of the rectangle shadow texture target.
