Important Errors

Page Reporter Error
100 Yunjian Ding The first line of the implementation of AnimatedTransform::MotionBounds() should be "if (!actuallyAnimated) return useInverse ? Inverse(*startTransform)(b) : (*startTransform)(b);"
132 Tao Du The expressions for the partial derivatives of the disk primitive in the "Find parametric representation of disk hit" fragment should be "Vector dpdu(-phiMax * phit.y, phiMax * phit.x, 0.);" and "Vector dpdv = Vector(phit.x, phit.y, 0.) * (innerRadius - radius) / sqrtf(dist2);".
142 Zhiyi Xu The variable 'd' in the code should be named 's' so that it matches the notation used in the derivation of the intersection algorithm.
148 Che Sun In the code at the top of the page, the cross product to initialize "ss" should be "ss = Cross(ns, ts);". As it's currently written, ss is flipped, which in turn flips the handedness of the normal. (We have not fixed this bug in the source code, as many existing scenes will render differently with this corrected; in particular, specular reflection and transmission through surfaces with shading normals will interpret the two indices of refraction differently. We will fix this properly in the third edition.)
206-207 Ke Xu Contrary to the claims in the text, primitives that overlap multiple voxels will be refined repeatedly, thence wasting both memory and computation. (The best fix is probably to have the Voxel structure store a vector of primitive indices, indexing into the main vector of primitive references in the GridAccel class.)
213 huangxz At the bottom of the "Create leaf BVHBuildNode" fragment, there should be "return node;"
243 Ke Xu The kd-tree traversal logic for rays that start on a splitting plane is incorrect. The "belowFirst" test in the "Get node children pointers for ray" should be changed to "int belowFirst = (ray.o[axis] < node->SplitPos()) || (ray.o[axis] == node->SplitPos() && ray.d[axis] ≤ 0);".
271-272 Aliaksandr Ulitenok The computation of yint in the code fragment at the top of page 272 is incorrect (unless the number of spectral samples is equal to nCIESamples). Since the value of yint should always be the same, we should just make it const and initialize it to the constant 106.856895.
272-273 Aliaksandr Ulitenok In the ToXYZ() method after the "for" loop, the sums in xyz[] should also be scaled by a factor of "float(sampledLambdaEnd - sampledLambdaStart) / float(nSpectralSamples)". The corresponding change should be made in SampledSpectrum::y() as well.
296 Jeppe Revall Frisvad The definition of the BSSRDF S in the third display equation on the page should have d\Phi_i in the denominator, not dE. (Where Phi is incident flux at a position \pi from direction \wi).
313-317 Ke Xu Throughout this subsection, all uses of "focal plane" should actually be "plane of focus". (The focal plane is something else!)
435 John "Spike" Hughes In equations 8.1 and 8.2, the "\cos \theta_i^2" terms should all be "\cos^2 \theta_i".
439 Jérémy Riviere In the first displayed equation, the middle term should be an integral over directions \omega, along the lines of the standard reflection equation.
440 Srinath Ravichandiran In the first line of the second displayed equation, the second delta function should be "\delta(\phi_i - \phi_r)" and then the second line of that equation should be "= L_i(\theta_r, \phi_r) | |\cos \theta_i|".
561-562 Ares Lagae, Ke Xu There are a number of errors in how the sampling rate for Perlin noise is computed. If we assume that the maximum frequency of n octaves of noise is about 2, we want s / 2^n >= 2 to avoid aliasing. Solving for n gives is -1 + log2(s), which is equivalent to -1 + 1/2 log2(s^2), which is better since s^2 is cheaper to compute than s. Now, why do things sort of work as is? In the code fragment on the next page, we compute s2 as the maximum of the length squared of dPdx and dPdy--but that gives us a length, not a frequency! It's actually 1/s we're computing there. Thus, the final number of octaves used when the code runs ends up being 1 + 1/2 log2(s^2) (since log(1/x) = -log(x)), and the final result is that we include two octaves too many. Therefore, in the code fragment on page 562, the expression to compute "foctaves" should be "min((float)maxOctaves, max(0.f, -1.f - .5f * Log2(s2)));"
578 Ke Xu The text above the equation right before Section 11.1.2 should be "the remaining portion of the original radiance" instead of "total absorption".
582 Ke Xu The scattering proability sigma_s should be defined as a function of both incoming and outgoing directions. In the final displayed equation on the page, the sigma_s term should also be moved inside the integrand.
588 Ke Xu The declaration of the sigma_s function for the VolumeRegion interface should have it be a function of both incoming and outgoing direction.
649 Dan Evans/Matt Pharr The instances of lower_bound on this page should be upper_bound(). Otherwise if you have a piecewise-constant segment in your CDF (as would result from a zero-valued region of the PDF), then the division by (cdf[offset+1] - cdf[offset]) to compute "du" leads to a division by zero (and thence badness). With upper_bound, you're guaranteed that cdf[offset+1] > cdf[offset], so that division won't blow up.
655 Ke Xu / Wenzel Jacob The mutation method of Equation 13.9 isn't actually an exponential distrubtion; it's fairly close to linear, actually.
668 Yunjian Ding In the code fragment for "Handle first region of disk" (and, presumably in the other elided fragments, analogously), the test for sy being greater than zero is unnecessary; both code paths compute the equivalent of "sy/r". See also Pete Shirley's blog post for further improvements to this functionality.
683 Yunjian Ding In the fourth displayed equation, defining the variance in a stratum, the term outside the integral should be "1/v_i" (not "1/v_1").
698 Jeppe Revall Frisvad Figure 14.7 and the text on this page are confusing, since \theta_i and \theta_o are here angles with respect to the halfangle vector (instead of with respect to the normal, as elsewhere in the book), and \theta_h here is used as the angle between \omega_h and \omega_i (and \omega_o), which is inconsistent with the definition of \theta_h on page 696. One fix to clarify what's going on here would be to instead use plain \theta for the angle between \omega_h and \omega_i / \omega_o, so that it's then 2 \theta between \omega_i and \omega_o.
712 曹家音 In the bottom line of the page, p(\theta) should be sin(\theta) / (1 - cos(\theta_max)).
723 Ke Xu and Fred Akalin It's incorrect for the ShapeSet to find the closest intersection with the closest shape; this isn't reflected in the PDF values computed for the area light. Thus, the point from the call to "shapes[sn]->Sample()" should be returned from ShapeSet::Sample() directly.
724 Koen Van den dries The ShapeSet::Pdf(const Point &) variant should include a term "shapes.size()" in the value used to divide the value of "pdf" before returning it.
754 Ke Xu The second display equation should be "L_d = L_e(t(p, w_i), -w_i)," and then the text following it should be "and further scattering is ignored".
763 Srinath Ravichandiran The first paragraph of section 15.3.2, should say that the "first vertex p_0 is a point on the camera film or lens, and the point p_1 is determined by the camera ray's first intersection point".
765 Stéphane Grabli In equation 15.8 in the middle of the page, on the left side of the equation (outside of the product term), either the |cos \theta_i| term should be replaced with the geometric term G(p_i, p_{i+1}), or the probability density in the denominator should be p_\omega(\theta_{i-1}).
778 Tzu-Mao Li The last line of the first code fragment should be "alpha *= AbsDot(Nl, ray.d) / (pdf * lightPdf);".
782 Thomas Engelhardt In the fragment "Compute virtual light's tentative contribution Llight" at the top of the page, the line with the assignment to Llight should divide by nLightPaths, not virtualLights[lSet].size().
783 Jan Novak There are a number of errors in the two displayed equations at the top of the page. The top integral should be written over angles \omega, not \omega'. Then, the |\cos \theta| divisor should be |\cos \theta'|, and the explanation of the definition of the angle \theta' should be moved to be after the first displayed equation rather than after the second one. Then, Equation 15.12 should be rewritten so that it is also an integral over \omega (not \omega'), and the remaining cosine term in that equation should be |\cos \theta|.
784 Jan Novak In the code fragment at the top of the page, the initializer expression for gs should be just "(Ggather - gLimit) / Ggather;".
799 Anders Wang Kristensen Equation 15.15 should have a cos theta term in the integrand on the right side of the equation. (Comparing with Equation 4.30 in Veach's thesis, Veach is using the projected solid angle measure for ray directions, while PBRT uses the regular solid angle measure.) This fix in turn leads to corresponding updates to the equations throughout the rest of this subsection.
830 Anton Kaplanyan, Joonghyun The photon mapping estimator equation, 15.20, is incorrect as written; the final result should be "1/N(d_n(p))^2 \sum_j^N k(p-p_j/d_n(p)) \alpha_j f(p, \omega_o, \omega_j)". (Currently, the substitution of \hat{p}(p_j) leads to an incorrect double-sum over the photons.) (See the SIGGRAPH Asia 2012 paper "A Path Space Extension for Robust Light Transport Simulation", by Toshiya Hachisuka et al., for a better derivation of photon mapping in terms of the measurement equation.)
894 Robert Szymiec In the second code fragment, the line that initializes the "area" variable should be "float area = M_PI * (minSampleDist / 2.f) * (minSampleDist / 2.f);".
902 Steve Hill In the denominator in the displayed math, the "3/2" exponent should be outside the parenthesis.
905 Eugene d'Eon In the paragraph above displayed Equation 16.5, z- should be computed as "4AD + z+", not "2AD + z+".
906 Eugene d'Eon In Equation 16.6 there should be an additional scaling factor of "\sigma'_s / \sigma'_t". (i.e. the reduced scattering albedo).
907 Eugene d'Eon In the DiffusionReflectance constructor, there should be a negation in front of the expression initializing the value of zneg.
908 Eugene d'Eon In the implementation of DiffusionReflectance::operator(), the firstl ine of code initializing Rd should be a scale factor of "(alphap / (4.f * M_PI))", not "(1.f / (4.f * M_PI))".
912 Eugene d'Eon In Equation 16.9, the integrand on the left hand side should be "2 \pi x R_d(x)", not "R_d(x)".

Minor Errors

Page Reporter Error
xxi Sebastian Schuberth Gauß's name is misspelled twice. "Freidrich" should be "Friedrich", and his last name should be spelled with "ß" (\ss).
27 Dillon Cower In the middle of Figure 1.17, "SamplerRenderTask" should be "SamplerRendererTask".
28 Dillon Cower The last word of the fourth paragraph should be "shortest".
30 張家銘 In the fourth line of the bottom paragraph on the page, "SamplerRenderer" should be "SamplerRendererTask".
39 Sebastian Schuberth In the second line of the first paragraph of the "Conventions in pbrt" section, "repsonsible" should be "responsible".
46 Dillon Cower In the first line of the first paragraph, "Samplef()" should be "Sample_f()".
50 Dillon Cower In item #3 in the bullet list, "find make" should be "find".
51, 1134 Hanton Yang Shirley and Morley's book was published in 2003, not 2008.
68 Ke Xu The displayed code fragment "Ray r(Point(0, 0, 0), Vector(1, 2, 3));" should be updated to account for the fact that there are no Ray constructors that support passing just a Point and a Vector.
95 Wojciech Sterna In the caption for Figure 2.16, the last equation should have a prime symbol after the 'v' on the left hand side of the equation.
118 Srinath Ravichandiran In the "Find quadratic discriminant" fragment, the condition in the 'if' statement should be "discrim < 0".
123 Ke Xu In the text above the displayed equation at the bottom of the page, "from y=a to y=b" should be "from x=a to x=b".
124 Ke Xu In all of the displayed equations after the first one, it would be more clear to write the functions as f(z) rather than f(x), since for the sphere case the integration is being done over the z axis.
133 Yunjian Ding At the very bottom of the page, the value for the 'y' component of dp/dv for a cone should have a negative sign in front of it.
141 曹家音 The total number of additions in the intersection calculation is 23, not 17.
146 Tristan Penman In the second display equation, "u_2 - u_1" should be "u_2 - u_0", and "v_2 - v_1" should be "v_2 - v_0".
166 Ke Xu In Figure 3.23(b), one of the two shaded triangles (and its edges and vertex) should be removed, since the new vertex shown is supposed to be a boundary vertex.
218 曹家音 In the second line of the text below the last displayed equation, "space space" should be "space".
219 Xiong Wei In the caption for Figure 4.10, the last sentence "Note that..." is incorrect and should be deleted.
254 Yunjian Ding In the fourth line of the third paragraph, "primitve" should be "primitive".
272 Ke Xu In the "Compute XYZ matching functions for SampledSpectrum" code fragment, the claimed integral isn't being computed for yint; it should be divided by nSpectralSamples. However, this is also the case for the computation of X.c[], etc, so these two errors cancel out when these values are used, for example in SampledSpectrum::ToXYZ().
283 David Eränen In the caption for Figure 5.7, "smaller incident angles" should be "larger incident angles".
285 Jagadeesh Pakaravoor The numerator of Equation 5.2 should be "\mathrm{d}^2 \Phi", not "\mathrm{d} \Phi".
297 Hanton Yang In the last sentence of the first paragraph of the "Further Reading" section, "Delvin" should be "Devlin".
299 Kevin Stock In exercises 5.2 and 5.3, the units for radiance should be W/m^2 sr, not J/m^2 sr.
312 Yunjian Ding and Ke Xu In the PerspectiveCamera::GenerateRay() code, there should be a call to Normalize() around Vector(Pcamera) in the initializer for *ray.
319 Ke Xu In the last sentence of the paragraph above the code at the bottom of the page "x and y coordinates" should be "y and z coordinates".
327 Ke Xu In Table 7.1, the frequency space representation of "cos x" should be "\pi (\delta(1 - 2 \pi \omega) + \delta(1 + 2 \pi \omega))".
330 Benjamin Wüthrich In the displayed equation at the bottom of the page, \Pi_T(x) should actually be \Pi_T(\omega).
338 Srinath Ravichandiran In the caption to Figure 7.12, "four pixels" should be "five pixels".
342 Ke Xu In the first line of text "number of y tiles" should be "twice the number of y tiles".
361 Keith Jeffery In the third paragraph of Section 7.4.2, "decimal point" should be "radix point".
365 Matt Pharr The final parenthetical statement at the end of the caption for FIgure 7.26 is incorrect; it should be removed.
385 Keith Jeffery The comparison in the WRAP macro should be ≥ rather than > so that a value of one isn't returned.
403 Yunjian Ding At the end of the third line of the fourth paragraph, "and and" should be "and".
427 Yamauchi Hitoshi In the illustration for Figure 8.3, the y axes should be sized so that it ends at the edge of the shown hemisphere (as the x axis does), to better illustrate that its length is one. Then, the projection of \omega down to the plane shouldn't end up at the edge of the hemisphere, but it should be in the interior of the circle under the hemisphere.
461 Joel Kronander The "pi" term in the denominator of the displayed equation in the middle of the page should be removed.
507 Yunjian Ding In the ray / plane intersection equation in the first displayed equation, the "d" term should be subtracted from the dot product in the numerator, not added. Then, in the code below, the negation of 'd' should be removed and in the places where 'd' is added in the computations of tx and ty, subtraction should be used.
509 Yunjian Ding In the second displayed equation, the integral signs should be interchanged (i.e. the outer one should be over yWidth, and the inner one over xWidth).
529 Kevin Stock In the caption to Figure 10.10, the reference to Figure 11.1 should refer to Figure 10.1 instead.
529 Ning Liu In the third line of the caption of Figure 10.10, the reference should be to Figure 10.1, not Figure 11.1.
550 Brad Loos In the definition of the function c(x) in the first displayed equation, "odd" should be "even"
566 Brad Loos In the second sentence of Section 10.6.5, the reference to Figure 7.36 should be to Figure 7.35.
586 Thies Heidecke A slightly better mapping between the phase function asymmetry parameter g and the Schlick phase function's k parameter is given by k(g)=1.45352*g-0.45352*g^3. (See http://pbrt.org/bugtracker/view.php?id=102) for more details.)
592 Iliyan Georgiev At the end of the very last paragraph of section 11.4 before section 11.4.1, the cross reference should be to section 14.7.2, not 15.7.2.
614 Xiong Wei In the third line, [0,2 π] should be [0, π].
621 Matt Pharr In the first code fragment on the page, the line "Spectrum(mipmap->Lookup(s, t, SPECTRUM_ILLUMINANT));" should be "Spectrum(mipmap->Lookup(s, t), SPECTRUM_ILLUMINANT);" (note changed paren placement).
642 Iliyan Georgiev In the paragraph after Equation 13.3, the condition on f(x) should be "|f(x)| > 0".
652 曹家音 In the second sentence of the first paragraph of section 13.4, "invert the resulting PDF" should be "invert the resulting CDF".
666 曹家音 In the displayed equation at the bottom of the page, the second equality should be "\theta = \frac{y}{x} \frac{\pi}{4}".
668 Xinqi Chu In the fourth equation from the bottom, there shouldn't be a "c" in the integrand.
669 Ihab Sultan In the sentence above the second displayed equation, "(r, \phi) \rightarrow (\sin \theta, \phi)" should be "(r, \phi) = (\sin \theta, \phi) \rightarrow (\theta, \phi)".
673 Che Sun The "return" statement of Distribution2D::Pdf() can be simplified to just return the value "pConditionalV[iv]->func[iu] / pMarginal->funcInt"; this is possible because the factors pMarginal->func[iv] and pConditionalV[iv]->funcInt cancel each other out.
679 Feng In the third sentence of this chapter, "reduce the variance" should be "reduce the error".
683 Matt Pharr In the second displayed equation, P_i should be p_i.
694 Mauricio Vives The mini-index on this page is missing a reference to CosineSampleHemisphere(), which is defined on page 669.
732 Volodymyr Kachurovskyi At the second line from the bottom, "N d" should be "N / d".
740-741 Brad Loos The bulleted list of parameters for SurfaceIntegrator::Li() should include a bullet and an explanation of the "RNG &rng" parameter.
755 Károly Zsolnai Three lines from the bottom, "L(p' -> p')" should be "L(p'' -> p')".
759 Xuezhen Huang In the displayed equation at the top of the page, the second and third integrands should be over the domain "A^{n-1}", not "A^n".
765 Iliyan Georgiev Before the first displayed equation, the clarification should be made that the equation gives the area density for the point p_{i+1}. Then, the cosine term should be cos_{i+1}.
785 Ke Xu In The bottom paragraph, "weighted average" should be "weighted sum".
886 Eugene d'Eon The first sentence of the 5th paragraph should say "homogeneous scattering properties", not "heterogeneous scattering properties".
903 Steve Hill The light distribution plots shown actually correspond to 5, 10, and 100 scattering events, respectively.
904,905 Eugene d'Eon It would be good to use a different symbol for Equations 16.3 and 16.5, to better reflect that they represent different quantities.
913 Eric Tabellion and Tzu-Mao Li In the third line of the code fragment at the middle of the page, "sqrtf(3.f * 1.f - alphap)" should be "sqrtf(3.f * (1.f - alphap))".
914 Brad Loos Toward the bottom of the page, "interacitions" should be "interactions".
915 Eugene d'Eon Three lines from the bottom, "heterogeneous media" should be "homogeneous media".
926 Matt Pharr Under the first displayed equation, "funcion" should be "function".
929 Matt Pharr In the legend for the graph in Figure 17.2, the x axis should be labeled 0, 1/4, 2/4, 3/4, 1 so that its domain correctly corresponds to the definition of Equation 17.2.
931 Xiong Wei In the second displayed equation, "n" should be "\sqrt{n}".
933 Ke Chen In equation 17.9, the inner summation should be from m=-l_\max to l_\max.
947 Brent Burley In the paragraph above the displayed equation at the bottom of the page, the "1" terms in the first two equations should be "z".
1011 Wojciech Matyjewicz, 張家銘 In the last line of the page, "Reference<foo>" should be "Reference<Foo>".
1024 Robert Lamb In the first fragment on the page, the value "0" should be passed as the last argument to addPrivate().
1025 Ihab Sultan In Figure A.5, the larger of the two objects should just be shown as being added to the root node of the tree; according to the refinement criteria used in the fragment "Possibly add data item to current octree node", there's no need for refinement in that case.
1121 Hanton Yang The reference for Johnson and Fairchild 1999 is missing (cited on page 297). It should be: G.M. Johnson and M.D. Fairchild, "Full Spectral Color Calculations in Realistic Image Synthesis,"IEEE Computer Graphics and Applications, 19:4 47-53 (1999).
1128 Erich Ocean The reference to Morley et al 2006 is missing. It should be: Morley, R. K., S. Boulos, J. Johnson, D. Edwards, P. Shirley, M. Ashikhmin, and S. Premoze. 2006. Image synthesis using adjoint photons. In Proceedings of Graphics Interface 2006, pp. 179--186.