Name EXT_texture_env Name Strings GL_EXT_texture_env Version $Date: 1998/05/12 23:52:26 $ $Revision: 1.5 $ Number 146 Dependencies OpenGL 1.1 is required. OpenGL 1.2 affects the definition of this spec. EXT_multitexture affects the definition of this spec. This specification is written against the OpenGL 1.2 specification. Overview A new texture environment is defined which supports the following equations: Cv = Cf COPY Cv = Ct REPLACE Cv = Cf * Ct MODULATE Cv = Cf + Ct ADD Cv = Cf - Ct SUBTRACT Cv = Ct - Cf REVERSE_SUBTRACT Cv = aCf + (1-a)Ct BLEND Cv = aCt + (1-a)Cf REVERSE_BLEND where a is the incoming fragment's alpha value These functions may be independently selected for color and alpha processing. The BLEND function is not available for alpha processing. Additionally a scale factor of 2^0, 2^1, or 2^2 may be applied to the final result. Issues * The functions are added as a `suite' in a new texture environment. An alternative would be to retrofit them into the existing texture environment. There would likely be a clash with SGIX_texture_add_env and with the DECAL/BLEND environment which are similar yet different from the new BLEND function. Also the separate specification of the alpha texture function seems awkward, and we specified a new behavior for the new texture environment when texturing is disabled. * I chose the name EXT_texture_env as it really is an extension to texture environment to add a new environment. Should it have some other name, e.g., EXT_texture_env1? * A new enable is defined for TEXTURE_ENV1_EXT which causes it to be activated over TEXTURE_ENV. No enable is defined for TEXTURE_ENV as it is considered to be enabled always. The OpenGL spec uses the term 'currently bound environment' should we be doing something that looks more bind like or changing the language to something like currently selected/enabled environment? * There is no constant color term in TEXTURE_ENV1_EXT. The functionality is still available in TEXTURE_ENV and I'm not sure there is a compelling reason to integrate the constant term here. * The BLEND function is fairly restrictive. Should it be more general? e.g. reverse the blending factor? Resolved: YES. add REVERSE_BLEND. * The rules for alpha-only and alpha-less textures are very regular the color components of an alpha-only texture are substituted with zero and the alpha component of an alpha-less texture is substituted with one. Are these the right rules? * If texturing is disabled, environment computations are still performed in this new texture environment, whereas they are not in the old environment (to preserve compatibility). This sets the stage for texture environments performing functions which do not involve a texture though perhaps it is a little awkward. * Enumerants are screwy. Should we add new _EXT enumerants for COPY, REPLACE, ADD, MODULATE, BLEND, as was done for the original texture extension or reuse these existing tokens and just add SUBTRACT, REVERSE_SUBTRACT, and REVERSE_BLEND? I chose to add new enumerants which are prefixed with ENV_. The main reason is to allow them to have contiguous values and leave some room for expansion to ensure that they can be switched with minimal parameter validation cost. * Should a scale & bias be defined as part of this extension or as a separate add-on to the environment processing? * Possible add-on extensions (in the context of multitexture): 1) source and blend factor specification for the BLEND/REVERSE_BLEND functions by generalizing BLEND/REVERSE_BLEND to x*Cf + y*Ct / x*Ct + y*Cf and allow x to be specified by TEXTURE_ENV_SRC_FACTOR and y by TEXTURE_ENV_DST_FACTOR with possible src and dst factors ONE ZERO FRAGMENT_ALPHA alpha from previous environment stage TEXTURE_ALPHA alpha from texture PRETEXTURE_ALPHA original pre-texture alpha value FRAGMENT_ALPHA_MINUS_ONE TEXTURE_ALPHA_MINUS_ONE PRETEXTURE_ALPHA_MINUS_ONE 2) Add some muxing to the inputs of the equations. The basic equation set is Cf (copy) Cf*Ct (modulate) Cf+Ct (add/sub/rsub) a*Cf+(1-a)*Ct (blend/rblend) so allow a more flexible binding on Cf & Ct TEXTURE_ENV_SRC (default is FRAGMENT) TEXTURE_ENV_DST (default is TEXTURE) choices: FRAGMENT TEXTURE PRETEXTURE 3) extension 2) gives a good chunk of the functionality of 1) perhaps we could avoid 1) altogether or change 1) to allow a more restrictive selection of the blend factor (simultaneously choosing both a and (1-a): TEXTURE_ENV_BLEND_FACTOR choices: FRAGMENT TEXTURE PRETEXTURE New Procedures and Functions None New Tokens Accepted by the parameter of TexEnvf, TexEnvi, TexEnvfv, TexEnvfi, GetTexEnviv, GetTexEnvfv, GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, and the parameter of Enable, Disable, and IsEnabled TEXTURE_ENV0_EXT 0x???? TEXTURE_ENV1_EXT TEXTURE_ENV0_EXT+1 Accepted by the parameter of TexEnvf, TexEnvi, TexEnvfv, TexEnvfi, GetTexEnviv and GetTexEnvfv when the parameter value is TEXTURE_ENV1_EXT TEXTURE_ENV_MODE_ALPHA_EXT 0x???? Accepted by the parameter of TexEnvf, TexEnvi, TexEnvfv, and TexEnvfi when the parameter value is TEXTURE_ENV1_EXT and the parameter value is TEXTURE_ENV_MODE or TEXTURE_ENV_MODE_ALPHA_EXT ENV_COPY_EXT 0x???? ENV_REPLACE_EXT 0x???? ENV_MODULATE_EXT 0x???? ENV_ADD_EXT 0x???? ENV_SUBTRACT_EXT 0x???? ENV_REVERSE_SUBTRACT_EXT 0x???? ENV_BLEND_EXT 0x???? ENV_REVERSE_BLEND_EXT 0x???? Accepted by the parameter of TexEnvf, TexEnvi, TexEnvfv, TexEnvfi, GetTexEnviv, and GetTexEnvfv TEXTURE_ENV_SHIFT_EXT 0x???? Additions to Chapter 2 of the GL Specification (OpenGL Operation) None Additions to Chapter 3 of the GL Specification (Rasterization) Texture Environment 1 ---------------------- Base Texture Format COPY REPLACE MODULATE ADD ------------------- ---- ------- -------- --- ALPHA Rf 0 Rf*0 Rf+0 Gf 0 Gf*0 Rf+0 Bf 0 Bf*0 Rf+0 Af At Af*At Af+At LUMINANCE Rf Lt Rf*Lt Rf+Lt Gf Lt Gf*Lt Gf+Lt Bf Lt Bf*Lt Bf+Lt Af 1 Af*1 Af+1 LUMINANCE_ALPHA Rf Lt Rf*Lt Rf+Lt Gf Lt Gf*Lt Gf+Lt Bf Lt Bf*Lt Bf+Lt Af At Af*At Af+At INTENSITY Rf It Rf*It Rf+It Gf It Gf*It Gf+It Bf It Bf*It Bf+It Af It Af*It Af+It RGB Rf Rt Rf*Rt Rf+Rt Gf Gt Gf*Gt Gf+Gt Bf Bt Bf*Bt Bf+Bt Af 1 Af*1 Af+1 RGBA Rf Rt Rf*Rt Rf+Rt Gf Gt Gf*Gt Gf+Gt Bf Bt Bf*Bt Bf+Bt Af At Af*At Af+At Base Texture Format SUBTRACT REVERSE_ BLEND REVERSE_ SUBTRACT BLEND ------------------- -------- -------- --------------- ------------- ALPHA Rf-0 0-Rf Af*Rf+(1-Af)*0 Af*0+(1-Af)*Rf Gf-0 0-Gf Af*Gf+(1-Af)*0 Af*0+(1-Af)*Gf Bf-0 0-Bf Af*Bf+(1-Af)*0 Af*0+(1-Af)*Bf Af-At At-Af N/A N/A LUMINANCE Rf-Lt Lt-Rf Af*Rf+(1-Af)*Lt Af*Lt+(1-Af)*Rf Gf-Lt Lt-Gf Af*Gf+(1-Af)*Lt Af*Lt+(1-Af)*Gf Bf-Lt Lt-Bf Af*Bf+(1-Af)*Lt Af*Lt+(1-Af)*Bf Af-1 1-Af N/A N/A LUMINANCE_ALPHA Rf-Lt Lt-Rf Af*Rf+(1-Af)*Lt Af*Lt+(1-Af)*Rf Gf-Lt Lt-Gf Af*Gf+(1-Af)*Lt Af*Lt+(1-Af)*Gf Bf-Lt Lt-Bf Af*Bf+(1-Af)*Lt Af*Lt+(1-Af)*Bf Af-At At-Af N/A N/A INTENSITY Rf-It It-Rf Af*Rf+(1-Af)*It Af*It+(1-Af)*Rf Gf-It It-Gf Af*Gf+(1-Af)*It Af*It+(1-Af)*Gf Bf-It It-Bf Af*Bf+(1-Af)*It Af*It+(1-Af)*Bf Af-It It-Af N/A N/A RGB Rf-Rt Rt-Rf Af*Rf+(1-Af)*Rt Af*Rt+(1-Af)*Rf Gf-Gt Gt-Gf Af*Gf+(1-Af)*Gt Af*Gt+(1-Af)*Gf Bf-Bt Bt-Bf Af*Bf+(1-Af)*Bt Af*Bt+(1-Af)*Bf Af-1 1-Af N/A N/A RGBA Rf-Rt Rt-Rf Af*Rf+(1-Af)*Rt Af*Rt+(1-Af)*Rf Gf-Gt Gt-Gf Af*Gf+(1-Af)*Gt Af*Gt+(1-Af)*Gf Bf-Bt Bt-Bf Af*Bf+(1-Af)*Bt Af*Bt+(1-Af)*Bf Af-At At-Af N/A N/A Tables 3.12 and 3.13: Texture functions for TEXTURE_ENV1. Section 3.8.5 Texture Environments and Texture Functions The command void TexEnv{if}( enum target, enum pname, T param ) ; void TexEnv{if}v( enum target, enum pname, T params ) ; sets parameters of the that specifies how texture values are interpreted when texturing a fragment. must be the symbolic constant TEXTURE_ENV0_EXT or TEXTURE_ENV1_EXT. is a symbolic constant indicating the parameter to be set. In the first form of the command, is a value to which to set a single-valued parameter; in the second form, is point to an array of parameters: either a single symbolic constant or a value or group of values to which the parameter should be set. The possible environment parameters are TEXTURE_ENV_MODE, TEXTURE_ENV_COLOR, and TEXTURE_ENV_COORD_SET_EXT. TEXTURE_ENV_MODE may be set to one of REPLACE, MODULATE, DECAL, or BLEND; TEXTURE_ENV_COLOR is set to an RGBA color by providing four single-precision floating-point values in the range [0,1](values outside this range are clamped to it). If integers are provided for TEXTURE_ENV_COLOR, then they are converted to floating-point as specified in Table 2.6 for signed integers. TEXTURE_ENV_COORD_SET_EXT may be set to one of TEXTURE0_EXT .. TEXTURE_EXT where is one less than the number of supported texture coordinate sets. If floating-point values are supplied, they are rounded to the nearest integer. The value of TEXTURE_ENV_MODE specifies a texture function. The result of this function depends on the fragment and the texture array value. The precise form of the function depends on the base internal formats of the texture arrays that were last specified. In the following two tables Rf, Gf, Bf, and Af are the color components of the incoming fragment; Rt, Gt, Bt, At, Lt, and It are the filtered texture values; Rc, Gc, Bc, and Ac are the texture environment color values; and Rv, Gv, Bv, and Av are the color components computed by the texture function. All of these color values are in the range [0,1]. The REPLACE and MODULATE texture functions are specified in Table 3.10, and the DECAL and BLEND texture functions are specified in Table 3.11. The value of TEXTURE_ENV_COORD_SET_EXT specifies which set of fragment texture coordinates are used to determine the texture value used in the texture function. The same set of texture coordinates may be simultaneously used by multiple textures. Specifying Enable with a parameter of TEXTURE_ENV1_EXT selects an alternate texture environment with a different set of texture functions. When TEXTURE_ENV1_EXT is enabled this environment supersedes texture environment zero. Specifying TexEnv with a parameter of TEXTURE_ENV1_EXT selects the TEXTURE_ENV1_EXT environment for modification. The possible environment parameters for TEXTURE_ENV1_EXT are TEXTURE_ENV_MODE, TEXTURE_ENV_MODE_ALPHA_EXT, TEXTURE_ENV_SHIFT_EXT, and TEXTURE_ENV_COORD_SET_EXT. TEXTURE_ENV_MODE may be set to one of ENV_COPY_EXT, ENV_REPLACE_EXT, ENV_MODULATE_EXT, ENV_ADD_EXT, ENV_SUBTRACT_EXT, ENV_REVERSE_SUBTRACT_EXT, ENV_BLEND_EXT, or ENV_REVERSE_BLEND_EXT. TEXTURE_ENV_MODE_ALPHA_EXT may be set to one of ENV_COPY_EXT, ENV_REPLACE_EXT, ENV_MODULATE_EXT, ENV_ADD_EXT, ENV_SUBTRACT_EXT, or ENV_REVERSE_SUBTRACT_EXT. TEXTURE_ENV_SHIFT_EXT is set to a four-value integer scale factor by providing four integers in the range [0,2]. TEXTURE_ENV_COORD_SET_EXT may be set to one of TEXTURE0_EXT .. TEXTURE_EXT where is the one less than the number of supported texture coordinate sets. If floating-point values are specified for either TEXTURE_ENV_SHIFT_EXT or TEXTURE_ENV_COORD_SET_EXT they are rounded to the nearest integer. The value TEXTURE_ENV_MODE specifies a texture function for the R, G, and B components and the value of TEXTURE_ENV_MODE_ALPHA_EXT specifies a texture function for the A component. The computed color components Rv, Gv, Bv, and Av are given by the equations: Rv = Rx*(2^Rs), Gv = Gx*(2^Gs), Bv = Bx*(2^Bs) and Av = Ax*(2^As), where the functions for Rx, Gx, Bx, and Ax are specified in Tables 3.12 and 3.13, and Rs, Gs, Bs, and As are the scaling factors specified with TEXTURE_ENV_SHIFT_EXT. The ENV_COPY_EXT, ENV_REPLACE_EXT, ENV_MODULATE_EXT, and ENV_ADD_EXT functions are specified in Table 3.12, and the ENV_SUBTRACT_EXT, ENV_REVERSE_SUBTRACT_EXT, ENV_BLEND_EXT, and ENV_REVERSE_BLEND_EXT functions are specified in Table 3.13. The state required for texture environment TEXTURE_ENV0_EXT consists of the four-valued integer indicating the texture function, four floating- point TEXTURE_ENV_COLOR values and one MAX_TEXTURE_COORD_SETS_EXT-valued integer indicating the texture coordinate set binding. The state required for texture environment TEXTURE_ENV1_EXT consists of the seven-valued integer indicating the texture function for the R,G, and B components, the five-valued integer indicating the texture function for the A component, four integer-valued TEXTURE_ENV_SHIFT_EXT values, one bit indicating whether TEXTURE_ENV1 is enabled, and one MAX_TEXTURE_COORD_SETS_EXT-valued integer indicating the texture coordinate set binding. In the initial state, the texture functions for both environments is given by MODULATE, TEXTURE_ENV_COORD_SET_EXT is given by TEXTURE0_EXT in both environments, TEXTURE_ENV_COLOR in environment zero is (0,0,0,0), TEXTURE_ENV_SHIFT_EXT in environment one is (0,0,0,0) and TEXTURE_ENV1_EXT is FALSE. 3.8.6 Texture Application Texture is enabled or disabled using the generic Enable and Disable commands, respectively, with the symbolic constant TEXTURE_1D or TEXTURE_2D to enable the one-dimensional or two-dimensional texture, respectively. If both one- and two-dimensional textures are enabled, the two dimensional texture is used. If all texturing is disabled and the currently bound texture environment is TEXTURE_ENV0_EXT, a rasterized fragment is passed on unaltered to the next stage of the GL (although its texture coordinates may be discarded). If TEXTURE_ENV1_EXT is the current texture environment, the filtered texture values Rt, Gt, Bt, At, Lt, and It are replaced with 1. Otherwise, a texture value is found according to the parameter values of the currently bound texture image of the appropriate dimensionality using the rules given in sections 3.8.1 and 3.8.2. This texture value is used along with the incoming fragment in computing the texture function indicated by the currently bound texture environment. The result of this function replaces the incoming fragment's R, G, B, and A values. These are the color values passed to subsequent operations. Other data associated with the incoming fragment remain unchanged, except that the texture coordinates may be discarded. The required state us two bits indicating whether each of one- or two-dimensional texturing is enabled or disabled. In the initial state, all texturing is disabled. Additions to Chapter 4 of the GL Specification (Per-Fragment Operations and the Framebuffer) None Additions to Chapter 5 of the GL Specification (Special Functions) None Additions to Chapter 6 of the GL Specification (State and State Requests) The value of the texture environment shift is queried by calling GetTexEnviv, and GetTexEnvfv with the parameter set of TEXTURE_ENV1 and the parameter to TEXTURE_ENV_SHIFT_EXT. Additions to the GLX Specification None GLX Protocol TBD Dependencies on EXT_texture3D If EXT_texture3D is not supported then the functionality and state associated with EXT_texture3D does not exist and is not supported. (this is more a note that section 3.8.6 should refer to texture3D too) Dependencies on EXT_multitexture If EXT_multitexture is not supported then the functionality and state associated with EXT_multitexture does not exist and the description of TEXTURE_ENV_COORD_SET_EXT is void. If it is supported, then the state associated with texture environment TEXTURE_ENV1_EXT exists for each active texture. Errors INVALID_VALUE is generated if value for TEXTURE_ENV_SHIFT is not one of 0, 1, or 2. INVALID_ENUM is generated if parameter of TexEnvi or TexEnvf is TEXTURE_ENV1_EXT and parameter is not TEXTURE_ENV_MODE or TEXTURE_ENV_MODE_ALPHA_EXT. INVALID_ENUM is generated if parameter of TexEnvi, TexEnvf TexEnviv, TexEnvfv, GetTexEnviv, or GetTexEnvfv is TEXTURE_ENV1_EXT and parameter is not TEXTURE_ENV_MODE, TEXTURE_ENV_MODE_ALPHA_EXT, or TEXTURE_ENV_SHIFT_EXT. INVALID_ENUM is generated if parameter of TexEnvi, TexEnvf TexEnviv, or TexEnvfv is TEXTURE_ENV1_EXT, parameter is TEXTURE_ENV_MODE and or value is not one of ENV_COPY_EXT, ENV_REPLACE_EXT, ENV_MODULATE_EXT, ENV_ADD_EXT, ENV_SUBTRACT_EXT, ENV_REVERSE_SUBTRACT_EXT, ENV_BLEND_EXT, or ENV_REVERSE_BLEND_EXT INVALID_ENUM is generated if parameter of TexEnvi, TexEnvf TexEnviv, or TexEnvfv is TEXTURE_ENV1_EXT, parameter is TEXTURE_ENV_MODE_ALPHA_EXT and or value is not one of ENV_COPY_EXT, ENV_REPLACE_EXT, ENV_MODULATE_EXT, ENV_ADD_EXT, ENV_SUBTRACT_EXT, or ENV_REVERSE_SUBTRACT_EXT. New State Get Value Get Command Type Initial Value Attribute --------- ----------- ---- ------------- --------- TEXTURE_ENV1_EXT IsEnabled B FALSE enable/texture TEXTURE_ENV_SHIFT_EXT GetTexEnviv Z4 (0, 0, 0, 0) texture TEXTURE_ENV1,MODE GetTexEnviv Z7 MODULATE texture TEXTURE_ENV1,MODE_ALPHA GetTexEnviv Z5 MODULATE texture New Implementation Dependent State None