Home · Lab · CG Multipass & Relighting

CG6 Vector blur

Motion-blur the CG from its motion vectors, matched to the plate’s shutter

CG Multipass & Relighting · ~7 min · Free

1 The idea

Motion vectors store how far each pixel moves on screen in one frame. Vector blur smears each pixel along its vector, and the shutter decides how much of that move the streak covers: a 180° shutter is half a frame. The running robot’s body moves about 13 px per frame and its hands and feet up to 18 px, so at 180° the streaks are about 6–9 px long.

Raise the shutter from 0, switch between “after the merge (whole image)” and “on the CG layer, then merge”, and watch the error against Blender’s 3D blur. Then look at the hands and feet in the “difference ×4” view: they move on arcs, and a straight streak can’t follow them.

streak = vector (px/frame) × shutter (frames)

2 Hands-on

Task: match Blender’s 3D motion blur (180° shutter) with vector blur, bringing the error below the goal in the panel.

The shutter slider is in fractions of a frame and starts at 0. Also check where in the tree the blur happens: watch the robot’s edges in the “difference ×4” view.

SkyVFX Lab · CG6interactive · 1001

3 Deep dive

What a motion vector holds

Each pixel stores its screen motion in pixels, direction and length together: R is horizontal, G is vertical. Renderers differ in scale and sign, so check against a move you already know first, such as the body of the running robot.

Blender’s Vector pass holds two 2D vectors in pixels: the move from the previous frame to this one, and the move from this one to the next. Both point the way the pixel travels, and Cycles writes it only with motion blur off. Vectors are data, not a picture: read them raw, never through a colour transform.

ChannelWhat it holds
RHorizontal motion (px); positive = right
GVertical motion (px); positive = up in Nuke’s y-up
Blender Vector passTwo vectors: toward the previous and the next frame

The shutter sets the streak length

A streak is as long as the pixel travels while the shutter is open: vector × fraction of a frame. Here the body moves about 13 px per frame and the swinging hands and feet up to 18 px; at 180° the streak covers about half of that (about 6–9 px), centred on the frame like the reference render.

At shutter 0 there’s no blur, so the error starts at its highest. The uniform blur type gives the hard-edged streak of a real shutter.

ShutterFraction of a frameAt 24 fps
0°0 (no blur)0 s
180°0.51/48 s
360°11/24 s

Blur the CG layer before the merge

Blur after the merge and the plate’s still pixels at the robot’s edges get dragged by the robot’s vectors: sand, rocks and hills smear along with it. Here, blurring after the merge at a 0.5 shutter stays above the goal, while blurring the CG layer reaches it.

Blur the premultiplied CG together with its alpha, then Merge it over the plate: the blurred edge turns see-through and shows the sharp plate behind it.

  1. 1CG + vectors
  2. 2VectorBlur2 on the CG
  3. 3Merge over plate
  4. 4Difference vs reference

Straight streaks miss arcs

Vector blur drags each pixel in a straight line along that frame’s vector. Swinging hands and feet travel on arcs, so real 3D blur curves while vector blur stays straight. Fast-spinning parts such as blades fail the same way.

More samples make a streak smoother but never bend it. For parts on clear arcs, use 3D motion blur in the render, or several sub-steps, each following the motion of its own part of the shutter, averaged together.

If the hands still look wrong at the right shutter, the problem is the arc, not the amount.

4 In real work

In Nuke

  1. Read the EXR raw, then use Shuffle2 (or Copy if the vectors come from a separate render) to put the vectors in the layer VectorBlur2 reads.
  2. Sample a pixel with a known move, such as the body, to check sign and scale first.
  3. VectorBlur2 on the premultiplied CG: uv = the vector layer, scale matched to the plate’s shutter, shutter centred on the frame, blur_type = uniform.
  4. Merge2 (over) onto the plate after the blur.
  5. Merge2 (difference) against a reference frame with real 3D blur, and adjust the scale until it matches.
  6. For camera-only motion use MotionBlur3D; for a 2D transform use MotionBlur2D → VectorBlur2. Send arcing parts back to 3D blur in the render.

Common mistakes → the fix

  • ✗ Vector blur after the merge, over the whole frame✓ Blur the CG layer first, then merge it over the plate.
  • ✗ A shutter that doesn’t match the plate (360° or 0)✓ Use the plate’s shutter: 180° = 0.5 frame, centred.
  • ✗ Trusting the vector sign and scale without checking✓ Sample a known move and correct the sign or scale for that renderer.
  • ✗ Using vector blur on spinning or arcing motion✓ Use 3D motion blur, or average several sub-steps.
  • ✗ Reading the vector layer through a colour transform✓ Read it raw and never grade the vectors.

Before you send the shot

  • The vector blur shutter matches the plate and is centred.
  • The blur sits on the CG layer before the merge; no plate smears at the edges.
  • Vector sign and scale are checked against a known move.
  • Compared with a 3D-blurred reference frame, the difference is close to 0.
  • Hands, feet and spinning parts checked one by one: no unnatural straight streaks.

5 Check yourself

One question to check yourself

The plate was shot with a 180° shutter. What shutter do you set on the vector blur, in frames?

What you learned

🔒 Answer the question above and this card opens

More questions

1. You vector-blur after the merge and sand and rocks smear at the robot’s edges. Why?

2. The shutter is right, but the swinging hand still differs from Blender’s 3D blur. What’s the fix?

Where the numbers come from: Every picture is a Blender 5.2 Cycles render of our own desert and robot (tools/assets/passes_cg.py), computed in your browser. The robot runs (Mixamo “Running” clip, used in renders only) across the frame 7 m from the camera. The frame with motion blur off plus its Vector pass is compared with the same frame using Cycles 3D motion blur at 180° (shutter 0.5, centred) as the reference. Our vector blur is a teaching scatter along the average of Blender’s two vectors, not Nuke’s VectorBlur2.