Texture coordinates associated with a vertex may either be taken from the current texture coordinates or generated according to a function dependent on vertex coordinates. The command
void TexGen[ifd] ( enum coord, enum pname, T param ) ;
void TexGen[ifd]v ( enum coord, enum pname, T params ) ;
controls texture coordinate generation. coord must be one of the constants S, T, R, or Q, indicating that the pertinent coordinate is the s, t, r, or q coordinate, respectively. In the first form of the command, param is a symbolic constant specifying a single-valued texture generation parameter; in the second form, params is a pointer to an array of values that specify texture generation parameters. pname must be one of the three symbolic constants TEXTURE_GEN_MODE, OBJECT_PLANE, or EYE_PLANE. If pname is TEXTURE_GEN_MODE, then either params points to or param is an integer that is one of the symbolic constants OBJECT_LINEAR, EYE_LINEAR, or SPHERE_MAP.
If TEXTURE_GEN_MODE indicates OBJECT_LINEAR, then the generation function for the coordinate indicated by coord is
,
,
, and
are the object coordinates of the vertex.
are specified by calling TexGen with pname set to OBJECT_PLANE
in which case params points to an array containing
.
There is a distinct group of plane equation coefficients for each
texture coordinate;
coord indicates the coordinate to which the specified coefficients pertain.
If TEXTURE_GEN_MODE indicates EYE_LINEAR, then the function is
where
,
,
, and
are the eye coordinates of the vertex.
are set by calling TexGen with pname set to
EYE_PLANE in correspondence with setting the coefficients
in the OBJECT_PLANE case.
M is the model-view matrix in effect when
are
specified.
Computed texture coordinates may be inaccurate or undefined
if M is poorly conditioned or singular.
When used with a suitably constructed texture image,
calling TexGen with TEXTURE_GEN_MODE indicating SPHERE_MAP
can simulate the reflected image of a spherical environment on a polygon.
SPHERE_MAP
texture coordinates are generated as follows.
Denote the unit vector pointing from the origin to the vertex
(in eye coordinates) by .
Denote the current normal,
after transformation to eye coordinates,
by
.
Let
,
the reflection vector, be given by
and let .
Then the value assigned to an s coordinate (the first TexGen argument
value is S) is
;
the value assigned to a t coordinate is
.
Calling TexGen with a coord of either R or Q when
pname indicates SPHERE_MAP generates the error INVALID_ENUM.
A texture coordinate generation function is enabled or disabled using Enable and Disable with an argument of TEXTURE_GEN_S, TEXTURE_GEN_T, TEXTURE_GEN_R, or TEXTURE_GEN_Q (each indicates the corresponding texture coordinate). When enabled, the specified texture coordinate is computed according to the current EYE_LINEAR, OBJECT_LINEAR or SPHERE_MAP specification, depending on the current setting of TEXTURE_GEN_MODE for that coordinate. When disabled, subsequent vertices will take the indicated texture coordinate from the current texture coordinates.
The state required for texture coordinate generation
comprises a three-valued integer
for each coordinate indicating coordinate generation mode,
and a bit for each coordinate to indicate whether texture coordinate
generation is enabled or disabled.
In addition,
four coefficients are required
for the four coordinates for
each of EYE_LINEAR and OBJECT_LINEAR.
The initial state has the texture generation function disabled for
all texture coordinates.
The initial values of for s are all 0 except
which is one;
for t all the
are zero except
, which is 1.
The values of
for r and q are all 0.
These values of
apply for both the EYE_LINEAR and
OBJECT_LINEAR versions.
Initially all texture generation modes are EYE_LINEAR.