| Name | |
| EXT_shadow_funcs | |
| Name Strings | |
| GL_EXT_shadow_funcs | |
| Contact | |
| Mark J. Kilgard (mjk 'at' nvidia.com) | |
| Status | |
| Complete | |
| Version | |
| Last Modified Date: $Date: 2002/03/22 $ | |
| NVIDIA Revision: $Revision: #5 $ | |
| Number | |
| 267 | |
| Dependencies | |
| OpenGL 1.1 is required. | |
| ARB_depth_texture is required. | |
| ARB_shadow is required. | |
| This extension is written against the OpenGL 1.3 Specification. | |
| Overview | |
| This extension generalizes the GL_ARB_shadow extension to support all | |
| eight binary texture comparison functions rather than just GL_LEQUAL | |
| and GL_GEQUAL. | |
| IP Status | |
| None. | |
| Issues | |
| (1) What should this extension be called? | |
| RESOLUTION: EXT_shadow_funcs. The extension adds new texture | |
| compare (shadow) comparison functions to ARB_shadow. | |
| (2) Are there issues with GL_EQUAL and GL_NOTEQUAL? | |
| The GL_EQUAL mode (and GL_NOTEQUAL) may be difficult to obtain | |
| well-defined behavior from. This is because there is no guarantee | |
| that the divide done by the shadow mapping r/q division is going | |
| to exactly match the z/w perspective divide and depth range scale | |
| & bias used to generate depth values. Perhaps it can work in a | |
| well-defined manner in orthographic views or if you can guarantee | |
| that the texture hardware's r/q is computed with the same hardware | |
| used to compute z/w (NVIDIA's NV_texture_shader extension can | |
| provide such a guarantee). | |
| Similiarly, GL_LESS and GL_GREATER or only different from GL_LEQUAL | |
| and GL_GEQUAL respectively by a single unit of depth precision | |
| which may make the difference between these modes very subtle. | |
| New Procedures and Functions | |
| None | |
| New Tokens | |
| None | |
| 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, update table 3.19 with the | |
| following new legal values for TEXTURE_COMPARE_FUNC_ARB: | |
| Name Type Legal Values | |
| -------------------------- ---- ------------------------------- | |
| TEXTURE_COMPARE_FUNC_ARB enum LEQUAL, GEQUAL, LESS, GREATER, | |
| EQUAL, NOTEQUAL, ALWAYS, NEVER | |
| After section 3.8.12, Texture Environments and Texture Functions, | |
| p. 149, update the texture compare pseudo-code in section 3.8.13.1 | |
| (as added by ARB_shadow): | |
| 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 | |
| else if TEXTURE_COMPARE_FUNC_ARB = LESS | |
| { 1.0, if R < Dt | |
| r = { | |
| { 0.0, if R >= Dt | |
| else if TEXTURE_COMPARE_FUNC_ARB = GREATER | |
| { 1.0, if R > Dt | |
| r = { | |
| { 0.0, if R <= Dt | |
| else if TEXTURE_COMPARE_FUNC_ARB = EQUAL | |
| { 1.0, if R == Dt | |
| r = { | |
| { 0.0, if R != Dt | |
| else if TEXTURE_COMPARE_FUNC_ARB = NOTEQUAL | |
| { 1.0, if R != Dt | |
| r = { | |
| { 0.0, if R == Dt | |
| else if TEXTURE_COMPARE_FUNC_ARB = ALWAYS | |
| r = 1.0 | |
| else if TEXTURE_COMPARE_FUNC_ARB = NEVER | |
| r = 0.0 | |
| 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 | |
| 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) | |
| None | |
| Additions to the GLX Specification | |
| None | |
| Errors | |
| INVALID_ENUM is generated if TexParameter[if][v] parameter <pname> | |
| is TEXTURE_COMPARE_FUNC_ARB and parameter <param> is not one of | |
| LEQUAL, GEQUAL, LESS, GREATER, EQUAL, NOTEQUAL, ALWAYS, or NEVER. | |
| 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_FUNC_ARB Z_8 GetTexParameter[if]v LEQUAL compare func 3.8.13 texture | |
| New Implementation Dependent State | |
| None | |
| Revision History | |
| None | |
| NV20 Implementation Details | |
| NV20 (GeForce3 and Quadro DCC) will fallback to software rasterization | |
| if two or more texture units have distinct TEXTURE_COMPARE_FUNC_ARB | |
| settings that are not opposites (eg, GL_EQUAL and GL_NOTEQUAL). | |
| This is not an issue on NV25 (GeForce4 and Quadro4). |