IAMCCS Cine Temporal Film Grain · 4K Scan
The one IAMCCS node you can actually run standalone (and it looks great)
- images
- images
- grain_map
- report
Most of the pack around this node is buried in IAMCCS's MiniMax H3 shotboard pipeline, needs a cine_linx bus, and will not do anything without a whole ecosystem behind it. This one is the exception: feed it frames, get frames out. No cine_linx socket, no model download, no ControlNet aux dependency. If you want one taste of what IAMCCS does well without adopting the whole cinematic framework, this is it.
What it is
A finishing-pass film grain node aimed at video: animated, resolution-aware grain rendered in linear light, placed "after the final detail/upscale stage and before the encoder" - the author's own words, and the right placement. Grain is a deceptive amount of the reason real footage reads as film; the trick is doing it properly instead of stacking a static texture. This node generates a fresh stochastic grain field per frame, sizes it relative to a 4K-scan reference so the clumpiness stays correct whether your frames are 1080p or 8K, and correlates it gently across time so it shimmers like emulsion rather than flickering like mosquito noise.
It also processes in linear light with tone-dependent response - grain lands harder in shadows and midtones and lighter in highlights, which is where the "looks like a scan, not a filter" impression comes from. Overlaying noise in sRGB just makes everything look dirty.
Inputs that matter
preset-65mm_4k_scan_subtle,35mm_vision3_fine,35mm_500t_texture,16mm_fine_documentary, orcustom_box_values. Important detail from the author: the preset only fills the box values in the UI. The box values are render truth. Change a number after picking a preset and you're on custom whether the dropdown says so or not.strength- 0.08 default. On video, resist pushing this past ~0.15; grain reads much stronger in motion than in a single still.temporal_persistence(0.06 default) - how much the grain field carries over between frames. Low = crisp near-independent grain per frame. Crank it toward 0.85 and you get the more "settled" correlated look, but too far and the grain stops animating and starts looking like a fixed overlay.grain_size_4k_px(0.58) - grain scale in pixels, referenced to 4K; the node scales the noise field up/down to your actual resolution.shadow_response/midtone_response/highlight_response- tone-dependent gain.chroma_amount- colored grain. Keep this small (0.025 default); chroma grain at 4K scan levels is where the effect can go from tasteful to magenta-noise fast.blend_method-density_exposure(default),linear_additive, orsoft_light_luma.seedandframe_start- anchor the grain sequence so you can re-run a segment and match grain from the previous render.
Outputs
images- the grained frames, ready for the encoder.grain_map- a MASK of the exact grain applied, handy if you want to inspect or re-composite.report- a string describing what ran.
Install
Part of IAMCCS-nodes. ComfyUI Manager → search IAMCCS, or:
cd ComfyUI/custom_nodes
git clone https://github.com/IAMCCS/IAMCCS-nodes.git
Restart ComfyUI. Pure torch under the hood - this node pulls in no model files.
Where people get burned
- Placing it before upscaling: grain gets upscaled into mush. After upscale, before encode, as designed.
- Cranking
temporal_persistenceto remove flicker and ending up with a static grain that makes motion look like a live-action plate with a stuck scan. If frames look frozen, drop persistence, don't drop strength. - Forgetting that higher resolutions need the same
grain_size_4k_pxto look finer per pixel - that's normal, it's the resolution-aware part working.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| preset | COMBO | 65mm_4k_scan_subtle | 5 options: 65mm_4k_scan_subtle, 35mm_vision3_fine, 35mm_500t_texture, 16mm_fine_documentary, custom_box_values |
| blend_method | COMBO | density_exposure | 3 options: density_exposure, linear_additive, soft_light_luma |
| strength | FLOAT | 0.080–1 | — |
| grain_size_4k_px | FLOAT | 0.580.35–4 | — |
| temporal_persistence | FLOAT | 0.060–0.85 | — |
| chroma_amount | FLOAT | 0.030–0.5 | — |
| shadow_response | FLOAT | 0.480–2 | — |
| midtone_response | FLOAT | 0.820–2 | — |
| highlight_response | FLOAT | 0.240–2 | — |
| seed | INT | 10–9223372036854776000 | — |
| frame_start | INT | 00–2147483647 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| grain_map | MASK | — |
| report | STRING | — |