i
i
i
i
i
i
i
i
9.1. Shadows 339
the shadow. Each silhouette edge casts a quadrilateral gradient area, and
each edge endpoint casts a circular gradient area. By using the Z-buffer
and painting these penumbrae objects using three-dimensional primitives
such as wedges and cones, the rendered gradient areas are made to properly
overlap (see Figure 9.8).
The methods of Gooch et al. and Haines share another problem. They
both create umbra regions that are too large, since the projected shadow
will always be larger than the object. In reality, if an area light is larger
than the width of an occluder, the occluder will cast a smaller or nonexis-
tent umbra region. See Figure 9.7 on page 337 for a comparison between
Heckbert and Herf’s method and Haines’.
9.1.2 Shadows on Curved Surfaces
One way to extend the idea of planar shadows to curved surfaces is to use a
generated shadow image as a projective texture [849, 917, 939, 1146]. Think
of shadows from the light’s point of view (literally). Whatever the light
sees is illuminated; what it does not see is in shadow. Say the occluder is
rendered in black from the light’s viewpoint into an otherwise white texture.
This texture can then be projected onto the surfaces that are to receive
the shadow. Effectively, each vertex on the receivers has a (u, v)texture
coordinate computed for it and has the texture applied to it. These texture
coordinates can be computed explicitly by the application or implicitly
using the projective texturing functionality of the graphics hardware. We
call this the shadow texture technique. It is also occasionally known as the
shadow map method in the game development community, as it is analogous
to light mapping, but for shadows. Because a different technique, covered
in Section 9.1.4, is more commonly called “shadow mapping,” we use the
term “shadow texture” for the method here.
When forming a shadow texture, only the area of overlap between cast-
ers and receivers needs to be rendered. For example, the texture can often
be considerably smaller than the area of the potential receivers, since the
texture is needed only where the shadows are cast.
When rendered, the shadow texture modifies the receiver surfaces. One
example is shown in Figure 9.9. This technique works particularly well
for circumstances where the silhouette of the shadowing object does not
change shape, so that the texture generated can be reused. Bloom [114]
gives a wide range of optimizations that can be performed to minimize the
cost of this technique.
There are some serious drawbacks of this method. First, the designer
must identify which objects are occluders and which are their receivers.
The receiver must be maintained by the program to be further from the
light than the occluder, otherwise the shadow is “cast backwards.” Also,