Foundations

of

Game Engine Development

This is the errata page for the Foundations of Game Engine Development book series. Corrections are listed by volume and printing. To find out which printing you have, look on the copyright page. Errors listed for any particular printing also appear in earlier printings, but were corrected in all later printings.

Foundations of Game Engine Development, Volume 1: Mathametics

Volume 1: Mathematics

Fifth Printing

  • There are no known errors in the fifth printing.

Fourth Printing

  • Page 92. In the second line preceding Equation (2.72), the reference to Equation (2.70) should instead be a reference to Equation (2.71).

Third Printing

  • Page 21. The end of the sentence preceding Equation (1.33) should read “then the dot product can also be expressed as”.

Second Printing

  • Page 18. The third line following Equation (1.28) should begin with “v = (0,0,1)”.

First Printing

  • Page 21. In the caption for Listing 1.6, the listing number should be set in bold type.
  • Page 45. In the paragraph that begins with “Steps A and B are called pivoting”, the fourth line should read “by choosing the largest entry in each column because this causes the scalar factors”.
  • Page 65. In Equation (2.23), all of the off-diagonal elements in the left matrix should be negated. For example, the (0,1) and (1,0) entries should both be −axay.
Foundations of Game Engine Development, Volume 2: Rendering

Volume 2: Rendering

Third Printing

  • There are no known errors in the third printing.

Second Printing

  • Page 77. In Listing 6.5, the last row of the matrix should be 0.0F, 0.0F, 0.0F, 1.0F.

First Printing

  • Page 182. In Equation (8.66), both minus signs should be plus signs.
  • Page 184. Related to previous item. In Equation (8.73), both minus signs should be plus signs.
  • Page 286. There is a bug in the last part of Listing 9.20. (The code on this website has been corrected.) The final loop should be the following:
    for (int32 i = 0; i < vertexCount; i++)
    {
        bool cull = false; int32 j = i & 1;
        const Vector3D *v2 = &vertex[i];
        Vector3D planeNormal = Normalize(Cross(*v2, *v1));
        for (int32 k = 0; k < 4; k++)
        {
            const Vector3D& frustumNormal = frustumPlane[k].GetNormal();
            float d = Dot(frustumNormal, *v2);
            vertexDistance[j ^ 1][k] = d;
    
            // Cull edge lying in frustum plane, but only if its extrusion points inward.
            if ((fmax(d, vertexDistance[j][k]) < kOccluderEpsilon) &&
                (Dot(planeNormal, frustumNormal) > 0.0F)) cull = true;
        }
    
        if (!cull) occluderPlane[planeCount++] = Plane(planeNormal, 0.0F) * McamInverse;
        v1 = v2;
    }