Recently, we were asked about a not-so-well-known feature to help rendering heavy scenes with mental ray inside Maya, or 3ds Max.
You may skip the introduction and jump down to the setting at the end of this article. For those who are into details, here is a little background.
As you might know, mental ray is based on the concept of “loading on demand”, which helps to cope with huge amounts of data that won’t ever fit into the available memory at once. Buying more memory for your rendering machine will help, but, at the same time, your scene size and texture needs have grown again. Well, typically you should not notice since mental ray takes care of handling these cases automatically. It delays all operations that are memory exhausting or expensive to compute to the latest point in time, and only executes them when really needed to render the current pixel. That is true for scene data, when loading elements from an assembly or Alembic archive, but also for textures, reading and decoding only those textures needed, possibly even keeping just pieces of it in memory, so-called “tiles“. Most importantly, the tessellation of source geometry into triangle data is done on demand only, absolutely critical when working with very detailed displacement. Finally, this mental ray machinery of demand loading is also exposed to shader writers.
Let’s look at mental ray for Maya and its use of this technique for scene translation. Normally, if you do a preview render in Maya (like “Render Current Frame“), the whole scene will be converted to the mental ray database before the actual rendering starts, often referred to as the “translation” step. This will include every scene element independent of its contribution to the rendering of the frame or animation. What is usually OK for most scenarios, might become a bottleneck in extreme situations with many large pieces of geometry or several big chunks of hair, especially if they are not really actively involved when rendering the current view. Like in the example below (a quickly painted cityscape in Maya, but you get the idea)
The usual answer to this problem would be: create a mental ray assembly for those scene parts and reference that in your master scene. But, there is an easier way right from within Maya:
Enable “Render Settings > Options > Translation > Performance > Export Objects On Demand“, as marked below.
What is it doing ?
It does not pre-translate geometry before rendering starts, as it usually does, but delays it to rendering time. The translation just creates so-called “placeholders” – basically bounding boxes around the pieces of geometry – that will trigger execution of the actual translation only when a ray hits that box (or a certain feature is requesting the actual geometry). Because translation becomes very fast it finishes almost unnoticed, so that the Maya progress bar typically starts with “mental ray rendering…” . Leaving the “threshold” setting at 0 (zero) will cause all objects to be demand-loaded, even if tiny. That may be inefficient. Increasing this to a higher number, only those objects with its number of points/vertices beyond the value will be considered for demand loading, the rest gets pre-translated.
Please remember, that in a ray tracing or global illumination context all the objects may be demand-translated immediately anyway even if out of sight! In that case there may be no real benefit using this mode. And, this translation mode has a certain runtime overhead attached to it, so it may pay off only in certain cases, and only with an appropriately chosen threshold.
This setting is saved with your scene. That means, it will also work with “Maya Batch”.
You are working with 3ds Max ? The same feature is available here too, enabled with “Render Setup > Processing > Translator Options > Memory Options > Use Placeholder Objects“, as shown below.
Just give it a try, and leave a comment if you find it useful.
the mental ray Standalone has a similar feature if bounding boxes are given in the .mi file. It is enabled on the command line with:
> ray -reload