Thursday, January 15, 2009

Render Workflow Overview

The main reasons for using RenderMan for Maya as my renderer are:
  1. Speed, especially when scenes are not raytraced
  2. Fast motion blur, which is important in my film
  3. Good memory management, which means fewer crashes (my Maya files contain anywhere between 2 and 200 characters, and can get as large as .5 GB)
  4. Render-time smoothing (i.e. subdivision scheme) enables me to avoid heavy polygon meshes in my already huge scenes
  5. Integration with Massive - initially, I was going to use Massive's direct integration with RenderMan, but have since abandoned this approach
  6. I'm a geek - I've always wanted to learn more about RenderMan because of its role in the history of CG
Due to time and resource constraints, I can't render everything with all the bells and whistles I like. I've avoided ray tracing because the size of my scenes would probably cause all sorts of memory issues and require heavy optimization. As a substitute, I've relied on RenderMan for Maya's point cloud occlusion, which is a non-raytraced solution. Even with this feature, however, I can't render entire scenes in a reasonable time frame. (i.e. less than 10 minutes per frame as I only have access to 4-6 render nodes at a time).

Therefore, I only use occlusion on the 'hero' characters such as Bir, his mother, the old man, the goons, etc. For the rest of the characters and the set, I baked the occlusion into the respective file textures using Mental Ray. While baked occlusion doesn't look as good as the real thing, the rendering speedup makes it a worthwhile compromise.

So for example, a multipass exr might contain:


DiffuseIndirect (i.e. Shadowing):


OcclusionIndirect (i.e. Ambient Occlusion):


Put the above layers together*, and you get:


Initially, I was rendering out all my render layers (such as the background, sky, etc) into multipass EXRs, but found that it was overkill and I really just needed that extra level of control on the hero characters.

* The actual compositing operations are:
(DiffuseDirect - DiffuseDirectShadow + DiffuseEnvironment) * OcclusionIndirect

** I left out the Specular components for simplicity, but the math is the same as for Diffuse

No comments: