Teapot Rendering – 2015

The animation is 1920x1080 and was rendered at 2048 samples per pixel. To get 25 seconds of animation at 24 frames per second we need to render 600 individual frames. Each frame is saved out as a separate png, to produce the animation I used ffmpeg to stitch them together into a video.

Here’s the resulting video. If you’d prefer to watch on YouTube I’ve uploaded it there as well but the quality is not as good due to compression. If your browser doesn’t play the video properly you can download it and watch it locally.

The animation contains quite a few different models:

I also make use of a mix of analytic and measured material models, the measured materials come from the MERL BRDF Database.


If you’d prefer to just see some stills from the animation I’ve put a few frames here that show off different parts of the animation. I really recommend watching the full video though, it’s very cool.

Compute Time

When I rendered this animation tray_rust didn’t support true distributed rendering (multiple machines cooperating on a single frame), however a simple and effective approach is to assign a subset of the frames to different machines so they split the work. Since each frame is saved out as a png each node’s job is completely independent of the others so we can just launch the renderer on a bunch of machines and not worry much about fault handling or communication overhead (since there’s none). This actually achieves pretty effective use of a cluster, as long as you have more frames than nodes.

To render the scene I used two clusters at my lab which don’t get much use over the weekend. I used 40 nodes with two Xeon X5550’s per node on one cluster and 20 nodes with two Xeon E5-2660’s per node on the other, for a total of 1280 logical cores (640 physical). I tried to balance the performance of the nodes when assigning frames to aim for an even-ish work distribution. The scene took a wall time of about 53 hours to render due to some of my jobs starting a bit later than other ones. The total wall time (sum of all nodes) is 2772 hours (16.5 weeks!), on average rendering took about 46.2 hours per node (wall time). The total CPU time (sum of all nodes) was 56853 hours (6.486 years!). Without using these clusters I don’t think I would have been able to render in such high quality, just due to how long it would have taken. I definitely need to spend some more time improving the performance of tray_rust.

Open Source!

This animation was rendered with my ray tracer tray_rust, which is an open source path tracer I’ve written entirely in Rust, a new programming language from Mozilla. Check out the source on Github!


For some more details on the work that went into rendering this animation please see this blog post.