Review: Computer Graphics (CMU 15-462/662)

(Pictures from CMU 15-462 course site)

The Entertainment Technology Center (ETC) of CMU has a very unique curriculum policy, where the first semester is filled with 4 compulsory courses and the rest of 3 is filled with a project and an elective course respectively. Hence, when it came to the first “free elective semester”, I spent a lot of time deciding which course should I take. I decided to go for Computer Graphics at last, mainly because of the following reasons:

  1. CG has been one of the basic branches of video game since the first game was created, and is becoming more and more important for the whole entertainment industry. It brings a huge revolution of the visual experience and still has a great potential for delving;
  2. CG is closely linked to Virtual Reality and Augmented Reality, which are popularly viewed as the future of games;
  3. Many alumni of ETC highly recommended this course, saying that it explains the profound simply and is useful in their career;

So I took it. It gave me an extremely impressive semester – not only because of its intensity, but also what it left to me. I didn’t stay awake the whole night before the due day as many alumni did, but I did “suffer” a lot. There was even a time when I was super frustrated and wanted to drop off. Thankfully, I didn’t do so. Instead, I found myself learned a lot from the struggling. Hence, I would like to write a brief review of the course (mostly depends on my level) as a reference for any ETC students who will consider to take this course in the future.

Overview

The course is basically project(assignment)-driven. There were 4 assignment this semester (5 in the fall semester, the last of which was merged in the 4th one in spring), mapping to 4 chapters (as I viewed) respectively. There was one midterm and one final exam, both of which were not taking a huge weight to the final grading.

  • Prerequisites: If you got a bachelor related to Computer Science or Computer Engineering or whatever that had taught you basic C++ and object-oriented programming, I assumed you will be FINE (what I mean to be fine is that you will be able to read the code base. Still, reading and understanding each part of it was a great challenge for me D:)

  • Environment: The course required CMake for building. It taught us how to build the code in the first assignment guide. The makefiles run pretty well under Linux, sometimes might break on Mac but the TA will fix it in time. It doesn’t work on Windows at all. You’ll have to modify the makefile every time if you want to build it on Windows. I myself would recommend any entry-level student as I was to use Linux, not only because CMU provides free VMware license, but also for learning how to use terminal. I seldom used it before I took the course and had no idea with shell. During this course, I started getting used to the command line and found it way more convenient than GUI, especially for version controlling on GitHub. Besides, there are lots of powerful text editor which support Linux such as Atom or Visual Studio Code nowadays. Visual Studio is not the only convenient choice for coding or debugging anymore.

  • Textbook: You don’t need a textbook! But I would personally recommend you to rent at least one textbook mentioned at the very beginning of the course. I didn’t use any book at all but I found it really hard to follow during the lecture, partially because the slides were sometimes too vague to me.

  • Piazza: The course used a platform called piazza (which is also being used in BVW in the first semester) as the  discussion board. It is actually very useful. You can raise your questions or browse questions raised by your classmates. Both the instructor, TAs and your classmates could give you some help on it. All questions or notes (which is usually used as announcement) are nicely tagged so the interface is really clear. I myself solved a lot of problems by posting or reading questions on piazza. Of course, if piazza is not efficient enough for you, or your problem cannot be described or solved clearly through text, you can always turn to TAs for help during their office hour – and I personally highly recommend you to do so, though main campus is somewhat far away from ETC.

Contents

As mentioned above, I would split the whole course into 4 sections according to the 4 assignments:

  1. Introduction

    In this section, we learnt (or, to be more precisely, reviewed) some mathematical foundations such as matrix transformation that are crucial in the whole semester. Then, we learnt basic 2D rasterization and optimizing operations of a texture such as bilinear and trilinear filtering. The assignment included relatively easy tasks such as drawing a triangle, using supersampling to anti aliasing, etc. It took time for me to start tough, since I was a noob for a code base in such a scale (not big, not even medium, but was big enough for me to be shocked at that time). Here I learned the most principal task for programmer that I was never told in my undergraduate – the ability of READING codes. Below are some results of our implement of an SVG renderer.

  2.  Geometry

    I would say this section is a stage of relaxation after struggling of the start, or say “the calm before the thunderstorm”. It’s mainly about how to edit (implement editing) meshes. Both lectures and assignment are easy to be understood,especially the assignment. The guide of this section is the most clear and detailed one among all of them. Even so, you have to be careful about boundary conditions. You might encounter lots of segmentation faults if you failed to consider all limitation. Below are some result of our implement of a mesh editor.

  3. Light, Rendering, and Materials

    Here comes the nightmare part. Suddenly, a bunch of mathematical and physical concepts were thrown to our face. I hate to admit I totally lost my mind on it at the very beginning. I understood every single word on the slides but I cannot read them as a whole sentence. The guide is vague, I had no idea which parameters or functions I should use. I had no idea what the heck of those parameters provided in the formulas are. I didn’t know what I was going to do, I thought I might fail in this course. I was DONE! … But hey, I’m not done yet. Luckily, I found a SUPER USEFUL WEBSITE to save my life.I HIGHLY RECOMMEND anyone who want to take this course to read through the link above during the vacation BEFORE getting into the course. It’ll save lots of time and save you from confusion. To tackle this section, UNDERSTANDING the mechanism behind is extremely crucial. It is only not about covering formulas to the code as previous ones, it’s also about CONVERTING formulas into reasonable data structure (such as how to implement Bounding Volume Hierarchy) and valid algorithm (such as path tracing of global illumination). It is hard. It is EXTREMELY hard. At least for me. But when I looked back, I learned a LOT from this project UNEXPECTEDLY. For example, during coding the BVH part, I got to know several new features of C++11, such as lambda ( for setting partition of the index of the tree) and range-based for loops (for traversal). Below are one of the result of our implement of a 3D renderer. Still, the content of the final examination was not limited to the slides. Reciting the materials is far far away from the test. In the final exam it required us to comprehend all the concepts mentioned in the course thoroughly, and to be able to distinguish and use them, which I didn’t make it well 🙁

  4. Animation and Going further

    The last part of the course is basic concept of animation. It mentioned a little bit about image processing, which I’m not really into, and computational camera, which I failed to understand well. The last assignment was self-selected. We could choose our task from several options. I choose to implement an SPH Fluid Stimulation. There are a lots of reference online and, mostly because I found my confidence back after tackling assignment 3, I found the task pretty interesting. I read through all the reference and some codes from other, understanding the mechanism, and then coded my own system. The original system seemed alright but was a little bit strange at some parts. I took about 3 days to fix the bugs and optimized the parameters. My code could be viewed here.

That’s it. Hope it will be useful for you. Good luck in the upcoming semester 🙂

Leave a Reply