Skip to content

Review of CMSC 23700: Computer Graphics

As the winter quarter is about to wrap up, I feel the need to talk about one of my favorite classes this quarter — and honestly, one of my favorite classes overall: Computer Graphics.

I do not think I can begin this article with anything other than defining computer graphics first. What exactly is computer graphics?

Funnily enough, when we tried to define it on the first day of the quarter, our professor gave us an answer generated by Gemini and said it was good. So, to pay my respects to her and show my gratitude, I will do the same.

The answer I got from Gemini Pro was:

Computer graphics is a subfield of computer science focused on generating, manipulating, and displaying images and visual content using computers. It is the technology that bridges the gap between raw data and the visual information you see on a screen.

That seems pretty accurate to me. Unlike a film camera, for example, where the goal is to capture an image and store it on a piece of film through a chemical process, computer graphics tries to recreate images from a more fundamental form: math.

Computer graphics, as a field, is interesting to think about today. Not because it is not widely used — it absolutely is. It shows up everywhere: games, medicine, movies, scientific visualization, simulation, and much more. The interesting question is different: why do we still need to push it further when we already have so much?

If we look at high-end games like God of War Ragnarök or Elden Ring, it is obvious that we have already come a very long way. With enough time, budget, and computing power, we can create visuals that look incredibly close to reality. So why keep going?

The answer is resources. A common theme in this class was that rendering graphics is extremely computationally expensive. A modern 4K display, for example, contains about 8.3 million pixels per frame. If you want to render that at 60 frames per second, you are already talking about nearly 500 million pixel updates every second - and that is before considering lighting, shading, geometry, textures, physics, and post-processing.

That gives us a hard limit on what we can do. Better algorithms, better data structures, and better rendering techniques all make a huge difference. If we can make graphics more efficient while also improving quality, the possibilities become much larger. That is one reason computer graphics still feels so exciting: there is always more to invent and optimize.

The class was project-based, with four main projects and a final project. That structure made it one of the most rewarding courses I have taken, because instead of only learning theory, we built a graphics pipeline piece by piece and saw how the ideas connected in practice.

This project focused on rasterization by turning lines and triangles into pixels on the screen. It was a great introduction to how much precision and detail goes into even simple rendering.

This project extended rasterization into 3D with transforms, projection, and depth. It made the graphics pipeline feel much more real and much easier to understand.

This project focused on mesh editing and geometry processing rather than just rendering. I liked how it shifted the focus from pixels to structure, surfaces, and topology.

This project introduced rigging and skinning by connecting a skeleton to a mesh for animation. It was one of the most fun projects and showed how hard natural movement is to get right.

For the final project, we explored animation more deeply by building a system that combined Python with the Blender API to render animated deformations. The goal was not just to move an object from one place to another, but to create smoother, more expressive motion and shape changes using more advanced geometric tools.

We had a fair amount of freedom in choosing which algorithms we should implement. I personally used B-splines and free-form deformation (FFD) as core techniques. B-splines were useful for producing smooth curves and trajectories, which made animation feel much more natural than simple linear interpolation. FFD, on the other hand, gave us a flexible way to deform geometry by embedding it in a control lattice and manipulating that structure instead of editing every vertex individually. Using Python and the Blender API also made the project feel very practical, since it connected the theory from class to a real graphics toolchain and an actual rendering workflow.

A tiny example of the kind of code that made the project feel real is that even something as simple as evaluating a smooth path already looks very graphics-heavy:

import bpy
import numpy as np
from scipy.interpolate import BSpline
control_points = np.array([0.0, 1.2, 2.0, 2.8, 4.0])
knots = [0, 0, 0, 1, 2, 3, 3, 3]
curve = BSpline(knots, control_points, k=2)
frame = 20
x = curve(frame / 10.0)
bpy.data.objects["Lantern"].location.x = float(x)

Overall, CMSC 23700 was one of the most enjoyable and rewarding classes I have taken. It combined theory, programming, and visual feedback in a way that made every project feel engaging. Few classes let you write code and then immediately see whether your understanding is correct, and that made the learning process especially satisfying.

More than anything, the class made me appreciate how much math, design, and engineering sit behind every rendered image. Graphics is one of those fields where beautiful results come from deeply technical ideas, and I think that is a large part of why I enjoyed it so much.

I was inspired by Chinese New Year while making this. I am proud by how it looks like, espically because I started with almost nothing all the way till I rendered it. Hope you enjoy.

Play