Nodes/CRT-Nodes/Film Grain FX (CRT)
ComfyUI Node

Film Grain FX (CRT)

Give your renders the filmic texture they're missing

By PGCRT·Created 2 years ago·Updated a day ago· 132
Film Grain FX (CRT)
  • image
  • IMAGE
grain_amount0.33
grain_size1.5
grain_intensity0.65
grain_density10.0
grain_color1.00
intensity_shadows1.00
intensity_highlights1.00
negative_noise_in_highlightsfalse
preserve_original_colortrue
seed0

AI video has a tell: it's too clean. The perfect flat gradients, the sterile edges, the total absence of noise. Real footage has grain, and grain isn't just texture - it's what hides banding in skies, masks compression in shadows, and makes a render feel like it was shot rather than generated. FilmGrainFX is the node that adds it back, procedurally, on top of an image or a whole video batch.

This is a "last step in the chain" node. You finish your grade, you drop FilmGrainFX on the output, and suddenly the clip looks like it came from a camera instead of a latent. It's the kind of polish that separates a demo from a deliverable.

How it works

It generates noise and blends it over the image, with more control than most grain nodes give you:

  • grain_amount - overall volume of the effect (0–1, default 0.33).
  • grain_size - the scale of the grain specks, 0.5–8. Small is fine digital grain, large approaches 35mm chunky.
  • grain_intensity and grain_density - how strong each grain particle is, and how many of them there are. Amount vs. intensity vs. density is a real three-knob setup: crank density for texture, crank intensity for punch.
  • grain_color - how much chroma the grain carries (0 = monochrome, 1 = full color). Color grain reads more "film," monochrome reads more "cinema cleanup."
  • intensity_shadows and intensity_highlights - separate gain controls so you can keep grain subtle in the highlights (where it looks like sensor noise) and heavier in the shadows (where film grain actually lives).
  • negative_noise_in_highlights - flips the noise polarity in bright areas, which mimics how highlight grain behaves differently from shadow grain.
  • preserve_original_color (default on) - applies the grain without drifting the overall color cast.
  • seed - so the grain pattern is reproducible run-to-run, or change it to re-roll the texture.

It's all torch tensor math under the hood, batched over frames, so it handles a whole video sequence in one pass. The seed matters more than people expect - if you're comparing two grades and the grain keeps changing between them, pin the seed so the noise isn't part of what you're evaluating.

Inputs and outputs

Single image (IMAGE) in, single IMAGE out - the grain-applied result. Drop it between your final node and your saver, and it will be applied per frame.

Installing it

Standard CRT-Nodes: ComfyUI Manager → CRT-Nodes, or clone + pip install -r requirements.txt, restart. It's under CRT/FX.

Where people get burned

Overcooking is the failure mode. The defaults are actually reasonable (0.33 amount, 0.65 intensity) but people immediately crank everything and get a snowy mess. Film grain is a whisper - start at defaults, nudge grain_amount up by 0.1 at a time. And remember this is per-frame independent noise; at low fps or with strong compression downstream, unseeded grain can shimmer or moiré. If your exported clip looks restless, either reduce density or re-encode at a higher bitrate - the node did its job, the encoder is the one freaking out.

CategoryCRT/FX

Inputs (11)

NameTypeDefaultDescription
imageIMAGE
grain_amountFLOAT0.330–1
grain_sizeFLOAT1.50.5–8
grain_intensityFLOAT0.650–1
grain_densityFLOAT10.00–11
grain_colorFLOAT1.000–1
intensity_shadowsFLOAT1.000–1
intensity_highlightsFLOAT1.000–1
negative_noise_in_highlightsBOOLEANfalse
preserve_original_colorBOOLEANtrue
seedINT00–18446744073709550000

Outputs (1)

NameTypeDescription
IMAGEIMAGE