| 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 <target> parameter of TexEnvf, TexEnvi, TexEnvfv, TexEnvfi, |
| GetTexEnviv, GetTexEnvfv, GetBooleanv, GetIntegerv, GetFloatv, GetDoublev, |
| and the <cap> parameter of Enable, Disable, and IsEnabled |
| |
| TEXTURE_ENV0_EXT 0x???? |
| TEXTURE_ENV1_EXT TEXTURE_ENV0_EXT+1 |
| <leave room for 14 more environments> |
| |
| Accepted by the <pname> parameter of TexEnvf, TexEnvi, TexEnvfv, TexEnvfi, |
| GetTexEnviv and GetTexEnvfv when the <target> parameter value is |
| TEXTURE_ENV1_EXT |
| |
| TEXTURE_ENV_MODE_ALPHA_EXT 0x???? |
| |
| |
| Accepted by the <params> parameter of TexEnvf, TexEnvi, TexEnvfv, and |
| TexEnvfi when the <target> parameter value is TEXTURE_ENV1_EXT and the |
| <pname> 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 <pname> 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 <texture environment> that specifies how texture |
| values are interpreted when texturing a fragment. <target> must be the |
| symbolic constant TEXTURE_ENV0_EXT or TEXTURE_ENV1_EXT. <pname> is a |
| symbolic constant indicating the parameter to be set. In the first form of |
| the command, <param> is a value to which to set a single-valued parameter; |
| in the second form, <params> 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<n>_EXT where <n> 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 <cap> 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 <target> 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<n>_EXT where <n> 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 <target> parameter set of TEXTURE_ENV1 |
| and the <pname> 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 <params> value for TEXTURE_ENV_SHIFT |
| is not one of 0, 1, or 2. |
| |
| INVALID_ENUM is generated if <target> parameter of TexEnvi or TexEnvf |
| is TEXTURE_ENV1_EXT and <pname> parameter is not TEXTURE_ENV_MODE |
| or TEXTURE_ENV_MODE_ALPHA_EXT. |
| |
| INVALID_ENUM is generated if <target> parameter of TexEnvi, TexEnvf |
| TexEnviv, TexEnvfv, GetTexEnviv, or GetTexEnvfv is TEXTURE_ENV1_EXT |
| and <pname> parameter is not TEXTURE_ENV_MODE, TEXTURE_ENV_MODE_ALPHA_EXT, |
| or TEXTURE_ENV_SHIFT_EXT. |
| |
| INVALID_ENUM is generated if <target> parameter of TexEnvi, TexEnvf |
| TexEnviv, or TexEnvfv is TEXTURE_ENV1_EXT, <pname> parameter is |
| TEXTURE_ENV_MODE and <param> or <params> 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 <target> parameter of TexEnvi, TexEnvf |
| TexEnviv, or TexEnvfv is TEXTURE_ENV1_EXT, <pname> parameter is |
| TEXTURE_ENV_MODE_ALPHA_EXT and <param> or <params> 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 |