Real-Time Rendering Corrigenda for 1st print
What follows are corrections for the book
Real-Time Rendering, by
Tomas Möller and
Eric Haines.
Addenda
- On page 38, add the following just before section 3.2.2:
"Another way to see that one degree of freedom is lost, is
to set p=pi/2 and examine what happens to the Euler matrix
E(h,p,r):
Since the matrix is only dependent on one angle r+h we
conlude that one degree of freedom has been lost."
- To be added on page 77, at the end of the second paragraph:
"Two papers from SIGGRAPH 99 describe using more elaborate BRDF models, one by
Heidrich and Seidel [174] and another by Cabral, Olano, and Nemec on SGI's
ClearCoat technology [Y]."
In the references, add:
[Y] Cabral, Brian, Marc Olano, and Philip Nemec, ``Reflection Space Image Based
Rendering'', Computer Graphics (SIGGRAPH 99) Proceedings,
pp. 165--170, August 1999.
- To be added on page 111, "Mipmapping", after the second paragraph
(which ends "...in Figure 5.8."):
"Two important elements in forming mipmaps are good filtering and gamma
correction. The common way to form a mipmap level is to take each 2x2 set of
pixels and average them to get the mip value. This is fraught with peril: first,
the filter used is then a box filter, one of the worst filters possible. Better
is to use a Gaussian filter or similar, and it is not all that much more
complicated to code. By ignoring gamma correction, the overall perceived
brightness of the mipmap level will be different than the original texture: as
you get farther away from something and the uncorrected mipmaps kick in, the
object will usually look darker."
- On page 116, in the last paragraph, following
"..., and is explained in depth by Barkans [28]." Just after there,
add "A similar system is presented by McCormack et al. [Z]."
In the references, add:
[Z] McCormack, Joel, Ronald Perry, Keith I. Farkas, and Norman P. Jouppi,
``Feline: Fast Eliptical Lines for Anisotropic Texture Mapping'',
Computer Graphics (SIGGRAPH 99) Proceedings, pp. 243--250, August 1999.
- Bullet number 5 on page 143, which starts "Anisotropic reflections...",
should be replaced with:
"Realistic shading, done by using a variety of techniques to access one or more
environment maps in order to approximate the reflective characteristics of the
material." At the end of this sentence, there should be two references; one
to Heidrich and Seidel's SIGGRAPH 99 paper (ref [174]), and to
Heidrich and Seidel's IMDSP 98 papers (ref [172]).
- Change figure 7.13: remove the zeros in the z-buffer (as they
may indicate that the z-value is cleared there), and replace with
something else. Also, add in the text that the Z-buffer is cleared
with the "far"-value before rendering starts.
(thanks to Norman Lin)
- Page 372, in the comparison of single, double, and triple buffering,
add (and mix & clear up) something like: "All buffering schemes have different
latencies: single buffering has none (though it is subject to tearing),
double buffering have at least one frame of latency, while triple
buffering have at least two frames of latency".
(thanks to Ben Watson).
- To be added to Chapter 12 on page 374, as a separate section between
12.1.6 and 12.1.7:
"The T-buffer is like a parallel accumulation buffer, consisting of a set of 4 or 8
image and Z buffers (or more, memory permitting), each of which can be rendered to
simultaneously. There is a mask which determines where a triangle gets sent, i.e. you
can send it to one or more buffers at the same time, as desired. On the back-end is
some video logic which combines the set of buffers to display a single, averaged image.
So, for motion blur and depth of field you send down each triangle a number of times,
changing the mask as you change the position or view. Triangles which do not need these
effects can be sent just once, to all buffers. The T-buffer's real strength is for
anti-aliasing. It jitters the triangle in screen space per buffer, e.g. the first
buffer has a jitter of say (0,0), the second buffer (0.5,0), third (0.5,0.5), fourth
(0,0.5) [footnote: Better is to sample with something like
(0,0.25),(0.5,0),(0.75,0.5),(0.25,0.75) or similar rotated grid, which gives more
vertical and horizontal resolution and so gives more levels of antialiasing for nearly
vertical or horizontal edges, which usually look the worst]. So you can send a single
triangle and have it sent in parallel, at slightly different offsets, to the set of
buffers. Combining on the back end gives a fairly good antialiased image (there are
still problems from doing regular sampling, box filtering, and not doing gamma
correction). An advantage of this approach is that anti-aliasing can be done by default
for old games without needing any programming changes; it is just a matter of setting
the driver to be in anti-aliasing mode."
- For reference [202] by Kempf and Hartman, add URL:
http://techpubs.sgi.com/library/tpl/cgi-bin/download.cgi?coll=0650&db=bks&docnumber=007-2392-002
Images and illustrations
The corrections are available on a separate
page (since one image set is best viewed on screen), but also
as a zipped postscript file or a zipped
pdf file.
Significant errors
- Page 47, Equation 3.47, each of the three "2"'s should be "4"'s.
(thanks to Rodrigo Marchant)
- Page 47, Equation 3.47, the middle row should say "m_{02}-m_{20}"
instead of "m_{20}-m_{02}". Also, in Equation 3.49 the same change
should be made.
(thanks to Adam Batters)
- Page 131, first sentence should rather be: "The remaining two
coordinates are divided by the absolute value of the largest
magnitude coordinate, i.e., 0.84. They now range from -1 to 1,
and are simply remapped to [0,1] in order to compute the texture
coordinates (e.g., the coordinates (-0.2,0.5) are mapped to
((-0.2/0.84+1)/2, (0.5/0.84+1)/2) \approx (0.38,0.80)"
(thanks to Tommy Fortes)
- On page 195, third paragraph, which starts "When a scene graph...",
it should be "pre-order traversal", not "in-order traversal".
(thanks to Christer Ericsson)
- Equation (7.2) on page 214 says "O_{k+1}=1-(3+O_k)/4".
It should be "O_{k+1}=(3+O_k)/4".
- On page 301 in the pseudocode we forgot to test if the ray
is parallel and outside the slab. So put in an extra line
between line 14 and 15, which says:
else if(-e-h_i > 0.0 or -e+h_i<0.0) return (REJECT,0);
This line should be indented as line 7.
Also, in the text below the pseudocode there should be an
explanation to the new line: "Line 14.5 is executed if
the ray is parallel to the slab, and it tests if the
ray is outside the slab. If so, then the ray misses the box
and the test terminates.
Also, the sentence just before the pseudocode should say:
"Recall that a^c is the center of the box, and a^u, a^v,
and a^w are the normalized side directions of the box.
h_u, h_v, and h_w are the positive halflengths (from the center
to a box face)". Also on line 8 and 9, it should say "h_i" instead
of "a_i".
(thanks to Bill Budge)
- Page 325, in the algorithm for testing whether two k-DOPs overlap, we
cannot guarantee that they overlap if all slabs overlap (however, it is quite likely).
According to the separating axis theorem, one also has to test axes formed from
the cross products of an edge from each of the k-DOPs.
- Page 351, figure 11.3, according to the separating axis theorem,
it is sufficient to find one axis of separation to declare two
objects as not overlapping, therefore this illustration is wrong.
The reason is that the figure in the middle shows a separating
axis and that the test would end there. The figure should be redrawn
such that there would be no separating axis (not in the middle and not
in the right figure).
(thanks to Jacob Ström).
- Equation (A.44) on page 412, the matrix should have ones (1)
in all diagonal elements (from the top left to the bottom right).
(thanks to Thomas Lundqvist)
- Reference [28] by Barkans is used as the main reference for anisotropic
filtering of textures. The following reference is more appropriate and earlier:
Andreas Schilling and Günter Knittel and Wolfgang Strasser,
``Texram: A Smart Memory for Texturing'',
IEEE Computer Graphics & Applications, 16 (3), pp.
32-41 (May 1996). (thanks to Wolfgang Strasser)
Minor syntax errors
- Page 48, one line before the bottom of the page (ignoring the footnote),
the equation for "cos pi" should have a term "q_x r_x" instead of "q_x r_w".
(thanks to Rodrigo Marchant)
- Page 49, Equation 3.55, replace "h", "p", and "r" with "h/2", "p/2", and "r/2".
(thanks to Alex Linde)
- Page 50, Equation 3.56, the order of the quaternions should be "roll", "pitch", and "head" (not hpr).
(thanks to Alex Linde)
- Page 59, on the last line (not in the footnote), "(f-n)" and "(t-b)"
should change places. (thanks to Jarno Mielik)
- On page 62, Equation (3.76), the last equal sign ("=") should
not be a strict equality, rather it should be replaced by
an equivalence sign ("<=>"), which is a "\Leftrightarrow" in LaTeX.
(thanks to Björn Andersson)
- Page 80, Equation (4.20) the lighting equation for multiple
light sources, on the first row, the superscript on d
is "q", but it should be "k". And on the last row, the superscript
for h is again "q", but it should be "k".
(thanks to Jonas Jalminger)
- Page 117, second paragraph, last sentence says "An example
of an isotropic filtering..."
It should say "An example of
anisotropic filtering..."
- Page 246, sixth bullet, second sentence. It should be "(--cnt)"
and "(cnt--)" instead of "(-cnt)" and "(cnt-)". Also it should
be "p[n]=q[n]; instead of *p++=*q++;" and not
"*p++=*q++; instead of p[n]=q[n];"
(thanks to Tommy Fortes)
- Page 350, in "Choice of Bounding Volume", first paragraph,
at the end says "... due to one of the 16 axis tests.".
It should be "... due to one of the 15 axis tests."
(thanks to Bill Budge)
Very minor errors
back to the
Real-Time Rendering homepage.
webslaves: Eric Haines
/ erich@acm.org
Tomas Möller
/ tompa@acm.org
Last change: January 2, 2000