Back to the OpenGL extension cross reference
GL_ARB_fragment_program_shadow
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, ATI Research (bill 'at' ati.com)
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: December 8, 2003
Revision: 5
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;
None
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.
Implementation Support
List of OpenGL implementations supporting the GL_ARB_fragment_program_shadow extension
Original File
Original text file for the GL_ARB_fragment_program_shadow extension
Page generated on Sun Nov 20 18:37:04 2005