abrash-black-book/65-04.md
2013-12-30 20:26:41 +11:00

116 lines
6.5 KiB
Markdown

#### The Lessons of Listing 65.3 {#Heading7}
There are several interesting points to Listing 65.3. First,
floating-point arithmetic is used throughout the clipping process. While
it is possible to use fixed-point, doing so requires considerable care
regarding range and precision. Floating-point is much easier—and, with
the Pentium generation of processors, is generally comparable in speed.
In fact, for some operations, such as multiplication in general and
division when the floating-point unit is in single-precision mode,
floating-point is much faster. Check out Chris Hecker's column in the
February 1996 *Game Developer* for an interesting discussion along these
lines.
Second, the planes that form the frustum are shifted ever so slightly
inward from their proper positions at the edge of the field of view.
This guarantees that it's never possible to generate a visible vertex
exactly at the eyepoint, averting the divide-by-zero error that such a
vertex would cause when projected and at no performance cost.
Third, the orientation of the viewer relative to the world is specified
via yaw, pitch, and roll angles, successively applied in that order.
These angles are accumulated from frame to frame according to user
input, and for each frame are used to rotate the view up, view right,
and viewplane normal vectors, which define the world coordinate system,
into the viewspace coordinate system; those transformed vectors in turn
define the rotation from worldspace to viewspace. (See Chapter 61 for a
discussion of coordinate systems and rotation, and take a look at
Chapters 5 and 6 of *Computer Graphics*, by Foley and van Dam, for a
broader overview.) One attractive aspect of accumulating angular
rotations that are then applied to the coordinate system vectors is that
there is no deterioration of the rotation matrix over time. This is in
contrast to my X-Sharp package, in which I accumulated rotations by
keeping a cumulative matrix of all the rotations ever performed;
unfortunately, that approach caused roundoff error to accumulate, so
objects began to warp visibly after many rotations.
Fourth, Listing 65.3 processes each input polygon into a clipped
polygon, one line segment at a time. It would be more efficient to
process all the vertices, categorizing whether and how they're clipped,
and then perform a test such as the Cohen-Sutherland outcode test to
detect trivial acceptance (the polygon is entirely inside) and sometimes
trivial rejection (the polygon is fully outside) without ever dealing
with the edges, and to identify which planes actually need to be clipped
against, as discussed in "Line-Segment Clipping Revisited," *Dr. Dobb's
Journal*, January 1996. Some clipping approaches also minimize the
number of intersection calculations when a segment is clipped by
multiple planes. Further, Listing 65.3 clips a polygon against each
plane in turn, generating a new output polygon for each plane; it is
possible and can be more efficient to generate the final, clipped
polygon without any intermediate representations. For further reading on
advanced clipping techniques, see the discussion starting on page 271 of
Foley and van Dam.
Finally, clipping in Listing 65.3 is performed in worldspace, rather
than in viewspace. The frustum is backtransformed from viewspace (where
it is defined, since it exists relative to the viewer) to worldspace for
this purpose. Worldspace clipping allows us to transform only those
vertices that are visible, rather than transforming all vertices into
viewspace, then clipping them. However, the decision whether to clip in
worldspace or viewspace is not clear-cut and is affected by several
factors.
### Advantages of Viewspace Clipping {#Heading8}
Although viewspace clipping requires transforming vertices that may not
be drawn, it has potential performance advantages. For example, in
worldspace, near and far clip planes are just additional planes that
have to be tested and clipped to, using dot products. In viewspace, near
and far clip planes are typically planes with constant z coordinates, so
testing whether a vertex is near or far-clipped can be performed with a
single z compare, and the fractional distance along a line segment to a
near or far clip intersection can be calculated with a couple of z
subtractions and a divide; no dot products are needed.
Similarly, if the field of view is exactly 90 degrees, so the frustum
planes go out at 45 degree angles relative to the viewplane, then x==z
and y==z along the clip planes. This means that the clipping status of a
vertex can be determined with a simple comparison, far more quickly than
the standard dot-product test. This lends itself particularly well to
outcode-based clipping algorithms, since each compare can set one
outcode bit.
For a game, 90 degrees is a pretty good field of view, but can we get
the same sort of efficient clipping if we need some other field of view?
Sure. All we have to do is scale the x and y results of the
world-to-view transformation to account for the field of view, so that
the coordinates lie in a viewspace that's normalized such that the
frustum planes extend along lines of x==z and y==z. The resulting
visible projected points span the range -1 to 1 (before scaling up to
get pixel coordinates), just as with a 90-degree field of view, so the
rest of the drawing pipeline remains unchanged. Better yet, there is no
cost in performance because the adjustment can be added to the
transformation matrix.
I didn't implement normalized clipping in Listing 65.3 because I wanted
to illustrate the general 3-D clipping mechanism without additional
complications, and because for many applications the dot product (which,
after all, takes only 10-20 cycles on a Pentium) is sufficient. However,
the more frustum clipping you're doing, especially if most of the
polygons are trivially visible, the more attractive the performance
advantages of normalized clipping become.
### Further Reading {#Heading9}
You now have the basics of 3-D clipping, but because fast clipping is
central to high-performance 3-D, there's a lot more to be learned. One
good place for further reading is Foley and van Dam; another is
*Procedural Elements of Computer Graphics*, by David F. Rogers. Read and
understand either of these books, and you'll know everything you need
for world-class clipping.
And, as you read, you might take a moment to consider how wonderful it
is that anyone who's interested can tap into so much expert knowledge
for the price of a book—or, on the Internet, for free—with no strings
attached. Our part of the world is a pretty good place right now, isn't
it?