Nodes/ComfyUI LC123 Nodes/LC Directional Blur
ComfyUI Node

LC Directional Blur

Smear the frame along one vector, and why 'strength' is the knob you want

By lonecatone23·Created 2 months ago·Updated about 7 hours ago· 22
LC Directional Blur
  • image
  • image
angle0.0
distance0.0
strength1.00
taps64
edgemirror

Motion blur is a big part of why AI output looks fake. Real cameras blur when things move; renders don't. A December 2025 thread on why AI video reads as generated listed motion blur first, ahead of grain and colour, and the recipe people converged on was pure post - "motion blur + camera shake + grain + red channel aberration + vignetting". You can't ask a still sampler for that. You apply it after.

ComfyUI's coverage here is patchy enough that the same thread ends with someone asking whether any node could do motion blur - they'd gone to After Effects instead. LC Directional Blur is one: every pixel smears along a single angle/length vector, with an on-node preview and a wipe so you can see what moved.

It's also a straight rebuild of WAS Node Suite's Image Directional Blur, down to the taps and edge options - worth noting, since WAS-NS has been dormant since 2023 and is still where most of these operations live.

How it works

The clever bit is that it does not average dozens of shifted copies of the image. Instead it builds a small convolution kernel made of taps point-samples spaced evenly along the line you asked for, bilinear-splatted so a fractional sample doesn't snap to a whole pixel, normalised to sum to 1 - then convolves the image with that kernel once, via NumPy's FFT.

Averaging N shifted copies and convolving with a kernel of N impulses along the same path are the same operation - this just does it in one FFT instead of N image reads. A 1024×1024 image with a 60px kernel is well under half a second, and the pack stays dependency-free: no SciPy, no OpenCV.

edge is literally np.pad's mode underneath - "hold the edge" is edge, "mirror" is reflect, "empty" is constant - so "empty" naturally darkens the border as more of the kernel's support runs off the frame.

Inputs and outputs

Required: image. Then the five that matter:

  • angle - degrees in screen convention, 0 = right, 90 = down. Or drag the arrow drawn on the node's face: direction sets the angle, drag length sets distance. Double-click either readout to type an exact value.
  • distance - how long the smear is, in pixels, up to 500. 0 is a no-op (so is a length under 1px).
  • strength - the blend back toward the original. Use this one. The tooltip says it plainly: the blur is a hard, full-strength smear over its length, which is what makes it read as motion rather than as softness. At 0.4–0.6 you keep the frame readable; at 1.0 a 40px smear is a full streak. Turning distance down instead gives you a smaller, sharper-edged ghost, not a subtler one.
  • taps - 2 to 128 samples along the path. This is not just a quality knob. At 2–8 you get a stepped multi-exposure ghost, the classic strobe look, and that's a genuinely useful effect. At 64+ it's a smooth continuous streak.
  • edge - what the blur reads past the border. "mirror" is the default and matches the old behaviour, so old workflows load unchanged.

Output: image. Straight into a save node, an image label, or the next FX node. It's an output node, so it always runs - good for iterating, bad for leaving in a graph you queue at 3am.

Install

Manager → ComfyUI LC123 Nodes, or:

cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC123_nodes.git

Restart. No requirements.txt, no pip step. Hard-refresh your browser after a pack update, since the wipe preview is JS.

Common issues

"It's too strong and there's no gentle mode." There is - it's strength, not distance. Dropping distance shrinks the smear's footprint; dropping strength fades the whole thing back into the sharp original. For a subtle sense of movement, 0.3–0.5 strength at a decent distance beats 1.0 strength at a tiny one.

Border goes dark. You're on edge: empty and the kernel is sampling black past the frame. Switch to "hold the edge" or "mirror". Conversely, if you want a vignette-ish falloff at the frame edge, empty gives it to you for free.

Blur angle looks backwards. It doesn't know which way your subject is moving. Run it along the axis of motion and check the wipe - half the time the answer is 180° from your first guess.

"Can it blur only the background?" No - it's full-frame, and that's a real limitation. Mask it back over the original, or accept the whole-frame smear. It's also directional only: no radial or zoom blur. Distance-based defocus is a depth-of-field pass, not this node.

CategoryLC123/image

Inputs (6)

NameTypeDefaultDescription
imageIMAGE
angleFLOAT0.00–360Blur direction in degrees, screen convention: 0 = right, 90 = down.
distanceFLOAT0.00–500Blur length in pixels. 0 = no blur.
strengthFLOAT1.000–1Blend toward the blurred result. The blur itself is a hard, full-strength smear over its length -- turn this down rather than the distance if it's too much.
tapsINT642–128How many samples are averaged along the path (WAS Node Suite's `taps`). Low (2-8) reads as a visibly stepped multi-exposure ghost instead of a smooth streak -- an effect in its own right, not just a quality knob. High (64+) is smooth even on a long distance.
edgeCOMBOmirrorWhat the blur reads past the image border. 'hold the edge' repeats the border pixel outward. 'mirror' folds the image back on itself (this node's original, only behavior). 'empty' reads black past the edge, which darkens the border as the smear runs off it.

Outputs (1)

NameTypeDescription
imageIMAGE