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 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 parameter of TextureLightEXT: ATTENUATION_EXT 0x834D SHADOW_ATTENUATION_EXT 0x834E Accepted by the 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 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 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 is not FRAGMENT_COLOR_EXT then the fragment color is the pre-texture-environment color. If is FRAGMENT_DEPTH_EXT then the red component of the post-texture-environment color replaces the depth value for the fragment. If 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 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 during the lighting computation for that fragment. The substututed lighting parameter is specified by the TextureLightEXT command described in Section 3.X.2. If 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 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. is one of AMBIENT, DIFFUSE, SPECULAR, or ATTENUATION_EXT. If is AMBIENT, DIFFUSE, or SPECULAR then the ambient, diffuse, or specular intensity parameter is substituted. If 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 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 , 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. is one of FRONT, BACK, or FRONT_AND_BACK, indicating whether the front material, back material, or both are affected by the current color. 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 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 is AMBIENT_AND_DIFFUSE, both a_cm and d_cm will be substituted. If 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 is set to something other than FRAGMENT_COLOR_EXT, then the input for texture environment becomes the original pre-texturing fragment color Cf. If the application mode for texture is returned to FRAGMENT_COLOR_EXT, then the input for texture environment reverts back to the result from texture environment . 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 parameter must be considered and when the application mode is FRAGMENT_MATERIAL_EXT that the and parameters for TextureMaterialEXT must be considered. A partial overlap with the TextureMaterialEXT and 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 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 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 is not AMBIENT, DIFFUSE, SPECULAR, ATTENUATION_EXT, or SHADOW_ATTENUATION_EXT. INVALID_ENUM is generated if TextureMaterialEXT parameter is not FRONT, BACK, or FRONT_AND_BACK or if parameter 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