I haven't done one of these in a while, so here goes: A selection of work form the last couple of years. John Carter, Wrath of the Titans and Pirates of the Caribbean were done at Moving Picture Company in London, while Trollhunter, Max Manus and various commercials were done at Storm Studios in Oslo.
I wrote a quick implementation of interpolated shading normals. There's still a couple of subtler adjustments I need to handle non geometric normals a bit more gracefully in the surface integration pipeline, but the basics are there and I must admit it's nice to render something (deceptively) smooth for a change:
This week has been mostly under-the-hood stuff, so no shiny new features. I've changed the way I'm parsing object transforms as well as the way I manage space transforms during rendering. I also reduced the algorithmic complexity of importance sampling texture maps as per the 2010 Siggraph course on importance sampling, resulting in significant speedups for drawing samples from Infinite Area Lights with large environment maps compared to my previous, naive implementation. It's still pretty memory hungry - as I'm storing a pdf value per pixel - but I believe I've seen a couple of papers using various other means of drawing samples by dividing the map into regions, so I'll be taking a look at those at some point.
Render of the week:
-Just over 1 mill polys, two area lights and an infinite area light with a texture map, 1k resolution at about 4k samples per pixel
I finally got around to implementing image based Infinite Area Lights, which also meant introducing the concept of a world space. It's a relatively naive implementation, but does the job as a first version: Reads a latlong exr from disk, computes a pdf table and works like any other importance sampled light source, but with the added benefit of the visual complexity of an environment map.
The obligatory bunnies, various number of pixel samples (I just let each of them run for a couple of minutes on my old laptop), single infinite area light source:
And just for fun, I let this one run over night:
360k polys, 2k samples per pixel, grey diffuse shader on everything. Model (courtesy of www.cgtalk.com lighting challenges) is water tight, and the only lightsource is a huge area light outside of the windows, with a boatload of light bounces.
The noisiness even at 2k samples shows I need to decide on what to implement to help indirect-based scenes like this. The next logical step is a bi directional path tracer, which helps in a lot of indirectly lit cases, but for a scene like this one I believe I'd also need metropolis sampling in order to see real improvements, since so many of the light samples would end up just hitting the wall outside without anything to guide them through the window. There's also some aliasing around the window frames due to the massively intense light source, which comes from the fact that I have a pretty naive pixel filter at the moment (box 1x1).
Other than stress testing the image importance sampling I think the final thing on the feature list before diving back in to clean up some code and working on efficiency is shading normals.
Having a simple Maya integration makes setting up scenes about a million times easier. I enjoy plotting in transformation matrices by hand as much as the other guy, but at some point you just want to create a sphere, attach a shader and hit render. With this new found freedom I set up a couple of test scenes to start implementing MIS, and quickly found I had a couple of subtle bugs in my light transport implementation. Cancelling out terms is all well and good until you need to sample the pdf outside of evaluating the brdf itself..
The result of this week is an implementation of a Kelemen material, with a coupling of a cook torrance spec and matte brdf, plus Multiple Importance Sampling for my forward path tracer.
The result, courtesy of the somewhat standard contrived setup (area lights at increasing size, planes with spec brdf at increasing roughness), at 64 samples per pixel: