Examples

Examples walkthrough

A walkthrough of the ShotLink examples project — eight stations, each showing one thing the plugin does.

Following along needs two things: the plugins installed, and the examples project downloaded. The guide covers both.

Connect

#

Connect

The starting point for everything else. Drop a ShotLink layer into a comp, pick a camera in Source, and the frame is live — Unreal renders it on demand and hands it straight to After Effects.

Nothing is written to disk. There"s no export step, no image sequence to manage, no waiting for a render to finish before you can see whether the shot works. Move the AE camera and Unreal draws the new frame.

The connection survives Unreal restarting. If you close the editor, the layer shows [Not Found] and keeps looking — reopen the project and it picks up where it left off. You can leave a comp set up for weeks and come back to it.

Fly the camera

Framing a shot with the After Effects camera is awkward — you"re dragging position and orientation values in a panel rather than looking through the lens.

So do it the other way round. Switch the Unreal viewport to the ShotLink camera, fly around until the shot looks right, then hit Get. That position and orientation land on the AE camera as a keyframe.

Do it again from another angle further along the timeline and you have a move between the two. It"s a fast way to block out camera work: find the interesting angles in Unreal, let After Effects interpolate between them, then refine the curves as you would with any other keyframes.

Realtime

By default, Unreal renders a frame when After Effects asks for one. Turn on Realtime and it keeps sending — so changes you make in Unreal appear in your comp as you make them.

This is for the part of the work where you"re still deciding: moving a light and watching how it falls, swapping a material, nudging an object into frame. You see the result in context, composited with everything else in your timeline, instead of guessing how it"ll sit.

Turn it off before you preview or render. With Realtime on, After Effects can"t cache frames — every frame gets re-requested, and a RAM preview never completes.

Layers

A ShotLink layer is tied to one camera, but nothing stops you from having several. Point three layers at three cameras and all of them update together as you scrub.

In this comp, one camera renders the scene as it is — the beauty pass. The other two each carry a Post Process material: one outputs depth, one outputs normals. Same shot, same frame, three different kinds of information arriving at once.

The important part is the mechanism, not the specific passes. A pass is just a Post Process material sitting on a camera — so whatever you can build in the material editor, you can pull into After Effects. Object IDs, custom stencils, velocity, world position. Nothing about it is hardcoded on our side.

Post Process Materials in Unreal

Object Mask

Getting an After Effects layer to sit between things in a 3D scene is the classic compositing problem. Normally it means rendering with alpha, exporting, and re-importing — and redoing all of it when the shot changes.

Here a second camera renders one object on its own. Its Primitive Render Mode is set to Use Show Only List, with a single actor in that list, so everything else disappears. That layer sits at the top of the stack, hidden, and works as a matte for the AE text below it — the text gets cut by the cube and reads as though it"s behind it.

An isolated object is lit as if the rest of the scene weren"t there, so it won"t match the beauty pass. Use it as a matte, not as an image. When you need the mask to line up with correctly lit geometry, use Custom Depth instead: tick Render CustomDepth on the object, give it a Stencil Value, and output that through a Post Process material — one camera can then carry several mattes at once.

Creating masks with the Custom Stencil buffer

3D Null

You have a rendered frame in your comp and you want to attach something to a specific point in the scene. Not roughly — exactly, on the surface of that object, holding through the whole camera move.

Click the object in the image. ShotLink traces a ray from the camera through that pixel into the Unreal scene, finds what it hits, and creates a null at that point in After Effects. It picks up the object"s rotation too, so a layer parented to it sits flush with the surface rather than facing the camera.

Alt-drag the pick whip from your layer to the null rather than parenting normally — that way the layer keeps its own position and inherits only the movement. From there it"s an ordinary AE layer that happens to be locked to a point in a 3D scene.

Animation

Up to here the Unreal side has been static — you move the camera, the scene stays put. This station connects the two timelines.

Pick a Level Sequence in the plugin and the sequence follows your After Effects timeline. Scrub to frame 40 and you get frame 40 of the animation, rendered on the spot. Play back the comp and the animation plays with it. Nothing is rendered in Sequencer, and there"s no cached video to regenerate when something changes upstream.

