EXT_shadow_samplers

Name

EXT_shadow_samplers

Name Strings

GL_EXT_shadow_samplers

Contributors

Contributors to ARB_shadow and EXT_shadow_funcs on which this extension 
    is based
Galo Avila
Kelvin Chiu
Richard Schreyer

Contacts

Benj Lipchak, Apple (lipchak 'at' apple.com)

Status

Complete

Version

Date: June 25, 2012
Revision: 4

Number

OpenGL ES Extension #102

Dependencies

Requires OpenGL ES 2.0.

Written based on the wording of the OpenGL ES 2.0.25 Full Specification
(November 2, 2010).

Written based on the wording of The OpenGL ES Shading Language 1.0.17
Specification (May 12, 2009).

Requires OES_depth_texture.

OES_packed_depth_stencil affects the definition of this extension.

Overview

This extension supports comparing the texture R coordinate to a depth
texture value returning the result as a float value in the range [0,1]. 
This can be used to implement shadow maps.

New Procedures and Functions

None

New Tokens

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

TEXTURE_COMPARE_MODE_EXT    0x884C
TEXTURE_COMPARE_FUNC_EXT    0x884D

Accepted by the <param> parameter of TexParameterf, TexParameteri,
TexParameterfv, and TexParameteriv when the <pname> parameter is
TEXTURE_COMPARE_MODE_EXT:

COMPARE_REF_TO_TEXTURE_EXT  0x884E

Returned in <type> by glGetActiveUniform:

GL_SAMPLER_2D_SHADOW_EXT    0x8B62 

New GLSL defines

#extension GL_EXT_shadow_samplers : require

New GLSL sampler types

sampler2DShadow

New GLSL functions

float shadow2DEXT(sampler2DShadow sampler, vec3 coord);
float shadow2DProjEXT(sampler2DShadow sampler, vec4 coord);

Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL ES Operation)

In Section 2.10.4, replace the final sentence on p. 36 with:

"The type returned can be any of FLOAT, FLOAT_VEC2, FLOAT_VEC3, FLOAT_VEC4,
INT, INT_VEC2, INT_VEC3, INT_VEC4, BOOL, BOOL_VEC2, BOOL_VEC3, BOOL_VEC4, 
FLOAT_MAT2, FLOAT_MAT3, FLOAT_MAT4, SAMPLER_2D, SAMPLER_CUBE, or 
SAMPLER_2D_SHADOW_EXT."

Additions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization)

Section 3.7.4, Texture Parameters, p. 76, append table 3.10 with the
following:

Name                       Type   Legal Values
------------------------   ----   -------------------------------
TEXTURE_COMPARE_MODE_EXT   enum   NONE, COMPARE_REF_TO_TEXTURE_EXT
TEXTURE_COMPARE_FUNC_EXT   enum   LEQUAL, GEQUAL, LESS, GREATER, EQUAL, 
                                  NOTEQUAL, ALWAYS, NEVER

After section 3.7.13, Texture Objects, p. 86, insert the following new 
section:

    "3.7.14 Texture Comparison Modes

    Texture values can also be computed according to a specified comparison
    function. Texture parameter TEXTURE_COMPARE_MODE_EXT specifies the 
    comparison operands, and parameter TEXTURE_COMPARE_FUNC_EXT specifies
    the comparison function.
    
    3.7.14.1 Depth Texture Comparison Mode

    If the currently bound texture's base internal format is 
    DEPTH_COMPONENT or DEPTH_STENCIL_OES, then TEXTURE_COMPARE_MODE_EXT 
    and TEXTURE_COMPARE_FUNC_EXT control the output of the texture unit
    as described below. Otherwise, the texture unit operates in the normal
    manner and texture comparison is bypassed.

    Let D_t be the depth texture value and D_ref be the reference value, 
    provided by the shader's texture lookup function. D_t and D_ref are 
    clamped to the range [0,1]. Then the effective texture value is
    computed as follows:

    If the value of TEXTURE_COMPARE_MODE_EXT is NONE, then

        r = D_t

    If the value of TEXTURE_COMPARE_MODE_EXT is 
    COMPARE_REF_TO_TEXTURE_EXT, then r depends on the texture Comparison
    function as shown in table 3.X.


    Texture Comparison Function  Computed result r
    ---------------------------  -----------------
                                     { 1.0,  if D_ref <= Dt
    LEQUAL                       r = {
                                     { 0.0,  if D_ref > Dt

                                     { 1.0,  if D_ref >= Dt
    GEQUAL                       r = {
                                     { 0.0,  if D_ref < Dt

                                     { 1.0,  if D_ref < Dt
    LESS                         r = {
                                     { 0.0,  if D_ref >= Dt

                                     { 1.0,  if D_ref > Dt
    GREATER                      r = {
                                     { 0.0,  if D_ref < Dt

                                     { 1.0,  if D_ref == Dt
    EQUAL                        r = {
                                     { 0.0,  if D_ref != Dt

                                     { 1.0,  if D_ref != Dt
    NOTEQUAL                     r = {
                                     { 0.0,  if D_ref == Dt

    ALWAYS                       r = 1.0

    NEVER                        r = 0.0

         Table 3.X: Depth texture comparison functions.


    The resulting r is assigned to R_t.

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

Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment Operations and the Framebuffer)

None

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

None

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

None

Additions to OpenGL ES Shading Language 1.00 Specification

Append the following row to the table in section 4.1, Basic Types:

Type             Meaning
---------------  ---------------------------------------------------------
sampler2DShadow  a handle for accessing a 2D depth texture with comparison

Insert the following paragraph after the first paragraph in section 8.7, 
Texture Lookup Functions:

"For shadow forms (the sampler parameter is a shadow-type), a depth 
comparison lookup on the depth texture bound to sampler is done as 
described in section 3.7.14 "Texture Comparison Modes" of the OpenGL ES 
Specification. See the table below for which component specifies D_ref. The
texture bound to sampler must be a depth texture, or results are undefined.
If a non-shadow texture call is made to a sampler that represents a depth 
texture with depth comparisons turned on, then results are undefined. If a 
shadow texture call is made to a sampler that represents a depth texture 
with depth comparisons turned off, then results are undefined. If a shadow 
texture call is made to a sampler that does not represent a depth texture, 
then results are undefined."

Append "precision lowp sampler2DShadow;" to the default precision statements
in section 4.5.3.

Dependencies on OES_packed_depth_stencil

If OES_packed_depth_stencil is not supported, then all references to
DEPTH_STENCIL_OES should be omitted. 

Issues

(1) Should the result of the texture comparison be interpreted as 
a LUMINANCE, INTENSITY or ALPHA texel?

RESOLVED: A scalar value is returned from the shadow lookup built-in
function in the fragment shader, so it can be interpreted however desired.

Revision History

Date: 6/16/2011 Revision: 1 (Benj Lipchak) - Initial draft

Date: 7/22/2011 Revision: 2 (Benj Lipchak) - Rename from APPLE to EXT

Date: 1/18/2012 Revision: 3 (Kelvin Chiu) - Add GL_SAMPLER_2D_SHADOW_EXT for glGetActiveUniform type

Date: 6/25/2012 Revision: 4 (Benj Lipchak) - Specify lowp as the default precision of sampler2DShadow