blob: 4cb655b98ed13e308840cae2980a19a089ef9b3b [file] [log] [blame]
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