😺NKD Film Grain
Film grain that shimmers on video instead of sitting frozen on top
- image
- mask
- image
Grain is the cheapest realism hack in the book. Real cameras and film have noise; AI output doesn't, and a flat, clean, noiseless frame is a big part of why generated images read as generated. The community has been saying it for years - subtle grain is one of the top replies to "why does my AI video look fake?" - and this node is the ComfyUI-native version of that trick, modeled on the Lightroom / Camera Raw feel rather than a noise-on-top afterthought.
😺NKD Film Grain gives you Amount, Size and Roughness, which is exactly Lightroom's grain vocabulary: amount for how much shows through, size for coarse versus fine, roughness for how irregular the grain is (it blends a fine and a coarse field, like Lightroom does). It's monochrome by default; raise Color for dye-cloud color grain.
The setting that matters most: animate
This is what separates it from every "add noise" node. On a video batch, with animate on (the default), each frame gets fresh grain - so it shimmers like real emulsion instead of sitting frozen on top. Frozen grain on video is a dead giveaway: the texture is pinned to the frame while the image moves under it. The author credits the shimmer behavior to inspiration from FastFilmGrain and radiance, and it's the reason to pick this node over a static-noise composite for anything moving.
amount(0–100, default 25) - how much grain shows through.size(0–100, default 25) - bigger = coarser, chunkier grain.roughness(0–100, default 50) - irregularity.color(0–100, default 0) - 0 is clean monochrome; raise it for dye-cloud color grain.seed- same seed, same grain. Lock it if you want a repeatable look.
The optional mask input confines the grain to part of the frame, feathered by its values so soft edges blend in - the standard use is graining the background (where you blurred) and leaving the subject clean, which pairs naturally with 😺NKD Field Blur.
Where it fits
Reach for it at the end of the pipeline, after upscaling - upscalers can smear grain you added earlier, and grain should be the last thing to touch the pixels anyway. It's a deterministic additive-noise pass, which is the whole point: you don't re-roll a generation to add texture you can add in milliseconds. Subtle is the move; cranked grain reads as an effect, and the "AI look" you were escaping just becomes "Instagram filter."
Output is a single image.
Install and gotchas
Install via ComfyUI Manager (search ComfyUI-NKD-Basic-Tools) or:
cd ComfyUI/custom_nodes
git clone https://github.com/Nekodificador/ComfyUI-NKD-Basic-Tools
Restart after. Pack dependencies are onnxruntime and huggingface_hub; neither is needed here. One caution from the post-processing side of the community: grain is the cheapest single move, not the whole recipe - it usually wants motion blur and a bit of chromatic aberration alongside to really sell the "captured, not generated" look.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| amount | FLOAT | 25.00–100 | How much grain shows through (Lightroom Amount). |
| size | FLOAT | 25.00–100 | Grain size — bigger = coarser, chunkier grain. |
| roughness | FLOAT | 50.00–100 | Irregularity of the grain: blends a fine and a coarse field, like Lightroom. |
| color | FLOAT | 00–100 | 0 = clean monochrome grain. Raise for colored dye-cloud grain. |
| animate | BOOLEAN | true | Fresh grain on every frame of the batch — real film shimmer. Off = the same static grain on all frames. |
| seed | INT | 00–18446744073709550000 | Same seed, same grain. |
| maskopt | MASK | Optional — confine the grain to the mask, feathered by its values (soft edges blend in). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | The grained image. |