# The Render Passes I Actually Use

There is a version of this article with eighteen AOVs in it. Diffuse direct, diffuse indirect, reflection, refraction, SSS, emission, normals, position, motion vectors, the whole Nuke-shaped buffet. I've rendered that list. I've also spent the following morning managing forty gigabytes of sequences to make a change I could have made in the shader in four minutes.

Here's the short list I actually render, and why it's short.

## Fewer passes, on purpose

Passes are not about control. They're about revision-proofing.

The question I ask before enabling an AOV isn't "could this be useful?" Everything could be useful. It's "when the note comes in, would I rather fix this in comp or re-render?" If the honest answer is re-render, the pass is dead weight. Splitting diffuse and reflection sounds powerful until you realize any change worth making to reflection is a material change, and you're going back to Cinema 4D regardless.

What passes cost is easy to underestimate:

- **Disk.** Every pass is bytes on every frame, times a 600-frame shot, times every version you render.
- **Render time and VRAM.** Octane's AOVs mostly ride along cheaply, but Cryptomatte in particular is a memory tax on the GPU.
- **Comp complexity.** Every pass is a layer, a blend mode, and a thing that can go out of sync. In a comp with fourteen additive layers, nobody (including you in three weeks) knows which one is wrong.

<Callout type="warning" label="The retime trap:">
Structural changes scale with pass count. Retiming a six-pass stack means retiming six things identically, and precomps that were fine last week start drifting.
</Callout>

{/* RYAN: GB comparison, beauty+post vs full stack on a typical shot */}

## The passes

### Beauty (main)

The whole render, lit and shaded, in linear float. This is 90% of the frame and on most jobs it's 100% of what ships. Everything else exists to modify it.

### Post

Octane's post-processing pass: the bloom and glare contribution, isolated. This is the pass I'd defend hardest, because glow is the single most-noted look element in the pipeline. "Can it be a little hotter?" is a comp slider when the post pass is separate and a re-render when it isn't.

With the post pass enabled, beauty renders clean (no glow baked in), so in After Effects the post layer sits directly above it on **Add**, and its opacity becomes the glow dial. Because you're in 32-bit linear, the values above 1.0 are still there, so pushing it doesn't clip to white. It blooms.

{/* IMAGE: Octane AOV panel screenshot */}

### Cryptomatte

Per-pixel object and material IDs with coverage data, which means anti-aliased edges and mattes that survive motion blur, depth of field and transparency. It replaced the old object-buffer workflow entirely.

In Octane's AOVs you pick the crypto type. Material Node, Material Node Name, Object Node and Instance are the ones that produce useful output. Object Node covers most of what I need; material-level goes on when the client will relitigate colours per shader.

In After Effects, apply the **Cryptomatte** effect (part of the fnord EXR plugins that ship with AE) to the EXR layer and eyedropper the object in the frame. You get a named selection you can invert, add to, and feed to Set Matte.

One hard requirement: **your project must be 32 bpc.** In 8 or 16-bit the ID channels are meaningless and you'll get nothing back.

The other thing you'll read everywhere is that Cryptomatte must never be compressed lossily, because IDs are hashes and lossy compression averages them into nonsense. I compress mine with DWAA anyway, along with everything else. More on that below.

### Light passes

One pass per Light ID, set on the Octane Light tag, with emissives given their own IDs. Each pass is that light's contribution in isolation. Stack them on Add and you get beauty back; adjust one with Curves first and you've relit the shot without opening Cinema 4D.

I reach for these on product and logo work, where "warmer on the rim light" arrives roughly always. On a scene with nine lights I don't bother. That's nine more layers to babysit, and I'd rather re-render.

### Z-depth

Depth from camera, as data, not as a picture. Two things to get right:

**Unnormalized beats normalized.** Octane's max depth setting clamps and normalizes the range into 0–1, which is convenient and lossy: you lose real-world distance, and if the camera moves the mapping shifts under you. In 32-bit float you can carry actual scene distance and remap it in comp on purpose. If you do normalize, set the max to your real scene depth instead of the default.

**It is not anti-aliased.** By design: averaging two depths at an edge gives you a value that describes nothing. Expect harsh edges and don't try to fix them.

I use it for atmosphere far more than depth of field: a fog card matted by depth, or a falloff via Curves. Real DOF I do in-render, because AE's depth blur won't invent the bokeh the camera would have.

### Opacity and masks

Straight alpha and object buffers, on only for a specific compositing need: a hold-out against a plate, a hand-off to someone whose machine chokes on Cryptomatte, a shape I'll need isolated a dozen times. Targeted, not default.

### The fast path: beauty + post

Most days, this is it. Two layers, 32-bit EXR, Add on the post layer, grade on top. It composites in about ninety seconds, it renders faster, it fits on a drive, and nothing in it can go out of sync.

If the timeline is genuinely tight, adding passes isn't preparation. It's a second job you're volunteering for while already behind.

## Format: one multilayer EXR, 32-bit, DWAA

**32-bit linear.** Float values above 1.0 survive, so highlights and glow have headroom to be graded rather than clipped. Linear means the adds and multiplies in comp behave the way light behaves, which is the entire reason the beauty-plus-post stack works.

**One multilayer file, DWAA on all of it.** Everything I render goes into a single multilayer EXR (beauty, post, Cryptomatte, Z-depth, whatever else is on), compressed with DWAA. One file per frame, one sequence to import, one thing to move to the drive.

