TT Add Film Grain
Procedural film grain that survives upscaling
- image
- IMAGE
Film grain is the cheapest trick in the cinematic book: a little organic noise on top of a too-perfect AI render and suddenly it looks like footage instead of a render. TT Add Film Grain does that, but it does it the right way - it doesn't just splatter random noise on your image. It generates a small, blurred, color-noise field, upscales it to your image size, and blends it with shadow-aware math. The result reads as grain, not static.
It's a postproduction node from TenserTensor, and its personality is "cinematic, procedural, and deterministic."
The inputs that matter
seed- grain pattern is seeded, so you can reproduce a specific grain. Different seed, different grain; the node callstorch.manual_seedwith it.strength(default 0.15) - how much grain. 0.15 is subtle and tasteful; past 1 you're making it the subject of the image.scale(default 0.25) - the grain texture is generated at this fraction of image size and then upscaled. Smaller = finer grain. This is the detail people get wrong: crankscaleup and the grain gets chunky, not stronger.saturation(default 0.2) - how colorful the grain is. 0 is monochrome (often the most filmic), higher gives that grainy-video color noise.toe(−0.2 to 0.5, default 0) - controls where grain sits in the tone curve. A positive toe lifts shadows, changing how grain behaves in dark areas. Play with it if grain is eating your blacks.upscale_mode(bilinear/bicubic/lanczos/nearest/area) andantialias- how the grain field is resized. Lanczos is the safe default for quality;nearestgives harsh, digital grain.
The mechanism is worth understanding because it's why this node is good: generate small RGB noise, split into YCbCr, blur the three channels with different kernel sizes (3, 15, 11 - so luminance blurs least and one chroma channel blurs most), recombine, and weight the channels (red double, blue triple) for that classic color-grain look. Then it's upscaled to full size and composited with a screen-blend style that respects your toe. Procedural means no texture files, no model downloads, and it works at any resolution.
Install and caveats
cd ComfyUI/custom_nodes
git clone https://github.com/tenser-tensor/ComfyUI-TenserTensor
or ComfyUI Manager → "TenserTensor" → install → restart. Deps: gguf and kornia - kornia does the blurring and color math, so if this node errors with a missing-module message, that's the package to check.
Where people get burned: applying grain before upscaling, then upscaling - which doubles the grain and makes it look mushy. Grain is a last-step effect: save it for right before the final output. And it's a legacy V1 node, migrated to Deprecated/ after the pack's move to ComfyUI's API V3, with removal planned for a future major release. It works today; if you love this look, keep an eye on the pack's V3 postproduction section for the successor.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| seed | INT | 00–18446744073709550000 | — |
| scale | FLOAT | 0.250.25–2 | — |
| strength | FLOAT | 0.150–10 | — |
| saturation | FLOAT | 0.200–2 | — |
| toe | FLOAT | 0.000-0.2–0.5 | — |
| upscale_mode | COMBO | 5 options: bilinear, bicubic, lanczos, nearest, area | |
| antialias | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |