๐๏ธ Film Grain
The Analog-Texture Finisher That Kills the Plastic AI Look
- image
- IMAGE
Film Grain adds the fine, organic noise of photochemical film to your render - and it's one of the most useful little lies in AI imaging. That "too smooth, plastic skin" look that gives AI images away is largely a lack of texture, and a thin layer of real grain is the single cheapest fix in the book. Grain also does double duty hiding banding in smooth gradients, which is why it's the go-to finishing move for photorealism workflows. It belongs at the very end of your graph, after upscaling - grain before upscale gets smoothed away.
It's one of the pack's Vintage effects, and it's the one with the most legitimate everyday use beyond pure nostalgia.
How it works
The node generates Gaussian noise and blends it over the image, but it models film, not generic static. Different film_type presets - 35mm, 16mm, 8mm, super8 - carry different grain scales and characteristics (8mm is chunky and harsh, 35mm is fine and refined). With color_grain on, the RGB channels get independent noise (real film grain has color in it); off, you get monochrome grain that reads as a more "neutral" texturizer. The grain is generated per-channel at the intensity you set, which keeps it from looking like a flat gray overlay.
The two extras round out the vintage package: vintage_tone adds a subtle warm/cool cast that fakes film stock color response, and vignette darkens the edges with a soft radial falloff. Both are optional and default to near-zero so you can use this purely as a texture layer.
The inputs that matter
- grain_intensity (0โ1, default 0.3) - amount of grain. 0.2โ0.4 is the sweet spot; past 0.6 it's an effect, not a texturizer.
- grain_size (0.1โ3, default 1) - coarseness of the grain particles.
- film_type - 35mm, 16mm, 8mm or super8. Pick your era.
- color_grain (on) - colored vs monochrome grain.
- vintage_tone (0โ1, default 0.2) - film-stock color cast.
- vignette (0โ1, default 0.1) - edge darkening.
Output is the grained IMAGE.
Installing it
Ships in ComfyUI-Image-Effects (Orion4D). ComfyUI Manager โ search "Image Effects", or:
cd ComfyUI/custom_nodes
git clone https://github.com/orion4d/ComfyUI-Image-Effects
cd ComfyUI-Image-Effects
pip install -r requirements.txt
Restart, then it's under Add Node โ Image Effects. No models - just NumPy for the noise and OpenCV/Pillow for the blend.
Gotchas
Pack-wide: only the first image of a batch is processed, and the noise is random with no seed - every run gets slightly different grain, which is fine (nobody can see it), but don't expect identical files across runs. The real mistake people make is ordering: grain before an upscaler gets averaged out and you get smooth plastic back. Always put it last. And if your goal is just de-plastifying a face, run it at low intensity with color_grain on - the per-channel noise is what makes it read as film rather than a dust filter.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | โ | |
| grain_intensity | FLOAT | 0.300โ1 | โ |
| grain_size | FLOAT | 1.00.1โ3 | โ |
| film_type | COMBO | 35mm | 4 options: 35mm, 16mm, 8mm, super8 |
| color_grainopt | BOOLEAN | true | โ |
| vintage_toneopt | FLOAT | 0.200โ1 | โ |
| vignetteopt | FLOAT | 0.100โ1 | โ |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | โ |