Name
ARB_shadow
Name Strings
GL_ARB_shadow
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: 21 January 2002
Number
ARB Extension #23
Dependencies
OpenGL 1.1 is required.
ARB_depth_texture is required.
This extension is written against the OpenGL 1.3 Specification.
Overview
This extension clarifies the GL_SGIX_shadow extension.
This extension supports comparing the texture R coordinate to a depth
texture value in order to produce a boolean texture value. This can
be used to implement shadow maps.
The extension is written in generic terms such that other texture
comparison modes can be accommodated in the future.
IP Status
XXX None?
Issues
(1) How is this extension different from GL_SGIX_shadow?
- It defines GL behaviour when the currently bound texture is not
a depth texture.
- It specifies that R is clamped to [0,1].
- We use the standard GL_LEQUAL and GL_GEQUAL tokens instead of
defining new ones.
- The result may be ALPHA, LUMINANCE or INTENSITY.
- A bit more is said about how depth textures are sampled.
- The extension is generalized for comparison modes.
(2) Should we use GL_LEQUAL and GL_EQUAL instead of
GL_TEXTURE_LEQUAL_R_SGIX and GL_TEXTURE_GEQUAL_R_SGIX?
RESOLUTION: Yes. The old tokens are misleading. For example,
the GL_TEXTURE_LEQUAL_R_SGIX token should really have been named
GL_R_LEQUAL_TEXTURE_SGIX since we're comparing R <= TEXTURE.
This extension uses the standard GL_LEQUAL and GL_GEQUAL tokens.
Also, the original shadow spec seems to be inconsistant with
what was really implemented in hardware.
(3) Use TEXTURE_COMPARE_OPERATOR_ARB or TEXTURE_COMPARE_FUNC_ARB?
RESOLVED: Use TEXTURE_COMPARE_FUNC_ARB to be more consistant with
the conventions of glDepthFunc(), glStencilFunc(), etc which use
the GL_LEQUAL, GL_GEQUAL, etc tokens.
(4) Should the result of the texture comparison be a LUMINANCE,
INTENSITY or ALPHA texel?
RESOLVED: Allow any of them. This is controlled by
DEPTH_TEXTURE_MODE_ARB defined in ARB_depth_texture extension.
(5) What if TEXTURE_COMPARE_MODE_ARB is set to COMPARE_R_TO_TEXTURE
but the the currently bound texture is not a depth texture?
RESOLVED: If the currently bound texture is a color (or paletted
or color index) texture then the texture unit treats it in the
usual manner and all texture comparison logic is bypassed.
(6) Should the R value be clamped to [0,1] before the comparison?
RESOLUTION: Yes, that makes sense since the depth texels are in
the range [0,1]. Note that clamping R to [0,1] really only matters
at the values 0 and 1.
(7) How is bilinear or trilinear filtering implemented?
RESOLUTION: We suggest an implementation behaviour but leave the
details up to the implementation. Differences here amount to the
quality and softness of shadow edges. Specific filtering
algorithms could be expressed via layered extensions. We're
intentionally vague here to avoid IP and patent issues.
(8) Is GL_ARB_shadow the right name for this extension?
RESOLVED: Probably. While this extension is expressed in rather
generic terms which may be used by future extensions, it implements
a rather specific operation at this time.
(9) What about GL_SGIX_shadow_ambient?
RESOLUTION: Omit that functionality. It can be accomplished with
advanced texture extensions such as GL_NV_register_combiners.
GL_SGIX_shadow_ambient usually can't be implemented with existing
hardware so it'll be offered as GL_ARB_shadow_ambient, rather than
burdon this extension with it.
New Procedures and Functions
None
New Tokens
Accepted by the parameter of TexParameterf, TexParameteri,
TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv:
TEXTURE_COMPARE_MODE_ARB 0x884C
TEXTURE_COMPARE_FUNC_ARB 0x884D
Accepted by the parameter of TexParameterf, TexParameteri,
TexParameterfv, and TexParameteriv when the parameter is
TEXTURE_COMPARE_MODE_ARB:
COMPARE_R_TO_TEXTURE_ARB 0x884E
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_MODE_ARB enum NONE, COMPARE_R_TO_TEXTURE
TEXTURE_COMPARE_FUNC_ARB enum LEQUAL, GEQUAL
After section 3.8.12, Texture Environments and Texture Functions,
p. 149, insert the following new sections (and renumber subsequent
sections):
"3.8.13 Texture Comparison Modes
TEXTURE_COMPARE_MODE_ARB can be used to compute the texture value
according to a comparison function. TEXTURE_COMPARE_MODE_ARB
specifies the comparison operands, and TEXTURE_COMPARE_FUNC_ARB
specifies the comparison function. The format of the resulting
texture sample is specified by the DEPTH_TEXTURE_MODE_ARB.
3.8.13.1 Depth Texture Comparison Mode
If the currently bound texture's format is DEPTH_COMPONENT then
TEXTURE_COMPARE_MODE_ARB, TEXTURE_COMPARE_FUNC_ARB and
DEPTH_TEXTURE_MODE_ARB control the output of the texture unit
as described below. However, if the currently bound texture is
not DEPTH_COMPONENT then the texture unit operates in the normal
manner and texture comparison is bypassed.
Let Dt (D subscript t) be the depth texture value, in the range
[0, 1]. Let R be the interpolated texture coordinate clamped to
the range [0, 1]. Then the effective texture value Lt, It, or At
is computed by
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
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
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 to the texture R
coordinate. 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 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, insert the following after the fourth
paragraph:
"The texture compare mode and texture compare function may be queried
by calling GetTexParameteriv or GetTexParameterfv with set to
TEXTURE_COMPARE_MODE_ARB, or TEXTURE_COMPARE_FUNC_ARB, respectively."
Additions to the GLX Specification
None
Errors
INVALID_ENUM is generated if TexParameter[if] parameter
is TEXTURE_COMPARE_MODE_ARB and parameter is not NONE or
COMPARE_R_TO_TEXTURE.
INVALID_ENUM is generated if TexParameter[if] parameter
is TEXTURE_COMPARE_FUNC_ARB and parameter is not LEQUAL or
GEQUAL.
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_MODE_ARB Z_2 GetTexParameter[if]v NONE compare mode 3.8.13 texture
TEXTURE_COMPARE_FUNC_ARB Z_2 GetTexParameter[if]v LEQUAL compare func 3.8.13 texture
New Implementation Dependent State
None
Revision History
19 March 2001
- initial revision
20 March 2001
- use GL_LEQUAL, GL_GEQUAL tokens
- removed TEXTURE_COMPARE_FAIL_VALUE_ARB
16 April 2001
- renamed TEXTURE_COMPARE_OPERATOR_ARB to TEXTURE_COMPARE_FUNC_ARB
- replace TEXTURE_COMPARE_ARB with TEXTURE_COMPARE_MODE_ARB
22 April 2001
- added TEXTURE_COMPARE_RESULT
23 April 2001
- minor tweaks
22 June 2001
- fixed grammatical errors
16 November 2001
- Change default value of TEXTURE_COMPARE_MODE_ARB to LUMINANCE.
17 November 2001
- Resolved issue 5
- cleaned up new section 3.8.7.1 yet again
12 December 2001
- rewritten against the OpenGL 1.3 spec
3 January 2002
- fixed a typo found by Bimal
18 January 2002
- Since depth textures can now allow ALPHA, INTENSITY, LUMINANCE mode,
there was no need for TEXTURE_COMPARE_RESULT_ARB.
21 January 2002
- Fixed error to be INVALID_ENUM instead of INVALID_OPERATION.