Please note that the page numbers for the US and International Editions of the book differ. The page numbers below are for the US Edition of the book. For the page numbers in the International Edition, please add 30 to the page numbers. -------------------------------------------------------------- Page 17, footnote 2: Chaper --> Chapter -------------------------------------------------------------- page 30: middle of page: change "uses" " to "using" -------------------------------------------------------------- page 109: Change [Hil01] to [Hil09] -------------------------------------------------------------- Page 124 line 6 T(alpha, beta) = beta alpha P + ... -------------------------------------------------------------- page 141 third paragraph Change first "to" to "from" -------------------------------------------------------------- page 144: change "one unit in the n direction" to "a distance of sqrt(2) in the n direction" -------------------------------------------------------------- page 145: First paragraph after code. In the second sentence, switch "first" and "second" -------------------------------------------------------------- page 148: change first line of code to vec4 quad_colors[24], vertices[24]; -------------------------------------------------------------- page 154 middle of page "for any affine transformation C" -------------------------------------------------------------- Page 155, Section 3.8, First paragraph: In Section 3.8 ---> In Section 3.11 -------------------------------------------------------------- Page 169 middle paragraph: change "draw u" to "can draw u" -------------------------------------------------------------- Page 172: first line: The angle is cos^{-1}(3/sqrt(13)). _____________________________________________________________ Page 175: second from last line of code: change RotateY(-thatax) to RotateY(thetay) -------------------------------------------------------------- page 188: middle of the page equation for p': last term should have square on sine term: sin^2(theta/2) r = (cos(theta/2), sin(theta/2)*(0, 0, 1)) -------------------------------------------------------------- Page 207, model_view = Translate(0.0, 0.0, -d)*RotateX(-90.0) --> model_view = Translate(0.0, 0.0, -d)*RotateY(-90.0) -------------------------------------------------------------- Page 208, Figure 4.15 caption (b) View from positive y-axis ---> (b) View from positive x-axis -------------------------------------------------------------- page 213 vpn = a - e Note: This change is needed to ensure the resulting coordinate system is right-handed. -------------------------------------------------------------- page 233 Figure 4.38 Change z_min to -far -------------------------------------------------------------- Page 238 The minus sign on the last term of the [2][2] entry belongs in front of the whole term - (far+near)/(far-near) In code: remove division by vPosition.w -------------------------------------------------------------- Page 269, The computational advantage of the Phong model is that if we have normalized r and n ... ---> The computational advantage of the Phong model is that if we have normalized r and v ... -------------------------------------------------------------- page 278 Last paragraph: Color Plates 4 and 5 ---> Color Plates 3 and 4 -------------------------------------------------------------- Page 286: First paragraph of 5.8 will major difference -> will be major differences -------------------------------------------------------------- Page 287, End of the page diffuse = product(light_diffuse, reflect_ambient)* .... ---> diffuse = product(light_diffuse, reflect_diffuse)* .... ----------------------------------------------------------------- Page 288, (1. Blue code segment) if (d>0) diffuse = product(light_diffuse, reflect_ambient)* d; ---> if (d>0) diffuse = product(light_diffuse, reflect_diffuse)* d; ----------------------------------------------------------------- Page 288, (2. Blue code segment) if (d>0) diffuse = product(light_diffuse, reflect_ambient)* d; ---> if (d>0) diffuse = product(light_diffuse, reflect_diffuse)* d; ----------------------------------------------------------------- Page 291, in vec4 AmbientProduct ---> uniform vec4 AmbientProduct ----------------------------------------------------------------- page 292: In computing the specular term we also need to check if the light source is behing the surface if (dot(N, L) < 0.0) specular.rgb = 0.0; ----------------------------------------------------------------- Page 296, Fragment Shader Code: The following line should be deleted. The previous line calculates Kd as the maximum of dot(LL, NN) and 0. Kd = dot(LL, NN); also need to transform light and eye positions: N = Normal.xyz; L = LightPosition.xyz - vPosition.xyz; if (LightPosition.w == 0.0) L = LightPosition.xyz; E = vPosition.xyz; ---> N = Normal.xyz; // Normal transformations require special consideration. See questions 5.19 to 5.22 L = LightPosition.xyz - (ModelView*vPosition).xyz; if (LightPosition.w == 0.0) L = (LightPosition).xyz; E = -(ModelView*vPosition).xyz; -------------------------------------------------------------- page 327 middle of page: Section 6.10.3 through Section 6.10.5 -------------------------------------------------------------- Page 335, Figure 6.48: (x_i+1, _+1) ---> (x_i+1, y_i+1) -------------------------------------------------------------- Page 377, Recall that we form 36 triangles ---> Recall that we form 12 triangles (with 36 vertices) -------------------------------------------------------------- Page 379, Blue Code segment, Lines 5, 7, 9 glBufferData(GL_ARRAY_BUFFER, .... ----> glBufferSubData(GL_ARRAY_BUFFER, .... -------------------------------------------------------------- Page 380, The statement at the end of 3rd paragraph: We will discuss mutliple texture units ... mutliple ---> multiple -------------------------------------------------------------- Page 382 Figure 7.21 switch labels for (a) and (b) ____________________________________________________________ Page 439, Second paragraph, first sentence: To render a nonnull node, first we save the graphics state with mvpush(model_view) ... ---> mvstack.push(model_view) ... -------------------------------------------------------------- Page 435, Traversal Code (Blue Code segment), The block for the left lower arm should be (delete the first two pop() and push() lines): model_view = model_view * Translate() * Rotate() left_lower_arm() (please note that "model_view" is missing from the right hand side of the assigment statement) The block for the right_upper_arm: model_view = mvstack.pop(); mvstack.push(model_view); model_view = model_view * Translate() * Rotate() right_upper_arm() (please note that "model_view" is missing from the right hand side of the 3rd assigment statement) -------------------------------------------------------------- Page 448, Line 6, The statement "Has-a" relationships allow us ... ---> "Is-a" relationships allow us ... -------------------------------------------------------------- Page 461, Suggested Readings, Lassiter ---> Lasseter ----------------------------------------------------------------- Page 474, the formula for computing d uses wrong indices for the square root term at the denominator. It should be d = 1/sqrt((u_0 - u_6)^2 + (u_1 - u_7)^2 + (u_2 - u_8)^2) ... ----------------------------------------------------------------- Page 477: definitions of elastic and inelastic collisions are reversed ----------------------------------------------------------------- Page 477: Equation for r: change both p's to P's ----------------------------------------------------------------- Page 481, display callback glBufferData(GL_ARRAY_BUFFER, sizeof(points), +sizeof(colors)NULL, GL_DYNAMIC_DRAW); ----> glBufferData(GL_ARRAY_BUFFER, sizeof(points)+sizeof(colors), NULL, GL_DYNAMIC_DRAW); ------------------------------------------------------------------ Page 521, Bezier proposed that rather than using the other two control points, p_2 and p_3, ---> Bezier proposed that rather than using the other two control points, p_1 and p_2, ---------------------------------------------------------------- page 534 change d^2 p/dudv (0,0) = 9 (p00 - p01 + p10 - p11) to d^2 p/dudv (0,0) = 9 (p00 - p01 + p10 - p11) ---------------------------------------------------------------- Page 534, Section 10.8.5, Second paragraph, Suppose that rather than deriving a cubic polynomial that interpolates p_0 and p_1, ... ----> Suppose that rather than deriving a cubic polynomial that interpolates p_0 and p_3, ... Figure 10.31 should show segment interpolating p_1 and p_2. ----------------------------------------------------------------- Page 534, cubic Bezier formula b(u) = (1-u)^3 p_0 + (1-u)^2 u p_1 + (1-u) u^2 p_0 + u^3 p_3 ---> b(u) = (1-u)^3 p_0 + 3(1-u)^2 u p_1 + 3(1-u) u^2 p_2 + u^3 p_3 ------------------------------------------------------------------ page 535 The solution for the Catmull-Rom matrix is 1/2 [ 0 2 0 0 -1 0 1 0 2 -5 4 -1 -1 3 -3 1 ] ------------------------------------------------------------------ Page 538, the formula for l'(1) l'(1) = (l_3 - l_2) .... ---> l'(1) = 3 (l_3 - l_2) .... ----------------------------------------------------------------- Page 538, At u=0, the slope of l must match the slope of p, but, because the parameter for p covers only the range (0, 1/2),.. ---> At u=0, the slope of l must match the slope of p, but, because the parameter for l covers only the range (0, 1/2),.. ----------------------------------------------------------------- Page 543, divide_curve code t[i] = ( l[1] + r[2] ) / 2; ---> t[i] = ( c[1] + c[2] ) / 2; -------------------------------------------------------------- Page 573, R = [r_ij], a_ij = ... ---> R = [r_ij], r_ij = ... ----------------------------------------------------------------- Page 574, In general, patches are not self-reflecting so that f_ij = 0. ---> In general, patches are not self-reflecting so that f_ii = 0. ----------------------------------------------------------------- Page 580, ... overlapped slightly to created a seamless image. ---> ... overlapped slightly to create a seamless image. -------------------------------------------------------------- page 636 line 4 Second parameter should be 1 not 16 -------------------------------------------------------------- Page 608: in fopen: replace "r" by "rb" in InitShader. Reading data as binary instead of ascii cures sone issues on Windows. __________________________________________________________ Page 647, End of the page The block starting with // Set up menu item indices, ... enum { ... The following line should be deleted. Head = 1, -------------------------------------------------------------- Page 671, Section B.6 GRAM-SCHMIDT ORTHOGONALIZATION Should state b_1 = a_1/|a_1| -------------------------------------------------------------- Page 691, Third block void GlutIdleFunction(....) registers the display callback function ... ---> registers the idle callback function ... ----------------------------------------------------------------- Page 693, End of page glGenTextures(GLsizei n, GLuint name) ---> glGenTextures(GLsizei n, GLuint* name) returns in name the first integer of n unused integer for texture-object identifiers. ---> returns in name n unused integers for texture-object identifiers. -----------------------------------------------------------------