Computer Graphics Programming

I took several computer graphics courses in college. I enjoyed these courses a lot. Computer graphics are great a computer-science challenge. They are technically difficult to program and they offer many opportunities to research and develop new and innovative computer algorithms, and yet they are not so math-heavy as to be inaccessible to typically a college student.

These courses introduce students to graphics cards (GPUs) which are fascinating devices with unique capabilities. GPUs are an important tool in scientific programming. GPUs are extremely good at certain tasks (and pretty bad at most other tasks) and understanding these natural capabilities takes time and experience. With a bit of creativity, many tasks can be reformulated to be more suitable for a GPU.

And finally, I enjoy computer graphics programming because it generates pretty pictures!
Here are a few of them:


CSCI-711-01: Global Illumination

This was a graduate level course that I took as an undergrad. The course focused on physically based rendering and photorealistic lighting. In the time since I took the course the field of computer graphics has advanced tremendously. I genuinely think that in 20 years everyone's computer or playstation will have real-time photorealistic graphics.

Physically based rendering (PBR) is the idea that instead of trying to approximate what a material looks like, we can measure its visual properties using scientific instruments and the run a physics simulation to generate an image of the material.

The key to photorealistic lighting in computer graphics is of course ray tracing. Lots of rays! The more rays the better it looks. Every pixel has a few rays, and every shadow is calculated with a ray from the surface to the light source. In this course we implemented a ray-tracer on the CPU. This image was the part of the final assignment of the course: to render a reflective metal sphere and a translucent glass sphere:

Two Spheres, ray traced

For extra credit I incorporated a K-D Tree into my ray tracer program. K-D Trees are a spatial data structure that can quickly find all of the objects (triangles) in any given area of the scene. Ray tracer use spatial data structures to narrow down the list of possible ray-object intersections before doing the actual ray-triangle intersection check which is quite time-consuming.

I present The Stanford Bunny, rendered by my ray-tracer. This model has 69,451 triangles.

The Stanford Bunny, ray traced

Time to build the K-D Tree: 5.6 seconds
Time to render the scene using the K-D Tree: 86 minutes
Time to render the scene without using the K-D Tree: TOO LONG (time > 24 hours)