Update - October 15
Perspective Shadow Maps
I decided to implement perspective shadow maps in a simple environment
to see if they would be a viable solution to the shadowing problem. The
idea of the approach is to compute the shadow map in the camera's post-perspective
space. This distorts all the geometry, enlarging the objects close to the
camera and shrinking those farther away. The benefit of a perspective shadow
map is that the samples are allocated better. More samples are used for
the areas close to the camera because of the perspective distortion.
In order to better visualize the difference in sampling quality I used
a very low resolution shadow map (128x128). The camera-light configuration
that yields optimal results is a directional light perpendicular to the
viewing direction. In Figure 1 I approximated this configuration with a
point light source placed high above the scene. You can see that for this
configuration the perspective shadow map does indeed yield a higher sampling
rate for the shadow at the base fo the teapot.
||Figure 1: A comparison of a normal shadow map (above)
and a perspective shadow map (below) for the optimal configuration of an
overhead directional light. The images on the right are from the point
of view of the light source and show the warping by the perspective transform.
For other views, the additional benefit of the perspective shadow map
is minimal. As the light moves away from an overhead position, the quality
of the perspective shadow map degrades to that of a normal shadow map as
can be seen in Figure 2
||Figure 2: There is not much difference in the sampling
rate for normal shadow maps (left) and perspective shadowmaps (right) for
some configurations. Note that the perspective shadowmap is slightly rotated
which breaks up the straight lines seen with the normal shadow map.
Objects lying behind the view point may cast shadows on the visible
objects. When an object that lies behind the viewer, it gets inverted and
projected beyond the infinity plane by a perspective transformation. The
handle avoid this situation, a "virtual" camera is used, which has been
shifted back until all possible occluding geometry lies in front of the
viewer. This is faciliated by constructing a convex polyhedron that bounds
possible occluders as shown in Figure 3. The authors of the paper say to
shift the camera back until the polyhedron lies within the view frustum.
I don't think that this necessary to avoid the inverted projection problem,
but it does keep the geometry bounded to the unit cube in post-perspective
space, which is important for maintaining a small field of view when constructing
the shadow map.
|Figure 3: The polyhedron containing all possible occluding geometry.
The camera frusta are shown in blue. The "virtual" camera is shifted back
until this polyhedron lies completely inside the view frustum. The light
frustum is yellow.
The virtual camera shift keeps the geometry from being inverted but the
light source itself may still lie behind the viewer. In this case, the
light will be inverted (see Figure 4). Theoretically this should not produce
any difficulties. We just invert the logic of the shadow map, storing the
furthest point from the inverted light and inverting the depth comparison
to greater than instead of less than. I have had some problems with it
though. I find that the accuracy drops drastically. I have to use a much
higher bias to avoid surface self-shadowing artifacts. The bias has to
be so high, in fact, that the shadow drops out it in places as shown in
Figure 5. I have found it difficult, in general, to select a good bias
that works for all situations. This is probably because of the warping
introduced by the perspective transform. The loss in accuracy may be cause
by the geometry ending up closer to light frustum's far clipping plane
where there is lower accuracy in the z-buffer. A possible solution is use
a 1D texture to transform the hyperbolic post-perspective Z values into
linear Z values before storing them in the shadow map.
|Figure 4: Inversion a light source in post-perspective space. As
the camera moves forward and the light source falls behind the eye, it
is projected onto the infinity plane and inverted. The objects are dark
because the perspective transform flips the normals.
|Figure 5: Bias problems when the light is inverted. The images from
left to right have bias values of 0.0, 0.10, and 0.22. In the middle image,
the shadow of the lid handle is resolved well but the sides of the teapot
have problems. In the right image, the surface acne is gone from the sides,
but now the bias is so high that shadows are not cast on the plane or lid.
Another problem is the drop in frame rate when using perspective shadow
maps. You essentially have to render the scene twice, once from the light
source to compute the shadow map and once from the camera. I have thought
about pre-computing perspective shadow maps. Since they are dependent on
the camera orientation and position, I would have to discretize both space
and directions. Directions would have to be discretized fairly finely due
to the sensitivity of the perspective map to camera orientation. That could
lead to enormous storage costs that would outweigh the benefits of precomputation.
I am not sure that perspective shadow maps are the way to go. I
am going to drop the perspective maps into a more complex rendering system
capable of handling the power plant model. On a real scene I will be able
to determine whether or not they are really viable. If not, then I am going
to try an adaptive approach that subdivides the shadow map where more resolution