| Name |
| |
| EXT_texenv_op |
| |
| Name Strings |
| |
| GL_EXT_texenv_op |
| |
| Contact |
| |
| Tom Frisinger (tfrisinger 'at' atitech.com) |
| Michael Gold (gold 'at' nvidia.com) |
| |
| Status |
| |
| XXX - Not complete yet!!! |
| |
| Version |
| |
| $Date: 1999/12/28 01:40:34 $ $Revision: 1.4 $ |
| ATI Date: 1999/03/02 12:00:00 Revision: 1.1 |
| |
| Number |
| |
| XXX |
| |
| Dependencies |
| |
| OpenGL 1.1 is required. |
| ARB_multitexture is required. |
| This specification is written against the OpenGL 1.2 specification. |
| |
| Overview |
| |
| The EXT_texenv_op extension defines a more expressive means for |
| programming the operations performed by the texture environment. It |
| defines new texture environment equations and allows explicit control |
| over the operands to the new equations. This explicit control can be |
| independently applied to the alpha and RGB color fragments. |
| |
| Issues |
| |
| * Should we include f, iv, and fv versions of the TexEnvOperand call. |
| |
| No, there seems to be no compelling reason to do so. |
| |
| * Should we try to wrap this entire interface into TexEnv or at least |
| the specification of the operation? |
| |
| Move operation specification into TexEnv, but keep TexEnvOperandiEXT |
| for operand specification. |
| |
| * Should a stage argument be added to TexEnvOperandiEXT to decouple from |
| the current unit selector? |
| |
| No. This goes against the ARB_multitexture implementation. We |
| have however allowed TEXTUREn_ARB as a value to the source |
| parameter of TexEnvOperandiEXT. This allows the texture fragment |
| to come from the texture bound to any legal texture unit stage. |
| |
| * Should a generic scale and bias term be added? |
| |
| Allow scales of 1.0, 2.0, and 4.0 to be applied to the output of |
| each stage. The scales can be independently applied to RGB and |
| Alpha. Generic biasing isn't allowed. However the ADD_SIGNED_EXT |
| operation effectively allows a bias of -0.5. |
| |
| * Should alpha and RGB operands be completely orthogonal? |
| |
| Yes. |
| |
| * This spec becomes much more powerful when ARB_multitexture is |
| available. However, it seemed like having the new texture environment |
| functions and control over operands available to implementations that |
| don't support ARB_multitexture could be useful. |
| |
| Make ARB_multitexture required. We define PREVIOUS_EXT to be |
| INCOMING_EXT for the texture unit 0 case so we could loosen up the |
| spec if need be. |
| |
| * IDENTITY_EXT and ONE_MINUS_EXT are the legal values to the mapping |
| parameter of TexEnvOperandiEXT. Other names such as COPY, INVERT, or |
| COMPLEMENT_EXT may or may not be more appropriate. |
| |
| Keep IDENTITY_EXT and ONE_MINUS_EXT they seem to be as good as any. |
| |
| * Should a third operand be introduced such that the blending operations |
| could be generalized to the following equation? |
| |
| Cv = CopA*(1- CopC) + CopB* CopC |
| |
| Yes, this is the INTERPOLATE_EXT operation. Interpolation in the |
| alpha channel is also permitted. |
| |
| * Should we make the OpenGL 1.1 modes programmable? For example should |
| setting the env. mode to MODULATE have the effect of changing the |
| TEXTURE_ENV_MODE_ALPHA_EXT, TEXTURE_ENV_MODE_RGB_EXT, OPERANDS, and |
| possibly the OPERATIONS to a given state that would correspond with |
| tables 3.18 and 3.19? |
| |
| Instead of this approach, we decided to go with the |
| non-programmable approach. For example MODULATE works as it |
| always did according to table 3.18 and 3.19 and does not change |
| TEXTURE_ENV_MODE_ALPHA_EXT, TEXTURE_ENV_MODE_RGB_EXT, OPERAND, |
| or OPERATION state. This adds a small amount of burden to the |
| driver but seems more consistent. |
| |
| * ALPHA_SCALE and RGB_SCALE_EXT accept only 1.0, 2.0 and 4.0. This look |
| like we are really doing a shift. Should the value be restricted to an |
| integer and indicate a shift instead of a scale? |
| |
| There is no reason to limit the domain of SCALE to an integer, |
| even if we only support integral values today. Lets keep it a |
| floating point value to allow future generalization. |
| |
| New Procedures and Functions |
| |
| void TexEnvOperandiEXT(enum pname, int source, int mapping, |
| int component); |
| |
| void GetTexEnvOperandivEXT(enum pname, enum query, int *param); |
| |
| New Tokens |
| |
| Accepted by <pname> parameter of TexEnvf, TexEnvi, TexEnvfv, TexEnviv, |
| GetTexEnviv, and GetTexEnvfv: |
| |
| TEXTURE_ENV_MODE_ALPHA_EXT 0x8570 |
| TEXTURE_ENV_MODE_RGB_EXT 0x8571 |
| RGB_SCALE_EXT 0x8572 |
| ALPHA_OPERATION_EXT 0x8590 |
| RGB_OPERATION_EXT 0x8598 |
| |
| Accepted by the <param> parameter of TexEnvf, TexEnvi, TexEnvfv, and |
| TexEnviv when the <pname> parameter is TEXTURE_ENV_MODE, |
| TEXTURE_ENV_MODE_ALPHA_EXT, or TEXTURE_ENV_MODE_RGB_EXT: |
| |
| A_TIMES_B_OP_C_EXT 0x8573 |
| INTERPOLATE_EXT 0x8574 |
| |
| Accepted by the <param> parameter of TexEnvf, TexEnvi, TexEnvfv, and |
| TexEnviv when the <pname> parameter is ALPHA_OPERATION_EXT or |
| RGB_OPERATION_EXT: |
| |
| ADD_SIGNED_EXT 0x8575 |
| SUTRACT_EXT 0x8576 |
| |
| Accepted by the <pname> parameter of TexEnvOperandiEXT and |
| GetTexEnvOperandivEXT: |
| |
| ALPHA_OPERAND_A_EXT 0x8580 |
| ALPHA_OPERAND_B_EXT 0x8581 |
| ALPHA_OPERAND_C_EXT 0x8582 |
| RGB_OPERAND_A_EXT 0x8588 |
| RGB_OPERAND_B_EXT 0x8589 |
| RGB_OPERAND_C_EXT 0x858A |
| |
| Accepted by the source parameter to TexEnvOperandiExt: |
| |
| CONSTANT_EXT 0x8577 |
| INCOMING_EXT 0x8578 |
| PREVIOUS_EXT 0x8579 |
| |
| Accepted by the mapping parameter to TexEnvOperandiExt: |
| |
| IDENTITY_EXT 0x857A |
| ONE_MINUS_EXT 0x857B |
| |
| Accepted by the query parameter to GetTexEnvOperandivEXT: |
| |
| SOURCE_EXT 0x857C |
| MAPPING_EXT 0x857D |
| COMPONENT_EXT 0x857E |
| |
| Additions to Chapter 1 of the GL Specification (Introduction) |
| |
| None |
| |
| Additions to Chapter 2 of the GL Specification (OpenGL Operation) |
| |
| None |
| |
| Additions to Chapter 3 of the GL Specification (Rasterization) |
| |
| Function Operation Equation |
| -------- --------- -------- |
| INTERPOLATE_EXT Av = AopA * (1-AopC) + AopB * AopC |
| A_TIMES_B_OP_C_EXT ADD Av = AopA * AopB + AopC |
| ADD_SIGNED_EXT Av = AopA * AopB + AopC - 0.5 |
| SUBTRACT_EXT Av = AopA * AopB - AopC |
| |
| Table 3.20: Alpha texture environment functions, operations and equations |
| |
| |
| Function Operation Equation |
| -------- --------- -------- |
| INTERPOLATE_EXT Cv = CopA * (1-CopC) + CopB * CopC |
| A_TIMES_B_OP_C_EXT ADD Cv = CopA * CopB + CopC |
| ADD_SIGNED_EXT Cv = CopA * CopB + CopC - 0.5 |
| SUBTRACT_EXT Cv = CopA * CopB - CopC |
| |
| Table 3.21: RGB texture environment functions, operations and equations |
| |
| |
| Operand Source Mapping Component |
| ------- ------ ------- --------- |
| ALPHA_OPERAND_A_EXT TEXTURE IDENTITY_EXT ALPHA |
| ALPHA_OPERAND_B_EXT TEXTUREn_ARB ONE_MINUS_EXT |
| ALPHA_OPERAND_C_EXT CONSTANT_EXT |
| INCOMING_EXT |
| PREVIOUS_EXT |
| ZERO |
| RGB_OPERAND_A_EXT TEXTURE IDENTITY_EXT ALPHA |
| RGB_OPERAND_B_EXT TEXTUREn_ARB ONE_MINUS_EXT RGB |
| RGB_OPERAND_C_EXT CONSTANT_EXT |
| INCOMING_EXT |
| PREVIOUS_EXT |
| ZERO |
| |
| Table 3.22: Inputs to TexEnvOperandiEXT |
| |
| |
| Texture LUMINANCE |
| Format ALPHA LUMINANCE ALPHA INTENSITY RGB RGBA |
| ------- ----- --------- ---------- --------- --- ---- |
| RGB 1.0 Lt Lt It Ct Ct |
| ALPHA At 1.0 At It 1.0 At |
| |
| Table 3.23: Texture fragment sources |
| |
| 3.8.9 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 |
| currently be the symbolic constant TEXTURE_ENV. 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 a pointer 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_MODE_ALPHA_EXT, |
| TEXTURE_ENV_MODE_RGB_EXT, ALPHA_OPERATION_EXT, RGB_OPERATION_EXT, |
| ALPHA_SCALE_EXT, RGB_SCALE_EXT, and TEXTURE_ENV_COLOR. |
| TEXTURE_ENV_MODE, TEXTURE_ENV_MODE_ALPHA_EXT, and |
| TEXTURE_ENV_MODE_RGB_EXT may be set to one of REPLACE, MODULATE, |
| DECAL, BLEND, A_TIMES_B_OP_C_EXT, or INTERPOLATE_EXT; |
| ALPHA_OPERATION_EXT and RGB_OPERATION_EXT may be set to one of ADD, |
| ADD_SIGNED_EXT, SUBTRACT_EXT; ALPHA_SCALE and RGB_SCALE_EXT are |
| single-precision floating point values that may have a value of 1.0, |
| 2.0, or 4.0. TEXTURE_ENV_COLOR is set to an RGBA color 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. |
| |
| The value of TEXTURE_ENV_MODE specifies an implicit texture function |
| if it is REPLACE, MODULATE, DECAL, or BLEND. 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 primary 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 primary 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.18, and the DECAL and BLEND texture functions are specified in table |
| 3.19. |
| |
| The texture function used to generate the Alpha component (Av) and the |
| RGB component (Rv, Gv, Bv) can be independently specified using |
| TEXTURE_ENV_MODE_ALPHA_EXT and TEXTURE_ENV_MODE_RGB_EXT respectively. |
| The alpha component will be computed in accordance to the alpha |
| equation for the given alpha texture function as specified in tables |
| 3.18 and 3.19. The RGB components will be computed in accordance to |
| the RGB equations for the given RGB texture function as specified in |
| tables 3.18 and 3.19. Queries to TEXTURE_ENV_MODE are supported for |
| compatibility and are equivalent to querying TEXTURE_ENV_MODE_RGB_EXT. |
| |
| The value of TEXTURE_ENV_MODE, TEXTURE_ENV_MODE_ALPHA_EXT, or |
| TEXTURE_ENV_MODE_RGB_EXT specifies an explicit texture function if it |
| is INTERPOLATE_EXT or A_TIMES_B_OP_C_EXT. Specifying TEXTURE_ENV_MODE |
| with a value of INTERPOLATE_EXT or A_TIMES_B_OP_C_EXT will result in |
| the setting of both TEXTURE_ENV_MODE_ALPHA_EXT and |
| TEXTURE_ENV_MODE_RGB_EXT to the given value. The result of this |
| function depends on the currently selected operands and in the case of |
| A_TIMES_B_OP_C_EXT the operation. In tables 3.20, 3.21, 3.22, and 3.23 |
| the following variables are used: |
| |
| AopA = ALPHA_OPERAND_A_EXT |
| AopB = ALPHA_OPERAND_B_EXT |
| AopC = ALPHA_OPERAND_C_EXT |
| CopA = RGB_OPERAND_A_EXT |
| CopB = RGB_OPERAND_B_EXT |
| CopC = RGB_OPERAND_C_EXT |
| |
| All of these color and alpha values are clamped to the range [0,1]. |
| |
| and: |
| |
| Ac, Af, At, Av, Ct, It, and Lt have the same meaning as in tables 3.18 |
| and 3.19. |
| |
| See tables 3.20 and 3.21 for the specifics of the texture functions. |
| |
| ALPHA_OPERATION_EXT specifies the texture environment operation to be |
| applied to the alpha component of the color fragment. |
| RGB_OPERATION_EXT specifies the texture environment operation to be |
| applied to the RGB component of the color fragment. This operation is |
| only applicable when the texture environment mode is A_TIMES_B_OP_C |
| and can have a value of ADD, ADD_SIGNED_EXT, or SUBTRACT_EXT. See |
| tables 3.20 and 3.21 for texture operation equations. |
| |
| The values for ALPHA_SCALE and RGB_SCALE_EXT specify the amount of |
| scaling to be applied to the Alpha and RGB output of each texture unit |
| stage. Valid values are 1.0, 2.0, and 4.0. Scaling happens prior to |
| clamping of Rv, Gv, Bv, and Av to the range [0,1]. |
| |
| The command |
| |
| void TexEnvOperandiEXT(enum pname, int source, int mapping, int |
| component); |
| |
| is used to set the operands to the texture function operation. <pname> |
| is a symbolic constant indicating the parameter to be set; the |
| possible constants and corresponding parameters are summarized in |
| table 3.22. |
| |
| When <pname> is set to ALPHA_OPERAND_l_EXT, the alpha component of |
| operand l is modified. When <pname> is set to RGB_OPERAND_l_EXT, the RGB |
| component of operand l is modified. |
| |
| <source> specifies the source of the operand data. TEXTURE specifies to |
| use the filtered texture fragment from the current texture unit as an |
| operand. TEXTUREn_ARB specifies to use the filtered texture fragment |
| from the nth texture unit. When <source> is set to TEXTURE or |
| TEXTUREn_ARB the value of the texture fragment depends on the base |
| internal formats of the texture arrays that were last specified (see |
| Table 3.23). CONSTANT_EXT specifies to use the constant texture |
| environment color as the fragment. INCOMING_EXT specifies to use the |
| incoming fragment color. PREVIOUS_EXT indicates that the input to the |
| operand comes from the specified output of the previous texture unit. |
| If the current selected texture unit is texture unit 0, then |
| PREVIOUS_EXT has the same meaning as INCOMING_EXT (i.e. the input to |
| operand is the incoming fragment). |
| |
| <mapping> specifies what operation will be done to the source fragment |
| prior to its use as an operand. IDENTITY_EXT specifies that no |
| operation will be done on the fragment. ONE_MINUS specifies that 1.0 |
| minus the fragment color will be used as an operand. |
| |
| <component> specifies which part of the source fragment color to use. |
| <component> must be ALPHA when pname is ALPHA_OPERAND_l_EXT. Valid |
| values for <component> are ALPHA and RGB when <pname> is |
| RGB_OPERAND_l_EXT. |
| |
| The state required for the current texture environment consists of two |
| six-valued integers indicating the texture rgb and alpha functions; |
| the four floating-point TEXTURE_ENV_COLOR values; two three-valued |
| integers representing the RGB and ALPHA operations; two floating point |
| RGB_SCALE_EXT and ALPHA_SCALE values; six n-valued integers |
| representing the RGB and ALPHA OPERAND A,B and C values, where n |
| equals five plus the number of texture units; six two-valued integers |
| representing the operand mappings; and three two-valued integers |
| representing the component selection of the RGB_OPERANDs. In the |
| initial state, the texture RGB and ALPHA functions are MODULATE; the |
| TEXTURE_ENV_COLOR is (0,0,0,0); the RGB and ALPHA operations are ADD; |
| the RGB and ALPHA scales are 1.0; the RGB_OPERAND_A_EXT and |
| ALPHA_OPERAND_A_EXT sources are both PREVIOUS_EXT; the |
| RGB_OPERAND_B_EXT and ALPHA_OPERAND_B_EXT sources are both TEXTURE; |
| the RGB_OPERAND_C_EXT and ALPHA_OPERAND_C_EXT sources are both ZERO; |
| all operand mappings are IDENTITY_EXT; all RGB operand components are |
| RGB; and all ALPHA operand mappings are ALPHA. |
| |
| 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) |
| |
| 3. Enumerated Queries |
| |
| void GetTexEnvOperandivEXT(enum pname, enum query, int *param); |
| |
| GetTexEnvOperandivEXT places information about <query> (a symbolic |
| constant) for <pname> (also symbolic constant) in <param>. |
| |
| Additions to the GLX Specification |
| |
| None |
| |
| GLX Protocol |
| |
| TBD |
| |
| Errors |
| |
| INVALID_ENUM is generated when target or pname parameters of TexEnvi |
| or TexEnvf are not one of the accepted defined values, or when params |
| should have a defined constant value (based on the value of pname) and |
| does not. |
| |
| INVALID_ENUM is generated when pname, source, mapping, or component |
| parameters of TexEnvOperandiEXT are not one of the accepted defined |
| values. |
| |
| INVALID_ENUM is generated when pname parameter of |
| GetTexEnvOperandEXTiv is not one of the accepted defined values. |
| |
| INVALID_OPERATION is generated if TexEnvOperandiEXT, or |
| GetTexEnvOperandivEXT are executed between execution of Begin and the |
| corresponding execution of End. |
| |
| New State |
| |
| All new state belongs to Section 3.8.9. All new state has an attribute |
| of 'texture'. These are additions/modifications to table 6.14. |
| |
| |
| Get Value Type Get Command Initial Value |
| --------- ---- ----------- ------------ |
| TEXTURE_ENV_MODE_ALPHA_EXT Z6 GetTexEnviv MODULATE |
| TEXTURE_ENV_MODE_RGB_EXT Z6 GetTexEnviv MODULATE |
| ALPHA_SCALE R GetTexEnvfv 1.0 |
| RGB_SCALE_EXT R GetTexEnvfv 1.0 |
| ALPHA_OPERATION_EXT Z3 GetTexEnviv ADD |
| RGB_OPERATION_EXT Z3 GetTexEnviv ADD |
| SOURCE_EXT 6 X GetTexEnvOperandivEXT PREVIOUS_EXT for |
| Z6 ALPHA_OPERAND_A_EXT |
| |
| PREVIOUS_EXT for |
| RGB_OPERAND_A_EXT |
| |
| TEXTURE for |
| ALPHA_OPERAND_B_EXT |
| |
| TEXTURE for |
| RGB_OPERAND_B_EXT |
| |
| ZERO for |
| ALPHA_OPERAND_C_EXT |
| |
| ZERO for |
| RGB_OPERAND_C_EXT |
| |
| MAPPING_EXT 6 X GetTexEnvOperandivEXT IDENTITY_EXT for |
| Z2 ALPHA_OPERAND_A_EXT |
| |
| IDENTITY_EXT for |
| RGB_OPERAND_A_EXT |
| |
| IDENTITY_EXT for |
| ALPHA_OPERAND_B_EXT |
| |
| IDENTITY_EXT for |
| RGB_OPERAND_B_EXT |
| |
| IDENTITY_EXT for |
| ALPHA_OPERAND_C_EXT |
| |
| IDENTITY_EXT for |
| RGB_OPERAND_C_EXT |
| |
| COMPONENT_EXT 6 X GetTexEnvOperandivEXT ALPHA for |
| Z2 ALPHA_OPERAND_A_EXT |
| |
| RGB for |
| RGB_OPERAND_A_EXT |
| |
| ALPHA for |
| ALPHA_OPERAND_B_EXT |
| |
| RGB for |
| RGB_OPERAND_B_EXT |
| |
| ALPHA for |
| ALPHA_OPERAND_C_EXT |
| |
| RGB for |
| RGB_OPERAND_C_EXT |
| |
| Table 6.14: Texture Environment and Generation |
| |
| New Implementation Dependent State |
| |
| None |