Orion4D · Film Grain APP
The fastest way to make AI images look photographed
- image
- mask
- image
- mask
One of the most reliable tricks in the realism playbook is dead simple: add grain. A hint of noise tells the brain this was captured by optics and film, not rendered by a diffusion model. Orion4D_FXMax_FilmGrain (displayed "Orion4D · Film Grain APP") is the pack's procedural film-simulation node, and it goes well beyond adding random static - it models the actual physics of grain plus a few lens-accident extras.
How it works
Under the hood it generates noise three different ways:
- Poisson - models photon shot noise, the statistical fluctuation of light hitting a sensor or emulsion. This is the one that looks real rather than like TV static, and it's the default.
- Perlin - coherent, cloud-like noise for clumpy or organic grain.
- Gaussian - classic uniform sensor noise.
Then the controls do the photography work: grain size and softness, monochrome vs. chroma (color) grain, adaptive grain with shadow boost and highlight protection (so shadows get grain and blown highlights stay clean), plus optional halation, vignette, chromatic aberration, and lens distortion for the full "shot on film" package. If you've been prompting "Kodak Portra 400" and hoping, this is the deterministic version.
Inputs and outputs
Pack-standard schema:
- image - the IMAGE tensor.
- preset - Fine Film Grain, Classic 400 ISO, Push Process Coarse, or Vintage Lens.
- raw_settings - "Embedded JSON settings used for workflow portability. Managed automatically by the APP."
- mask (optional) - grain only part of the frame, e.g. keep faces smoother.
Outputs: image and mask. The grain_seed control (inside the APP) matters for video - set it fixed per shot if you want grain to stay consistent across frames.
The honest performance warning
This is the pack's slowest node, full stop. The README is upfront: it generates procedural noise pixel-by-pixel and does bilinear-interpolated lens distortion, all on the CPU with NumPy and PIL. Fine for stills - on a normal-size image it's a moment - but on 4K batches or AnimateDiff video it'll genuinely slow your loop down. For video, either skip grain or apply it to the final composite only, once, not per-frame inside the generation loop.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/orion4d/Orion4D_FXMax.git
# restart ComfyUI
Or ComfyUI Manager → "Orion4D_FXMax". No model downloads, Pillow-only. The Open APP preview with the before/after slider is where you'll actually find the right grain amount - it should read as texture, not as a dirty screen.
Gotchas
Subtle is the whole game. If someone can name the grain, it's too much. Also note the mono/chroma toggle: chroma grain on dark shadows reads as "pushed film," monochrome grain reads as neutral - pick per look, don't default to max. And if an image already has sensor noise baked in, adding more stacks rather than hiding it.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| preset | COMBO | 4 options: Fine Film Grain, Classic 400 ISO, Push Process Coarse, Vintage Lens | |
| raw_settings | STRING | Embedded JSON settings used for workflow portability. Managed automatically by the APP. | |
| maskopt | MASK | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |