CS 6620.001 "Ray Tracing for Graphics" Fall 2014
Welcome to my ray tracing site for the course CS 6620.001, being taught at the University of Utah in Fall 2014 by Cem Yuksel.
Welcome fellow students! I have lots of experience tracing rays, and with graphics in general, and so I'll be pleased to help by giving constructive tips throughout (and I'll also try very hard to get the correct image, or say why particular images are correct as opposed to others). If you shoot me an email with a link to your project, I'm pretty good at guessing what the issues in raytracers are from looking at wrong images.
Hardware specifications, see bottom of page.
Timing information will look like "(#t #s ##:##:##)" and corresponds to the number of threads used, the number of samples (per pixel, per light, possibly explained in context), and the timing information rounded to the nearest second.
Project 14 - "Teapot Rendering Competition" (Round IV)
I rewrote my renderer again. This time, I spared no expense in making it flexible, powerful, fast, usable, and so on—which is also why it took months. In fact, I had a great idea for a submission, and I even though I started working on it, I realized I just didn't have time, even if rendering were free. I'll save it for next year though.
Instead, I came up with a simple scene in my emerging "still life" style. I decided to make it a tribute to graphics at the University of Utah. To that end, I put in:
- Utah Teapot: Our most obvious and famous contribution. I put the University of Utah's logo on it.
- Phong-shaded sphere (metallic orange, left): Shaded using (an energy-conserving scale of) a Phong specular lobe. Bùi Tường Phong developed Phong shading in his 1973 PhD from the U and a 1975 paper.
- Catmull-Rom spline (chalkboard diagram, back): Another Utah-related contribution.
- Fiber-level yarn square: Represents recent Utah graphics work on rendering yarn, in-particular Kui Wu. Shout-out to Kui Wu, also, for kindly generating the fiber-level data from Cem Yuksel's data! That little rectangle takes up multiple gigabytes of RAM during the render.
- Multiple glass objects of various colors: Represents work at the U done in the area of light transport, such as my research. They are reddish, greenish, and bluish, since those are the three primaries commonly used (not by my renderer, though; this image was rendered with full-spectral path tracing!).
- Printed circuit board: Represents the Utah Hardware Raytracing group (HWRT), of which I am a part.
- Hairball (behind circuit board): The HWRT's favorite model.
- Post-it note: represents certain in the HWRT's propensity for writing stuff on pink post-its.
- Rendering equation (on post-it note): Represents Jim Kajiya's foundational work (PhD from the U, 1979), inventing the rendering equation.
- Wrinkled tablecloth and porcelain bust: represents projects at the U dedicated to physically based animation. The cloth represents cloth simulations and physics generally, while the bust represents recent projects in face and body animation in Ladislav Kavan's subgroup.
- Candle: Represents Cem Yuksel's recent work on fire/explosion animation. Also, his role as a leading-light of the various graphics groups.
Click for full resolution!

For rendering, my new renderer is a spectrally-correct unbiased path tracer, striving for ultimate physical accuracy. It reconstructs CIE XYZ radiance values at each pixel using Mitchell-Netravali reconstruction filtering, which allows me to trace up to 8 wavelengths at a time and completely eliminate quantization error due to spectral binning (which, to be clear, I don't have).
Indexing triangle meshes for all loaded objects is vital for memory efficiency, especially for the larger models, like the hairball and bust. The fiber-level yarn is loaded from Cem's ".bcc" format (after I converted Kui's output to that by script). This produces many tessellated spline curves, which I load as cylinder primitives. It intersects the cylinder primitives directly; tessellating to triangles would use ridiculous memory. You can see a better view of it in a test render. For some of the models, like the prism and the table, I deliberately rounded sharp corners to give it a feeling of realism. I also added normalmaps, a new feature, to add gritty realism to most objects. If you zoom in on e.g. the teapot, you can see fine scratch marks altering the refraction.
The cloth wrinkles came out of a simulation in Blender (the texture is a Crytek Sponza curtain). Unlike last year, I did not use Blender to compose the scene—my renderer turned out to be fast enough to prototype just by test rendering (though I wouldn't do it again). Positioning e.g. the PCB and the prism turned out to require careful fiddling with the camera to get a useful view. There is a subtle (but important) meniscus on the water inside the teapot. This is modeled as actual geometry—and it was a pain since Blender has an apparent bug that prevented their CSG from working correctly.
For rendering, I used my laptop and my lab machine for proof renders, with long-running jobs going on the lab machine. I was pleased that my raytracer's performance allowed me as many 1000+ sample/pixel renders as I really wanted. For some configurations, the slowest part of the whole process was loading the scene into memory (even after load, it renders in 8.7 GB, most of that triangles and cylinders).
All models were found free for non-commercial use, or else modeled myself. Even in the former case, most models were heavily modified.
The final render was done on my lab machine at a resolution of 4 096⨯3 072 with 10 000 samples per pixel. This works out to 125 829 120 000 (~126 billion) primary rays. In-practice, we can multiply this by at least 3 (one is inside the lens, one goes to the scene, minimum one reflection hitting the environment map). However, the maximum ray depth is 16, so there could be up to 2 trillion rays in this image. My guess is it's more like 400–600 billion. My renderer reports that it took 266 419.539 796 seconds.
My image won first place in the rendering competition this year. There were many interesting entries. I especially liked Nathan Morrical's. I was disappointed that Laura Lediaev and Will Usher didn't compete this year, as their entries are always exceptional.
Proceed to the Previous Project.
Hardware
Except as mentioned, renders are done on my laptop, which has:
- Intel i7-990X (12M Cache, [3.4{6|7},3.73 GHz], 6 cores, 12 threads)
- 12 GB RAM (DDR3 1333MHz Triple Channel)
- NVIDIA GeForce GTX 580M
- 750GB HDD (7200RPM, Serial-ATA II 300, 16MB Cache)
- Windows 7 x86-64 Professional (although all code compiles/runs on Linux)