Nodes/radiance/◎ Radiance Rolling Shutter
ComfyUI Node

◎ Radiance Rolling Shutter

Add the skew, wobble, and flash bands that make a still read as phone footage

By fxtdstudios·Created 7 months ago·Updated 9 days ago· 242
◎ Radiance Rolling Shutter
  • image
  • IMAGE
skew_amount0
shutter_directionVertical
wobble_frequency0.0
wobble_amplitude0.0
flash_band_position-1.00
flash_band_width0.10
use_gputrue

Rolling shutter is a camera artifact: most CMOS sensors read the frame line-by-line instead of all at once, so a fast-moving subject or a vibrating camera gets that leaning, jelly, half-flashed look. It's usually something you remove. But sometimes you want it - when you're making a generated image or frame read as phone footage, security-cam capture, or amateur video, a little rolling shutter is the cheapest authenticity you can buy. ◎ Radiance Rolling Shutter adds it deliberately.

This sits squarely in the KB's post-processing lane: the operations that make AI output read as "captured" rather than "generated" - the same family as grain and motion blur. A skew of a few pixels is often all it takes to kill the too-perfect AI look.

How it works

The node rebuilds the image on a coordinate grid. For a Vertical shutter (the default), each row of the image is shifted horizontally by an amount proportional to its vertical position - that's the "skew" that makes vertical lines lean. A positive skew_amount leans one way, negative the other. Add wobble and it modulates that row offset with a sine wave (sin(y * wobble_frequency * 2π)), which produces the jelly/rolling effect of a vibrating camera - the frequency controls how many waves cross the frame, the amplitude how strong they are.

Flash banding is the partial-exposure stripe: a horizontal band brighter than the rest, positioned by flash_band_position (−1 to 1, from top to bottom edge; the default −1 disables it) and sized by flash_band_width. It's the classic "the bottom half of the frame is fine, the top is blown out" look you get from strobes or lightning with a rolling shutter. Everything runs as vectorized tensor math on the GPU (use_gpu on by default), and if all your effect amounts are essentially zero the node just returns the input untouched.

The inputs that matter

  • skew_amount (−50 to 50, default 0) - the core effect. A value of 5–15 is subtle-to-obvious lean; you rarely need more.
  • shutter_direction - Horizontal, Vertical, or Both. Vertical is the common CMOS readout; Horizontal reads columns instead.
  • wobble_frequency / wobble_amplitude - the jelly effect. Start with both around 1–3 for a handheld shake.
  • flash_band_position / flash_band_width - the exposure stripe. position of 0 is mid-frame; negative is upper half.

One output, IMAGE - same dimensions, batch preserved.

How to install it

Part of the radiance pack. ComfyUI Manager → search "Radiance", or:

cd ComfyUI/custom_nodes
git clone https://github.com/fxtdstudios/radiance.git
cd radiance
pip install -r requirements_windows.txt

Restart, and it's under FXTD Studios/Radiance/Filter.

Common issues

The honest caveat: rolling shutter is a motion artifact, and this node fakes it on a single still. On a genuinely static image it reads as a stylized distortion rather than camera capture, so it works best on frames that already have strong verticals (buildings, doorframes) or as a per-frame pass before you composite motion. Second: this is a distortion, so pushing skew_amount into the 30s+ range bends geometry noticeably - if your goal is "barely-there authenticity," single digits are your friend. And because it warps a flat image, it can soften fine detail on the skewed edges; run it early in the post chain if you plan any sharpening or upscale after.

It's a niche tool, no argument. But the "phone footage" aesthetic has been keeping people honest for years, and this is a lot cheaper than shooting reference.

CategoryFXTD Studios/Radiance/Filter

Inputs (8)

NameTypeDefaultDescription
imageIMAGE
skew_amountFLOAT0-50–50
shutter_directionoptCOMBOVertical3 options: Horizontal, Vertical, Both
wobble_frequencyoptFLOAT0.00–20
wobble_amplitudeoptFLOAT0.00–20
flash_band_positionoptFLOAT-1.00-1–1
flash_band_widthoptFLOAT0.100.01–0.5
use_gpuoptBOOLEANtrue

Outputs (1)

NameTypeDescription
IMAGEIMAGE