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, Carl Witkin | 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 and Srinath Ravichandiran | In equation 15.8 in the middle of the page, on the left side of the equation (outside of the product term), the |cos \theta_i| term should be replaced with the geometric term G(p_i, p_{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)". |

917 | Johannes Guenther | There are two errors in the references in Exercise 16.4. First, Coleman (1968) isn't in the references; it should be W.A. Coleman, “Mathematical Verification of a certain Monte Carlo Sampling Technique and Applications of the Technique to Radiation Transport Problems”, Nuclear Science and Engineering 1968. Second, "Rabb" should be "Raab", there should be an "et al." after "Raab", and the reference should be to (Raab 2006), which is “Unbiased Global Illumination with Participating Media”, Monte Carlo and Quasi-Monte Carlo Methods 2006. |

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. |

95 | Joey Litalien | Two lines above Equation 2.7, "q_1 onto q_2" should be "q_2 onto q_1". |

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(). |

273 | Neil You | The first line of the first displayed equation suggests the equality S(lambda) = x_\lambda X(\lambda) + y_\lambda Y(\lambda) + z_\lambda Z(\lambda) for an arbitrary SPD S(\lambda), which is not the case. The text should make more clear that we're making use of the tristimulus theory of color perception in that step. |

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". |

952 | Xuezhen Huang | In second displayed equation, the middle term on the right hand side shouldn't be negated. Also, in the middle equality in the bottom displayed equation, the r_{2,2} term shouldn't be negated. |

956 | Josiah Manson | In the displayed equation at the top of the page, the \sqrt{3}/2 term should be negated. |

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. |

1155 | Kalle Immonen | The index entry for "non-a-number" should be "not-a-number". |

Copyright© 2004-2022 Matt Pharr, Wenzel Jakob, and Greg Humphreys. All rights reserved.