| 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 |
| |
| 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 |
| |
| 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 <pname> parameter of TexParameterf, TexParameteri, |
| TexParameterfv, TexParameteriv, GetTexParameterfv, and GetTexParameteriv: |
| |
| TEXTURE_COMPARE_MODE_ARB 0x884C |
| TEXTURE_COMPARE_FUNC_ARB 0x884D |
| |
| Accepted by the <param> parameter of TexParameterf, TexParameteri, |
| TexParameterfv, and TexParameteriv when the <pname> 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 <pname> 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 <pname> |
| is TEXTURE_COMPARE_MODE_ARB and parameter <param> is not NONE or |
| COMPARE_R_TO_TEXTURE. |
| |
| INVALID_ENUM is generated if TexParameter[if] parameter <pname> |
| is TEXTURE_COMPARE_FUNC_ARB and parameter <param> 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. |