2025 June 3,
You are not responsible for knowing this material in any project work or exam. I put it here, just to give you a glimpse of graphics topics that we didn't have time to explore.
Although we started in two dimensions for the sake of clarity, this course is really about 3D graphics. We can use our triangle-rasterizing 3D engine to do 2D graphics by restricting our meshes to a plane. However, there are many techniques specific to 2D graphics that we've ignored entirely.
Bresenham's algorithm is how you rasterize lines. More generally you might want to rasterize splines. Then you can think about rendering vector fonts.
Graphical user interfaces are built using scene graphs. TeX's page layout algorithm uses a similar idea: nested bounding rectangles.
Image processing is a huge topic. It connects to mathematical topics such as Fourier analysis, statistical topics such as time series, and AI topics such as computer vision.
We've studied nearest-neighbor filtering, bi-linear filtering, and perspective-corrected interpolation, but our textures still look pretty poor. One reason is that good textures require artistic work. But there are also technical reasons.
Mipmapping greatly improves the appearance of textures, especially when many texels map to a single pixel.
Anisotropic filtering incorporates perspective effects into the texture filtering itself.
We have implemented only rudimentary scene graphs made of bodies with relative isometries. More sophisticated scene graphs can have other kinds of nodes and even other organizational principles.
A level of detail (LoD) node has multiple children, all representing the same subscene, at differing levels of detail. The renderer chooses among them dynamically, to avoid rendering unnecessary detail. But you might get popping if the transition from one LoD to another is not managed well.
A physics engine simulates gravity, detects collisions, etc. The bodies form a graph based on static relationships (joints) and dynamic relationships (collisions). A basic, understandable example is Open Dynamics Engine; see for example this video.
Ray tracing a mesh is slow. The naive algorithm requires you to intersect a ray with each triangle. You probably want a hierarchy of enclosing primitives to prune the scene aggressively. You end up with something like a scene graph with LoD pruning.
Ray tracing is highly parallelizable. Starting in the late 2010s, you can now do ray tracing on many GPUs.
Sometimes, developers compensate for the expense of ray tracing by sacrificing other aspects of performance or quality. For example, check out the aggressive LoD culling on the ground around 11:55 of this Battlefield V video.
As far as improving the quality goes, the obvious next step is distribution ray tracing. It's expensive.
In earlier versions of CS 311, I've had students implement textured light (below left) and shadow mapping (below right).
Ambient occlusion is the idea that fragments in crevices and corners should receive less ambient light than fragments that are more exposed in the scene.
Global illumination is the general problem of how light bounces around a scene. The rendering equation captures the theoretical ideal. One quasi-practical solution is distribution ray tracing. Another is radiosity.
Deferred shading is a rearrangement of the triangle rasterization algorithm. As far as I can tell, most contemporary high-end video games use variants of this algorithm. Adrian Courreges has detailed analyses of games such as Deus Ex: Human Revolution and the 2016 version of Doom.
Anti-aliasing, bloom, depth of field, and motion blur are all techniques involving some kind of tactical blurring.
Translucency in triangle rasterization? It depends on how the translucent bodies overlap on the screen. Try the painter's algorithm paired with careful scene design.
You can build a human figure as a collection of rigid bodies. But the figure will look better if the bodies join together smoothly. See skeletal animation.
Geometry shaders and tesselation shaders are shader stages that we haven't discussed.
We've used randomly generated landscapes. We could study procedural textures such as Perlin noise, fractal landscapes, fractal foliage, etc. Jade Kandel is an alumna of this very course, who makes algorithmic art, including many of the pieces on display in our computer labs.
When the user clicks the mouse on the scene, how do we know the world coordinates of the click, and which body was clicked on? This is the picking problem.
Perhaps it's because I'm too lazy to make good textures, but non-realistic techniques such as cel shading (below left) really appeal to me. Also, my research uses 3D graphics for visualizing scientific data sets (below right), and textures are rarely involved.