This course gives a comprehensive introduction to the theoretical and practical aspects of computer graphics. The first half of this course is devoted to the implementation of a ray-tracer, a method for generating pictures of virtual scenes, which is used for special effects and computer-generated movies. A basic version of such a ray-tracer is developed already in the first week. While learning about the theory of local lighting models, colour, homogeneous coordinates, and texture mapping, we keep extending the code until it eventually handles moving objects, shadows, reflections, and refractions. The second half of this course treats the concept of rasterization, an alternative approach to image generation, which is used in games, for example. After implementing our own rasterizer, we learn how to use the OpenGL library and how to program the GPU to achieve special effects. For all programming tasks we provide a framework, so that the students can concentrate on implementing the core methods and algorithm.