The vector from the eye point to the vertex is denoted as ,
normalized to
.
Since the computation is performed in eye
coordinates, the eye is located at the origin and
is equal to the
location of the vertex in eye-space.
The current normal
is transformed to eye
coordinates by the inverse transpose of the modelview matrix and
is normalized, becoming
.
The reflected vector
can be
computed as:
The above equations look intimidating, but they are not as mystifying as they first appear. Equation 7 is the standard equation for computing the reflection vector given a surface normal and incident vector. Most introductory graphics textbooks have a short proof and a good explanation of this equation.9
Because
and
are normalized,
is normalized as well. You can think of
as a 3D point on the
unit sphere.
Our task is to make this 3D point into a 2D texture coordinate.
Reducing to two dimensions is accomplished by projecting
onto the unit circle in the Rz=0 plane.
This is the reason for dividing by p.
Because we know
is normalized, the result of Rx / pand Ry / pmust be within the range [-1,1]. But to index into a 2D texture map, we
need coordinates in the [0,1] range. In Equations 8 and 9,
the scale by
and bias by
serve to map values in the range the [-1,1] to the range [0,1].
When constructing sphere maps, the reverse mapping from (s,t) to
is often needed. The reverse mapping is:
The image in a sphere map can be thought of as a circle of radius
centered at
.
Plugging
into the reverse mapping equations above
results in a reflection vector of (0,0,1). OpenGL assumes the eye
looks down the negative Z axis. So the vector (0,0,1) is reflected
straight back at the eye. If we think of a sphere map as what we see
when looking
directly at a chrome sphere, then dead in the center of the sphere we
expect to see our own reflection.
Try plugging (s,t) coordinates on the edge of the sphere map's circle
such as
and
into the reverse mapping equations.
For any point on the circle edge, the result is always (0,0,-1).
Again, if we think of a
sphere map as what we see when looking at a chrome sphere, the silhouette
edge of the sphere is seen as an extreme grazing reflection of whatever is
directly behind the sphere. If this does not make sense, look back at
Figure 66 to convince yourself of this fact. This means
that every point
on the circle's edge of a properly generated sphere map should the same
color.
Finally try plugging (s,t) coordinates for points outside the sphere map's circle into the reverse mapping equations. Try points such as (0,0) and (1,1). The operand of the square root in the equations for both Rx and Ry become negative. This should not be too surprising because properly normalized reflection vectors are guaranteed to fall within the sphere map's circle.