| Name | |
| EXT_light_texture | |
| Name Strings | |
| GL_EXT_light_texture | |
| Version | |
| Last Modified Date: September 26, 1998 | |
| Author Revision: $Header: //depot/main/doc/registry/extensions/EXT/light_texture.spec#15 $ | |
| Number | |
| 117 | |
| Dependencies | |
| OpenGL 1.1 is required. | |
| EXT_fragment_lighting is required. | |
| EXT_multitexture affects the definition of this extension. | |
| SGIX_shadow affects the definition of this extension. | |
| SGIX_color_range affects the definition of this extension. | |
| Overview | |
| This extension defines a general mechanism for substituting the | |
| fragment color computed during texture environment processing in | |
| place of other fragment attributes such as the fragment normal, or | |
| as sources for some of the computations in the fragment processing | |
| pipeline, for example as material or light parameters in the | |
| fragment lighting computations. | |
| Cf ----------------------+ | |
| | +-> to lighting parameters | |
| v | | |
| +------------+ +--------+ +-------------+ | |
| | | | | | | | |
| | texel |------->| texenv |-----| texture |---> Cf' (to Light Environment | |
| | generation | | | | application | or Fog) | |
| | | | | | | | |
| +------------+ +--------+ +-------------+ | |
| Patent Note | |
| To the extent that SGI has patent rights that are unavoidably | |
| infringed by all implementations of this extension, SGI will, upon | |
| request, grant a license under such patent rights to the requesting | |
| party subject to reasonable terms and conditions, and without | |
| incremental charge or fee. Such license shall be non-exclusive, and | |
| non-transferable, and shall be limited to implementations of the | |
| extension in combination with any conformance certified | |
| implementation of the OpenGL API. Such license is expressly | |
| contingent upon a grant back of a non-exclusive, royalty-free, | |
| perpetual, worldwide license to SGI and its OpenGL licensees under | |
| the requesting party's patent rights that are unavoidably infringed | |
| by all implementations of this extension or OpenGL. | |
| Issues | |
| * normal3 rather than normal? | |
| * other parameters, spotlight fall off, ... | |
| * implications of extended range colors. (do we clamp to [0,1]?) | |
| * TexturePath or DirectTexture rather than ApplyTexture? | |
| * special handling for alpha or luminance textures? (colormask?) | |
| * more tokens for driving multiple inputs, e.g. AMBIENT_DIFFUSE_AND_SPECULAR | |
| * normals need to be in the range [-1,1] | |
| when a texture is used as a normal, its components are scaled | |
| and biased to the range [-1,1]. | |
| New Procedures and Functions | |
| void ApplyTextureEXT(enum mode); | |
| void TextureLightEXT(enum pname) | |
| void TextureMaterialEXT(enum face, enum mode); | |
| New Tokens | |
| Accepted by the <mode> parameter of ApplyTextureEXT: | |
| FRAGMENT_MATERIAL_EXT 0x8349 | |
| FRAGMENT_NORMAL_EXT 0x834A | |
| FRAGMENT_DEPTH_EXT 0x8452 | |
| FRAGMENT_COLOR_EXT 0x834C | |
| (*note*: FRAGMENT_DEPTH_EXT value changed from 0x834B on promotion | |
| from SGIX, to avoid collision with EXT_fog_coord). | |
| Accepted by the <pname> parameter of TextureLightEXT: | |
| ATTENUATION_EXT 0x834D | |
| SHADOW_ATTENUATION_EXT 0x834E | |
| Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, | |
| and GetDoublev: | |
| TEXTURE_APPLICATION_MODE_EXT 0x834F | |
| TEXTURE_LIGHT_EXT 0x8350 | |
| TEXTURE_MATERIAL_FACE_EXT 0x8351 | |
| TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 | |
| Additions to Chapter 2 of the 1.1 Specification (OpenGL Operation) | |
| None | |
| Additions to Chapter 3 of the 1.1 Specification (Rasterization) | |
| Immediately before section 3.9 Fog: | |
| Section 3.X Texture Application | |
| The command | |
| ApplyTextureEXT(enum mode); | |
| determines how the color produced as a result of texture | |
| environment processing is used for subsequent fragment | |
| operations. Table 3.X.1 summarizes the interpretation of color | |
| values for the values of the <mode> parameter. | |
| -- | |
| FRAGMENT_COLOR_EXT color is used as fragment color value | |
| FRAGMENT_DEPTH_EXT color is used as fragment depth value | |
| FRAGMENT_LIGHT0_EXT color is specified parameter for fragment light 0 | |
| ... | |
| FRAGMENT_LIGHTn_EXT color is specified parameter for fragment light n | |
| FRAGMENT_MATERIAL_EXT color is specified material parameter(s) | |
| FRAGMENT_NORMAL_EXT color is used as fragment normal | |
| Table 3.X.1 ApplyTextureEXT | |
| -- | |
| If <mode> is FRAGMENT_COLOR_EXT then the post-texture-environment | |
| color is used as the fragment color during later fragment | |
| computations. This is the default behavior. If <mode> is not | |
| FRAGMENT_COLOR_EXT then the fragment color is the | |
| pre-texture-environment color. | |
| If <mode> is FRAGMENT_DEPTH_EXT then the red component of the | |
| post-texture-environment color replaces the depth value for the | |
| fragment. | |
| If <mode> is FRAGMENT_NORMAL_EXT then the R, G, and B components | |
| of the post-texture-environment color are used to compute the | |
| components nx, ny, and nz of the fragment normal vector as follows: | |
| nx = 2*R-1 | |
| ny = 2*G-1 | |
| nz = 2*B-1 | |
| In effect, the post-texture-environment color components are scaled | |
| and biased so that their range is [-1,1]. | |
| If <mode> is one of FRAGMENT_LIGHT0_EXT .. FRAGMENT_LIGHTn_EXT | |
| then the post-texture-environment color substitutes a fragment | |
| lighting parameter of the light indicated by <mode> during the | |
| lighting computation for that fragment. The substututed lighting | |
| parameter is specified by the TextureLightEXT command described | |
| in Section 3.X.2. | |
| If <mode> is FRAGMENT_MATERIAL_EXT then the | |
| post-texture-environment color substitutes a fragment material | |
| parameter during the lighting computation for that fragment. The | |
| fragment material parameter substituted is specified by the | |
| TextureMaterialEXT command described in Section 3.X.3. | |
| If <mode> is changed from FRAGMENT_MATERIAL_EXT or | |
| FRAGMENT_LIGHT0_EXT .. FRAGMENT_LIGHTn_EXT to another value, the | |
| corresponding material or light parameter reverts back to the | |
| current state value for that parameter, i.e., the value most | |
| recently specified with one of the FragmentMaterial{T}[v]EXT or | |
| FragmentLight{T}[v]EXT commands. In particular, the state | |
| parameters corresponding to the portions of the fragment lighting | |
| computations being substituted by the texture application mode | |
| continue to track the values specified by the | |
| FragmentMaterial{T}[v]EXT and FragmentLight{T}[v]EXT commands. | |
| Section 3.X.2 Texture Applied to Light Parameters | |
| The command | |
| TextureLightEXT(enum pname); | |
| determines which fragment light parameter is substituted with the | |
| post-texture-environment color when the texture application mode | |
| is one of the fragment lights. <pname> is one of AMBIENT, DIFFUSE, | |
| SPECULAR, or ATTENUATION_EXT. If <pname> is AMBIENT, DIFFUSE, or | |
| SPECULAR then the ambient, diffuse, or specular intensity | |
| parameter is substituted. If <pname> is ATTENUATION_EXT, then | |
| the attenuation term att_i from equation (2.4) is subsituted with | |
| the value of the red component of the post-texture-environment | |
| color. If <pname> is SHADOW_ATTENUATION_EXT then the fragment | |
| lighting equation is augmented with an additional attenuation term | |
| Shad_i: | |
| Cl = Em | |
| + Am*As | |
| SUM{_i = 0 through Nf-1} { | |
| + Shad_i*Atten_i*SpotL_i*{ | |
| + Am*Al_i | |
| + Dm*Dl_i*(N.L_i) | |
| + Sm*Sl_i*(N.H_i)^n | |
| } | |
| } | |
| with Shad_i coming from the red component of the post-texture-environment | |
| color. If a post-environment texture color is not applied to | |
| SHADOW_ATTENUATION_EXT for fragment light <i>, then Shad_i is effectively | |
| 1.0. | |
| Section 3.X.3 Texture Applied to Material Parameters | |
| The command | |
| TextureMaterialEXT(enum face, enum mode); | |
| determines which fragment material parameter is substituted with | |
| the post-texture-environment color when the texture application | |
| mode is FRAGMENT_MATERIAL_EXT. <face> is one of FRONT, BACK, or | |
| FRONT_AND_BACK, indicating whether the front material, back | |
| material, or both are affected by the current color. <mode> is on | |
| of EMISSION, AMBIENT, DIFFUSE, SPECULAR, SHININESS, or | |
| AMBIENT_AND_DIFFUSE and specifies which material property or | |
| properties are substituted with the post-texture-environment | |
| color. If <mode> is EMISSION, AMBIENT, DIFFUSE, or SPECULAR, then | |
| the value of e_cm, a_cm, d_cm, or s_cm from the fragment lighting | |
| equations, respectively, will be substituted with the | |
| post-texture-environment color. If <mode> is AMBIENT_AND_DIFFUSE, | |
| both a_cm and d_cm will be substituted. If <mode> is SHININESS, | |
| then s_rm will be substituted with 128.0*r, where r is the value | |
| of the red component of the post-texture-environment color. | |
| Section 3.X.4 Interactions with multiple textures | |
| The color computed during texture environment processing for each | |
| active texture can be independently controlled using | |
| ApplyTextureEXT. In the initial state all texture application | |
| modes are FRAGMENT_COLOR_EXT and the logical flow of fragment | |
| information through the OpenGL pipeline is shown in figure 3.X.5 | |
| with the result color of each texture environment stage serving as | |
| input for the following stage. | |
| Ct0 Ct1 Ctn | |
| | | | | |
| +------+ +------+ +------+ | |
| | | | | | | | |
| Cf -| TE0 |-->| TE1 |--> ... -->| TEn |--> Cf' (to fragment lighting/fog) | |
| | | | | | | | |
| +------+ +------+ +------+ | |
| Figure 3.X.5 | |
| If the application mode for texture <i> is set to something other | |
| than FRAGMENT_COLOR_EXT, then the input for texture environment | |
| <i+1> becomes the original pre-texturing fragment color Cf. If | |
| the application mode for texture <i> is returned to | |
| FRAGMENT_COLOR_EXT, then the input for texture environment <i+1> | |
| reverts back to the result from texture environment <i>. If i is | |
| the last texture in the chain, then the pre-texturing fragment | |
| color Cf is used for all subsequent fragment processing. Figure | |
| 3.X.6 illustrates the case for the application mode for texture 1 | |
| set to something other than FRAGMENT_COLOR_EXT. | |
| Ct0 Ct1 Ct2 Ctn | |
| | | ^ | | | |
| +------+ +------+ | +------+ +------+ | |
| | | | | | | | | | | |
| Cf -| TE0 |-->| TE1 |-+ +-| TE2 | ... -->| TEn |--> Cf' | |
| | | | | | | | | | | | |
| | +------+ +------+ | +------+ +------+ | |
| +------------------------+ | |
| Figure 3.X.6 | |
| It is possible for the application mode for more than one texture | |
| to refer to the identical parameter, for example, the FRONT | |
| DIFFUSE material color. Such conflicts are resolved by having the | |
| lowest numbered, enabled, texture provide the color value and any | |
| higher numbered textures are ignored. Note that when the | |
| application mode is FRAGMENT_LIGHTi_EXT, the TextureLightEXT | |
| <pname> parameter must be considered and when the application mode | |
| is FRAGMENT_MATERIAL_EXT that the <face> and <mode> parameters | |
| for TextureMaterialEXT must be considered. A partial overlap | |
| with the TextureMaterialEXT <face> and <mode> parameter (e.g., | |
| FRONT,DIFFUSE and FRONT_AND_BACK,DIFFUSE) is treated as a | |
| conflict. | |
| If there is a conflict between a material parameter being substituted | |
| through FragmentColorMaterialEXT and TextureMaterialEXT, then the color | |
| value assocaiated with the texture is ignored and the pre-texture fragment | |
| color value is substituted. | |
| Additions to Chapter 4 of the 1.1 Specification (Per-Fragment Operations | |
| and the Framebuffer) | |
| Additions to Chapter 5 of the 1.1 Specification (Special Functions) | |
| Additions to Chapter 6 of the 1.1 Specification (State and State Requests) | |
| Additions to the GLX Specification | |
| None | |
| GLX Protocol | |
| TBD | |
| Dependencies on EXT_fragment_lighting | |
| EXT_fragment_lighting is required since this extension pertains to how | |
| fragment lighting computations are performed and this extension makes no | |
| sense without fragment lighting. | |
| Dependencies on SGIX_color_range | |
| <this is a note, not a true dependency -db> | |
| The scale and bias of performed on colors when converting them | |
| to fragment normals is done regardless of whether SGIX_color_range is | |
| supported. | |
| Dependencies on EXT_multitexture | |
| If EXT_multitexture is not supported only the single | |
| post-texture-environment color is available for substitution and the | |
| discussion of multiple textures in section 3.X.4 is void. | |
| Dependencies on SGIX_shadow | |
| If SGIX_shadow is not supported then this extension does not define | |
| the attenuation multiplier term SHADOW_ATTENUATION_EXT. All discussion | |
| of this attenuation term is void. | |
| Errors | |
| INVALID_ENUM is generated if ApplyTextureEXT parameter <mode> is | |
| not FRAGMENT_MATERIAL_EXT, FRAGMENT_LIGHT0_EXT | |
| .. FRAGMENT_LIGHTn_EXT (where n is the value returned by querying | |
| MAX_FRAGMENT_LIGHTS_EXT), FRAGMENT_NORMAL_EXT, | |
| FRAGMENT_DEPTH_EXT, or FRAGMENT_COLOR_EXT. | |
| INVALID_ENUM is generated if TextureLightEXT parameter <pname> is | |
| not AMBIENT, DIFFUSE, SPECULAR, ATTENUATION_EXT, or | |
| SHADOW_ATTENUATION_EXT. | |
| INVALID_ENUM is generated if TextureMaterialEXT parameter <face> | |
| is not FRONT, BACK, or FRONT_AND_BACK or if parameter <mode> is | |
| not EMISSION, AMBIENT, DIFFUSE, SPECULAR, SHININESS, or | |
| AMBIENT_AND_DIFFUSE. | |
| INVALID_OPERATION is generated if ApplyTextureEXT, | |
| TextureLightEXT, or TextureMaterialEXT is executed between | |
| execution of Begin and the corresponding execution of End. | |
| New State | |
| Get Value Get Command Type Initial Value Attribute | |
| --------- ----------- ---- ------------- --------- | |
| TEXTURE_APPLICATION_MODE_EXT GetIntegerv Z10 FRAGMENT_COLOR_EXT texture | |
| TEXTURE_LIGHT_EXT GetIntegerv Z5 DIFFUSE texture | |
| TEXTURE_MATERIAL_FACE_EXT GetIntegerv Z3 FRONT_AND_BACK texture | |
| TEXTURE_MATERIAL_PARAMETER_EXT GetIntegerv Z6 AMBIENT_AND_DIFFUSE texture | |
| New Implementation Dependent State | |
| None |