We've still got one more hidden surface–removal algorithm to talk about in this tutorial: BSP trees. Using a z-buffer is great for 3D moving objects, but drawing every pixel on the screen using the z-buffer can be a bit too slow. You'll fix this in the next chapter with BSP trees. But in this chapter, as usual, we've tackled a lot of concepts. You learned about some hidden surface–removal techniques and implemented a z-buffer using 1/z as the depth. Of course, you created a renderer to draw polygons using the z-buffer. Also, you created a system to perform 3D object animation on polygon groups and created a parser to load 3D models from OBJ files. Finally, you created a base class for game objects, created a couple sample game objects, and tried everything out with a demo. With all these concepts, you've created some impressive results; in the next chapters, you'll extend these concepts even further.