I know this is not the textbook answer. DWAA is lossy DCT compression, and the standard advice is to keep data passes lossless: Cryptomatte IDs are hashes that mean nothing once neighbouring values get averaged, and Z-depth is a measurement, not a picture. The theoretical risk is real. In practice I haven't hit it. My mattes pick cleanly, my depth blurs where it should, and the file footprint stays somewhere I can actually manage across versions and backups. It's a tradeoff, and it hasn't bitten me yet.

<Callout type="warning" label="When I'd switch:">
Two situations. If mattes visibly break (crunchy or unreliable edges on a Cryptomatte pick), the compression is the first thing I'd change. And on any hand-off to a Nuke pipeline, where someone downstream is going to lean on that data far harder than I do, I'd split the data passes out and render them **ZIP** or **PIZ** (both lossless) and leave DWAA on beauty and post.
</Callout>

{/* RYAN: your DWAA compression level */}

The cost on the AE side is importing the sequence once per pass and setting which layer each copy reads, via Interpret Footage or EXtractoR. A minute of setup, against a folder that stays sane for the life of the job.

The alternative is separate sequences per pass. It's defensible (compression per pass, and a bad pass re-renders on its own), but it's also a folder of sequences per version, which is the sprawl I'm avoiding.

<Callout type="tip" label="Colour management:">
Set the project to 32 bpc and set your working colour space deliberately in Project Settings → Color. After Effects has had OpenColorIO and ACES support since version 23.2, so if the rest of the pipeline is ACEScg you can match it natively. Consistency is what matters: EXRs arrive linear, and if AE decides they're sRGB you'll spend an hour chasing a wash that isn't in the render.
</Callout>

**The PNG escape hatch.** When something has to be out the door in twenty minutes, PNG sequences are fine. What you give up: 8 or 16-bit integer instead of float, no values above 1.0, no linear working space, no Cryptomatte, no usable depth. Bloom clips instead of blooming and grading gets fragile. Use it when the render goes straight into a comp nobody is grading.

## The sidecar (.aec)

Always export it. Every time, even on the two-pass fast path.

The sidecar carries the scene's 3D data: the render camera with its animation and focal length, lights, and a null or solid for every External Compositing tag in the scene. Drop it into AE and your comp has a camera that matches the render exactly.

**In Cinema 4D:**

<CodeBlock
  language="Cinema 4D"
  code={`Render Settings → Save → Compositing Project File
  Save                 on
  Target Application   After Effects
  Include 3D Data      on

Right-click object → Cinema 4D Tags → External Compositing
  (each tagged object becomes a null/solid in AE)`}
/>

On a single-machine render the .aec is written automatically alongside your frames. Otherwise, hit **Save Project File** to write it without rendering. Keep it in the same folder as the sequence.

**In After Effects:** File → Import → File, select the .aec. The Maxon importer builds a comp with the 3D camera, lights and nulls already in place.

Gotchas that cost an afternoon:

- **Comp settings must match.** Resolution and frame rate need to equal your render settings, or the camera animation lands at the wrong scale and speed.
- **The .aec does not bring your footage.** It brings data. You import the sequence yourself.
- **External Compositing solids come in at odd sizes.** Tag scale doesn't always translate. Trust the null's position and set the layer size manually.
- **Coordinate handedness.** C4D and AE disagree about which way Z points. The importer handles it; anything you rebuild by hand will not.

**Why not Cineware?** It live-links the .c4d and renders through the AE-side engine: no Octane, slow previews, and re-rendering work you already paid the GPU for. For a baked render you want the scene *data*, not a second renderer.

The payoff is what makes 3D comps feel expensive: 2D elements living in 3D space. Text sitting on a surface, a glint parented to the actual light, particles in the scene's real coordinates. All of it tracks for free, because it's the same camera.

## My default checklist

<Collapsible title="The setup I use on almost every job" defaultOpen={true}>
**In Cinema 4D / Octane**

1. Main/beauty pass on.
2. Post-processing pass on, always, even in a hurry.
3. Cryptomatte on (Object Node; add Material Node if shader changes are likely).
4. Light passes only if relighting notes are probable, Light IDs set on the Octane Light tags.
5. Z-depth only if fog or post DOF is planned. Unnormalized, or max depth set to real scene depth.
6. Opacity/mask passes only for a specific compositing need.
7. Output: one multilayer 32-bit EXR, DWAA on everything. Split the data passes to ZIP or PIZ only if mattes break or it's going to Nuke.
8. Render Settings → Save → Compositing Project File: Save on, Target Application After Effects, Include 3D Data on.
9. External Compositing tags on anything I'll attach 2D elements to; .aec saved beside the frames.

**In After Effects**

1. Project at 32 bpc, working colour space set deliberately.
2. Import the .aec first, then the EXR sequence; confirm it reads as linear.
3. Beauty at the base, post above it on Add, opacity as the glow dial.
4. Cryptomatte effect on the crypto layer, selections picked by name.
5. Light passes on Add if used, one adjustment layer each.
6. Grade on top of the whole stack, never on individual passes.
</Collapsible>

{/* IMAGE: AE layer stack screenshot */}

Render the two passes that always earn their keep, add a third only when a specific note is foreseeable, and always ship the camera with the frames. Everything else is a decision you can make later, once you know whether you need it.

---
Source: https://ryanjohnson.io/blog/render-passes-i-actually-use
