AOVs (Arbitrary Output Variables) provide a way to render any arbitrary shading network component into different images. For example, an artist might find it convenient to separate direct and indirect lighting contributions and later recombine them during compositing. Arnold provides built-in AOVs for outputting depth, position, and motion vectors.
There are some limitations:
- Using closures as AOVs is not currently supported.
- A maximum of 16 different light AOVs is supported, although a given AOV can contain a bundle of any number of lights.
3ds Max does not support more recent EXR formats natively, and you may have issues using Arnold generated EXRs in your scenes. EXRs with only one layer should work.
- Multichannel EXRs are possible using 'Add AOVs to singe file'.
- Tutorials using AOVs can be found here.
- AOVs do not have any Exposure Control (tone mapping) applied to them. However, the beauty pass specified in the Common tab will, and this appears in the Rendered Frame Window. Unlike Render Elements, AOVs are saved by Arnold and do not show up in the window after rendering.
AOVs are similar in concept to Render Elements, in that they separate out components of the rendered image as it is produced, and sends it either to a separate output file and/or as a channel in an EXR. Arnold supports output types and features not found in Render Elements.
Arnold provides the following 'built-in' system AOVs. These AOVs are always available, no matter what shader(s) you are using.
- A: Alpha.
- AA_inv_density: Visualizes the sample density with Adaptive Sampling. Use it with a Heatmap filter.
- ID: Random number value derived from the name of the shape. You can also add specific ID numbers via the user options string field for an object. ie 'id 1'.
- N: Smooth normal at the shading point (in world space).
- P: Position of the shading point (in world space).
- Pref: Reference position of the shading point.
- RGBA: Beauty AOV, containing the full rendered image.
- Z: Depth of the shading points as seen from the camera.
- albedo: Reflectivity, the surface or volume color without lighting or shadowing.
- background: Emission from the background and skydome lights visible to the camera.
- coat: Coat reflection.
- coat_albedo: Coat color without lighting or shadowing.
- coat_direct: Coat direct lighting.
- coat_indirect: Coat indirect lighting.
- cputime: This layer contains the CPU time (measured in “ticks”) to evaluate the samples in the pixel.
- diffuse: Diffuse reflection.
- diffuse_albedo: Diffuse color without lighting or shadowing.
- diffuse_direct: Diffuse direct lighting.
- diffuse_indirect: Diffuse indirect light.
- direct: Direct lighting from all surfaces and volumes.
- emission: Lights and emissive objects directly visible from the camera.
- indirect: Indirect light from all surfaces and volumes.
- motionvector: 2D vector representing the motion in screen space of the shading point during the given time interval. If output to an RGB format, the vector is contained in the R and G channels.
You must set an instantaneous shutter for the camera. The reason being is that we don't want motion blur in the render, but we still want the motion velocity information in our motion vector AOV. This can be found under Motion Blur-> Instantaneous Shutter.
- opacity: RGB AOV with full three-channel opacity (as opposed to single channel alpha).
- raycount: Total number of rays traced for samples in the pixel.
- shadow_matte: Shadows in the scene, computed as the ratio of occluded direct lighting over unoccluded direct lighting.
- sheen: Sheen weight.
- sheen_albedo: Sheen color without lighting or shadowing.
- sheen_direct: Sheen direct lighting.
- sheen_indirect: Sheen indirect lighting.
- specular: Specular reflection.
- specular_albedo: Specular color without lighting or shadowing.
- specular_direct: Diffuse direct lighting.
- specular_indirect: Diffuse indirect lighting.
- sss: Subsurface scattering and diffuse transmission.
- sss_albedo: SSS and diffuse transmission color without lighting or shadowing.
- sss_direct: SSS and diffuse transmission direct lighting.
- sss_indirect: SSS and diffuse transmission indirect lighting.
- transmission: Specular transmission (refraction).
- transmission_albedo: Specular transmission color without lighting or shadowing.
- transmission_direct: Specular transmission direct lighting.
- transmission_indirect: Specular transmission of indirect lighting.
- volume: Volume scattering.
- volume_z: The Z depth for the first volume contribution is output in a flat AOV.
- volume_albedo: Volume color without lighting or shadowing.
- volume direct: Volume scatter direct lighting.
- volume indirect: Volume scattering indirect lighting.
- volume opacity: RGB AOV with the full three-channel opacity for volumes only.
The other AOV groups correspond to the shader nodes being used (assuming those shader nodes support AOV). For example, Shadow Matte provides:
- shadow: Direct light shadow.
- shadow diff: A difference AOV which can be used to eliminate the shadow from the direct component.
- shadow mask: This AOV can be used in comp to localize and tweak the shadow.
Other shaders used in your scene will support various other AOVs. Multiple shaders can contribute to the same AOV (for example a Standard Surface and a Lambert shader both write to the diffuse_direct AOV).
Composing the Beauty AOV
The RGBA beauty AOV can be split into smaller AOVs where each contains part of the lighting. In compositing, these AOVs can then be individually modified and added together to get the full beauty AOV.
More AOVs give more control in compositing, but also extra work to handle, and they take up more memory and disk space, especially combined with light groups.
Some example sets of additive AOVs for the full beauty AOV are:
- direct, indirect, emission, background.
- diffuse, specular, coat, transmission, sss, volume, emission, background.
- diffuse_direct, diffuse_indirect, specular_direct, specular_indirect, coat, transmission, sss, volume, emission, background.
Simply adding together such AOVs is all that is needed for the beauty AOV. The albedo AOVs are not needed to reconstruct the beauty AOV but may be used for example to get just the lighting without the surface texture, by dividing diffuse by diffuse_albedo, or for denoising just the lighting while keeping the texture detail intact.
A tutorial about compositing AOVs can be found here.
A simple scene that has AOVs setup can be downloaded here.
To the right of the Arnold Renderer tab of the Render Setup window, you should see the AOVs tab. MAXtoA takes a file-centric approach. You start defining your AOVs by first specifying the file type that you want to produce and then the AOVs you want to save to that tile type. The supported file types are along the top:
Supported AOV file types
Once you click on a file type, the dialog shifts to allow you to select the AOV names. The available AOVs for each group are shown in the list below. Select the AOVs you want to use for your render from the list.
Select 'Add' at the bottom. This will add the selected AOVs to the output file. If you choose an EXR or DeepEXR file type, you will then have a checkbox option to 'Add AOVs to a Single File'. All of the AOVs will be merged into one file by Arnold. If you choose a TIFF, PNG, or JPEG type, you will get separate files for each channel selected which will be saved by Arnold.
If you have defined a custom AOV name in your scene, you can also add it as a text string and then press the 'Add Custom AOV' button (shown below) to create the AOV at render time.
Below is the resulting tree view when multi-selected AOVs have been chosen with a non-EXR file type (JPEG for albedo and direct_diffuse in this example), and also when an EXR type is chosen.
Ctrl-Click the AOVs to multi-select or toggle your selections
Here the albedo AOV is being saved to a JPEG file with the same name as the AOV. An EXR called 'AOVs' will be created that includes multiple channels. The AOVs file name is shown selected, so the options for that file type (DEEPEXR) are shown below the tree view. By default, the full file name that Arnold saves to matches the render output file name plus the AOV name. So if you have specified 'MyRender.jpg' on the Common tab as your beauty pass, the AOV file name saved to disk is 'MyRender_AOVS.exr'. AOVs are saved to the same path as the beauty image, and cannot be currently changed.
- You can also view the defined AOVs in the ActiveShade window.
You can adjust AOV settings, and change the AOV type, by selecting the AOV type in the tree view:
The AOVs use the image pixel filter defined in the Arnold Renderer tab. Gaussian is the default.
This is particularly useful if you also want to render a custom effect that is not available from the existing AOV list in MAXtoA. This custom AOV can be used with any compositing software such as Nuke. You can write the output of a shader in a custom AOV via an aov_write shader.
- You have to define the name of the custom AOV and select Add.
Then the newly created custom AOV will be automatically activated.
Denoise with OptiX
Choose to denoise the active AOV using the Optix denoiser.
A list of shaders can be defined that will be evaluated after the regular surface shader. With this, it's possible to add shaders to set specific AOVs without modifying the original shader tree. Shaders intended for this purpose should add a booleanmetadata named
aov_shader on the node itself, as a user-interface hint. If
options.background are set, these global AOV shaders will also be run for atmosphere and background contexts.
Only shaders with AOV-writing capabilities should be added to 'AOV Shaders' in AOVs.
AOV shaders such as Cryptomatte can also be added to 'AOV Shaders' in AOVs.
Each light object has an AOV parameter which writes out the light contribution to a separate AOV with a corresponding name. Available per-light AOVs are displayed in the lists with the (light group) postfix once any of the lights have an AOV light group defined.
Emission from other sources and lights that have not been assigned an AOV light group name will contribute to the _default AOVs.
<L.'groupname'> syntax, any built-in or custom LPE can be split into multiple AOVs to output a subset of lights with a specific AOV group assigned in the
light.aov parameter. For this, a postfix must be added to the LPE AOV name in
Light Group Example
In this example, a sphere is lit by three lights, a blue, a red and a green light. The blue and red lights have different AOV light groups defined while the green light does not belong to any group.
default" is the beauty AOV that is lit by lights, not in any AOV light group. "
RGBA_default" + "
RGBA_red" + "
RGBA_blue" give the total RGBA beauty pass.
A maximum of 16 different light AOVs are supported, although a given AOV can contain a bundle of any number of lights.
Light tagged with an AOV name (eg red_light). AOV named "RGBA_" + tag name = "RBGA_red_light".