Anything on a Sequencer track comes through — transforms, visibility, material parameters, skeletal animation. The exception is anything driven by world time rather than sequence time: a material that scrolls clouds across the sky, a panning texture, an oscillation wired to the Time node. Those run on their own clock. If you hit one, station 08 has the way around it.

Camera Bake

Everything so far has treated Unreal as a renderer for After Effects. This goes the other way: it takes the camera you"ve animated in AE and writes it into Unreal as a real camera.

Animate the ShotLink camera however you like — keyframes, expressions, a move you pulled in with Get and refined afterwards — then hit Bake. A CineCameraActor appears in the Level Sequence you picked, with position, rotation and lens keyed frame by frame.

From there the shot exists in Unreal on its own — close After Effects and it"s still there. It"s also the answer to the world-time problem from station 07: Movie Render Queue advances time itself, at a fixed step, so materials driven by the Time node land on the right frame.

Movie Render Queue

Quality

Making it look right

The picture comes from Unreal, so most of what affects it is Unreal's own settings. Here's what matters most.

All of it lives in Post Process settings, in one of two places: a Post Process Volume in the level, or the camera itself. Both offer the same options, but the camera is usually the better choice here — the settings travel with it rather than depending on where it sits in the level, and they come along when you bake the camera into a sequence.

Each value has a checkbox to its left. Without it ticked, the value is ignored.

Reflections

#

Reflections

Screen Space reflections are built from what"s already on screen. When the camera moves fast, or when frames are rendered out of order, that data doesn"t match the new view — the reflection stretches, slides, and breaks apart.

Lumen with Hardware Ray Tracing traces against actual geometry instead. Objects outside the frame still reflect, and the reflection holds together at any angle.

Use Lumen with Hardware Ray Tracing, and turn Screen Traces off. Post Process → Reflections → Method

Hardware Ray Tracing has to be enabled for the project first: Project Settings → Rendering → Hardware Ray Tracing, with Default RHI set to SM6. It needs an editor restart and a shader rebuild, so do it before you start rather than mid-shot.

Global Illumination

Without GI, light only comes from the sources that hit a surface directly. Shadows fall away to flat black, and objects sit on top of the scene rather than in it.

Lumen bounces light off surfaces and picks up their colour along the way. The blue panel tints the floor, the glowing spheres fill the room. It"s most of the difference between a render that looks assembled and one that looks lit.

Leave Lumen on unless you have a reason not to. Post Process → Global Illumination → Method

Exposure

Auto exposure adapts to the brightness of what"s in frame, and it does so gradually. Pan from a dark corner toward a bright one and the whole image drifts as it catches up.

That"s fine when you"re looking through the viewport. It isn"t when frames are rendered out of order — each one catches the adaptation at a different point, and the shot flickers.

Lock exposure to a fixed value before you render. Post Process → Exposure → Metering Mode → Manual, with the override boxes ticked.

Console variables

One frame, one result

The settings above are the ones with checkboxes. What's left is the part of the renderer built for realtime playback, where each frame borrows from the ones before it and small errors wash out before anyone notices.

Scrubbing breaks that assumption. Land on frame 40 from the left and from the right and you can get two different images, because the history behind them was different. These turn that off:

r.Lumen.Reflections.Temporal 0 r.Lumen.ScreenProbeGather.Temporal 0 r.SSR.Temporal 0 r.Shadow.Virtual.Cache 0

With accumulation off, Lumen has to resolve everything within a single frame. Give it more to work with:

r.Lumen.Reflections.Quality 4higher = better r.Lumen.Reflections.DownsampleFactor 1lower = better r.Lumen.ScreenProbeGather.DownsampleFactor 8lower = better

These two sets go together — the first makes frames consistent, the second keeps them clean. They cost render time.

One more thing, unrelated to accumulation: textures and geometry stream in on demand, so scrubbing onto a cold frame can capture it before everything has loaded.

r.Streaming.FullyLoadUsedTextures 1

Typed into the console, all of this lasts until you close the editor. To keep it, save it as a Console Variables asset and point ShotLink at it: Project Settings → Plugins → ShotLink → Console Variables. It applies before every frame, so you set it once per project.

#cvars