🎞 S42 CutFlow Film Grain
The Cheapest Way to Kill the 'AI Look'
- clip
- clip
- frame_count
- info
AI video has a telltale "too clean" quality: perfectly smooth gradients, zero noise, like the footage was rendered in a lab. Real cameras have grain. Film has grain. And the community consensus - backed by a whole thread on why AI video looks fake - is that a subtle grain pass is one of the single cheapest moves for making generated footage read as captured rather than generated. S42CF_FilmGrain is the S42 CutFlow node that does exactly that, procedurally, on every frame.
What it does
It overlays noise onto your clip. That's it - a deterministic pixel operation, no model, no VRAM. But the details matter:
intensity- 0.05 is subtle, 0.15 is standard film, 0.5 is heavy ISO noise. For the "make it feel organic" job you want 0.05–0.15. Heavy grain is a look; subtle grain is a fix.grain_size- 1.0 is fine grain, 2–4 gets coarser and more visible. Fine grain reads as film; coarse grain reads as a stylistic choice.color_mode-mono(default) is luminance-only grain, the classic film look.coloradds per-channel noise that reads more like digital sensor noise.animated- this is the one that bites people. Set toyes(the default), each frame gets a unique grain pattern, which is what makes video grain look natural. Set it tonoand you get the same static grain stamped on every frame - in motion that looks like a dirty overlay, instantly. If your grain looks "stuck," this is the culprit. Leave it onyesfor video.seed- the random seed. Because it's seeded, your grain pattern is reproducible, which matters if you're batch-processing a project and want every clip to share the same texture character.
Where it sits in a workflow
Grain is a finishing move. It goes near the end of your chain - after color grade, after sharpening - so the noise you add doesn't get amplified by later processing. A typical S42 CutFlow finishing stack: FrameBlend (kill jitter) → ColorAdjust (grade) → FilmGrain (add texture) → export. And since this pack's whole thesis is that you should be able to finish video inside the node graph instead of exporting to After Effects, this is one of the nodes that earns its keep.
It outputs clip plus frame_count and info like every CutFlow clip node. Same IMAGE-batch I/O as everything else, so it slots between a VHS loader and a video saver with no format gymnastics.
Install
Part of the one-pack S42 CutFlow install. ComfyUI Manager → search "S42 CutFlow" → Install → restart. Or:
cd ComfyUI/custom_nodes/
git clone https://github.com/GeekyGhost/S42-CutFlow.git
pip install -r S42-CutFlow/requirements.txt
Restart fully; the console should show [S42 CutFlow] Loaded 53 total nodes. Film Grain needs only numpy/PIL - the only pack-level dependency worth mentioning is OpenCV (opencv-python-headless in the requirements, spelled opencv-python in the README; either clears the "No module named 'cv2'" error). No models to download, no GPU footprint, runs on CPU in milliseconds per frame.
A word to the wise on this pack generally: Geeky Ghost describes S42 CutFlow as a work in progress being refined for LTX Desktop, and the node count (53) includes a lot of expanded experimental stuff. The core filter nodes like this one are the stable, trustworthy part.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | IMAGE | Video clip to add grain to. | |
| intensity | FLOAT | 0.150–1 | Grain intensity. 0.05 = subtle, 0.15 = standard film, 0.5 = heavy ISO noise. |
| grain_size | FLOAT | 1.00.5–4 | Grain particle size. 1.0 = fine grain. 2-4 = coarser, more visible grain. |
| color_mode | COMBO | mono | 'mono' = luminance-only grain (classic film). 'color' = per-channel noise (digital/chromatic). |
| animated | COMBO | yes | 'yes' = unique grain pattern per frame (natural). 'no' = static grain (same every frame). |
| seed | INT | 420–999999 | Random seed for reproducible grain patterns. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| clip | IMAGE | — |
| frame_count | INT | — |
| info | STRING | — |