AOVs and light groups
Moray's AOVs follow production-renderer conventions (Arnold, V-Ray): ready-made lighting splits, light path expressions (LPEs), shader AOVs and light groups. They are set per view layer and written by the renderer straight to EXR. Moray uses MoonRay's AOVs only: Blender's built-in View Layer > Passes checkboxes (Data, Light, Cryptomatte, Shader AOV) are neither shown nor read for Moray, and ticking them in a file made for Cycles adds nothing. Combined is always written.
The AOV browser
View Layer Properties > Passes > AOVs (Render Properties > AOVs has a shortcut):
-
Available / Active lists: pick a row and Add >>, << Remove, Clear.
-
Add Preset:
- Production: lighting splits, albedo, Depth / Position / Normal / Vector / UV and Cryptomatte;
- Lighting: diffuse / specular / transmission direct and indirect, SSS, volume direct and indirect, emission;
- Data: Depth, Position (world and camera), Normal, Ng, UV, Vector and Cryptomatte.
A preset only adds rows that are missing.
-
Add Shader AOV: a material property, for example
albedo,DSS.normalorD.albedo. -
Add Custom AOV: a light path expression, for example
C<RD>L(direct diffuse) orC.*<L.'key'>(everything lit by light groupkey). An expression MoonRay would reject is flagged in red as Not rendered while you type.
Ready-made rows
| Family | Rows |
|---|---|
| Beauty | Combined, Alpha, Depth |
| Lighting | Direct, Indirect, Diffuse, Specular, Transmission, Sss, Volume, DiffuseDirect, DiffuseIndirect, SpecularDirect, SpecularIndirect, TransmissionDirect, TransmissionIndirect, SssDirect, SssIndirect, VolumeDirect, VolumeIndirect, Emission |
| Albedo | Albedo, DiffuseAlbedo, SpecularAlbedo, TransmissionAlbedo, SssAlbedo, DenoiseAlbedo |
| Data | Normal, Ng, Position (world), PositionCamera, Pref (object-space rest position), UV, Vector, DPds, AO, ObjectIndex, MaterialIndex |
| Visibility | Shadow, ShadowDirect |
| Cryptomatte | CryptoObject, CryptoMaterial, CryptoAsset (paid licence) |
| Diagnostic | HeatMap, Weight, Wireframe |
The lighting rows add up to the beauty: Direct + Indirect + Emission, and Diffuse + Specular + Transmission + Sss + Volume + Emission. The world is a light, so it is in these sums and in its light group; there is no separate Background AOV.
- AO traces its own occlusion rays (1 = unoccluded); its settings are in Render Properties > AOVs > Ambient Occlusion. It costs nothing unless the row is active.
- ObjectIndex / MaterialIndex read Blender's Pass Index and are never filtered between two IDs. Pref uses the mesh's Rest Position attribute when it has one, so it stays put under deformation.
- Depth and the index rows are 0 where nothing was hit.
- Cryptomatte: toggle Object / Material / Asset and set Levels in Render Properties > Cryptomatte & Deep EXR.
Coming from Cycles
Cycles' passes and their Moray rows (Arnold-style splits):
| Cycles pass | Moray rows |
|---|---|
| Diffuse Direct / Indirect | DiffuseDirect / DiffuseIndirect, plus SssDirect / SssIndirect (Cycles counts subsurface as diffuse) and the translucent share of TransmissionDirect / TransmissionIndirect |
| Glossy Direct / Indirect / Color | SpecularDirect / SpecularIndirect / SpecularAlbedo |
| Transmission Direct / Indirect / Color | TransmissionDirect / TransmissionIndirect / TransmissionAlbedo |
| Volume Direct / Indirect | VolumeDirect / VolumeIndirect |
| Emission, Diffuse Color | Emission, DiffuseAlbedo |
| Z, Normal, Vector, UV, Position, Object / Material Index, AO | Depth, Normal, Vector, UV, Position, ObjectIndex / MaterialIndex, AO |
| Cryptomatte Object / Material / Asset | CryptoObject / CryptoMaterial / CryptoAsset |
Files saved with the older Cycles-style DiffDir / DiffInd rows load with them replaced by DiffuseDirect + SssDirect and DiffuseIndirect + SssIndirect (same denoise and light-group settings); the console says so once per view layer.
Light groups
- Create groups in View Layer Properties > Passes > Light Groups (Blender's own list).
- Assign lights (Blender and Moray lights alike), emissive objects and collection instances to a
group in Object Properties > Shading > Light Group. Lights inside a collection instance
take the instancer's group. The World's group is in World Properties > Moray Light > Light
Group. These are Blender's own light-group properties (
Object.lightgroup,World.lightgroup,ViewLayer.lightgroups), the ones Cycles uses, so a scene set up for Cycles keeps its groups and Moray has no light-group setting of its own. Moray draws these panels itself, so they work with the Cycles add-on disabled. - On a lighting row in the Active list, set Light Groups to All or Selective (tick the
groups). Each group adds
<AOV>_<group>, for exampleDiffuseDirect_key. The Beauty row gives oneBeauty_<group>per group; Combined always has every light.
Light groups and LPEs run on the GPU as well as the CPU, with any number of AOVs and groups.
Denoising AOVs
Render Properties > Performance > Denoise Light AOVs denoises lighting rows with OpenImageDenoise; each row has its own denoise toggle in the Active list. Data, Cryptomatte and deep outputs are never denoised.
EXR files
The renderer writes every active row when the frame finishes (Render Properties > Cryptomatte & Deep EXR > EXR):
- Multi-Layer: one EXR per frame, one layer per AOV (
DiffuseDirect.R, ...). With Data in Own File (default on) data and Cryptomatte go to a separate_dataEXR: 32-bit float, lossless. The beauty file is half float with one alpha. - Per AOV: one EXR per AOV per frame (
<file>_<AOV>.####.exr). - Compression: ZIP by default. DWAA / DWAB only ever apply to the beauty and light AOVs.
- Depth Precision: Float (default) or Half.
- Metadata: camera matrices, frame, render settings, each layer's AOV or LPE definition, and the Cryptomatte manifest.
- Compositor AOV Nodes (off by default) also keeps a Blender compositor tree in sync, for people who comp in Blender. The files are written by the renderer either way.
- Deep EXR (paid licence): Write at F12 writes an OpenEXR 2.0 deep file for Nuke DeepRead.
Every file is raw scene-linear; no view transform is baked in.
GPU notes
No AOV sends a GPU (XPU) frame to the CPU. Where an AOV needs CPU work (Cryptomatte and deep data are gathered on the CPU, for example), it is done per hit while the rest of the path stays on the GPU. Anything that ran on the CPU is printed to the console as "Moray render engine: ...".