Feature Playground

Texture / atmosphere · 9.1

Film grain overlay

Pushed 35mm film.

Photographic grain over the frame, killing the sterile CGI look and hiding gradient banding.

4 knobs

How it actually works

The single cheapest move toward cinematic, and the one most likely to fix a gradient that looks wrong for reasons you cannot name. Banding is not a colour problem, it is a quantisation problem, and noise is the only thing that fixes quantisation. Turn the amount to 0 and watch the bands appear.

A fullscreen pass generating noise per pixel and blending it into RGB. The naive version is a hash function. The good version blends with soft-light against the texel's luminance rather than a flat mix, so the grain adapts to brightness the way real film does: heavy in the mid-tones, almost absent in the highlights.

The knobs, named

Grain amount, grain size, luminance response, time speed. The luminance response knob is the good-versus-naive difference, exposed as a slider instead of an argument.

KnobSourceWhat it teaches
Grain amount sourced How much noise reaches the image. Zero shows you the banding it was hiding.
Grain size sourced Scale of the grain. Large grain is 35mm pushed two stops; fine grain is digital sensor noise.
Luminance response sourced The good/naive difference. At 0 it is a flat mix over everything, including the highlights, which is what makes cheap grain look like dirt. At 1 the grain lives in the mid-tones like real film.
Time speed sourced Animated versus static. Zero is a still, and a still is often the right answer.

sourced means the source names this parameter. ours means the source names none and the knob is our design against the mechanism. No knob here is invented and passed off as sourced.

Evidence

VERIFIED (author) for the pipeline stage; blend detail INFERRED

Codrops "Dual-Scene Fluid X-Ray Reveal" ships film grain as a named stage in its RenderPipeline (fetch-verified); the Codrops scroll-reactive 3D gallery lists it in its minimal shader. The soft-light/luminance blend detail is INFERRED from glsl-film-grain snippets (mattdesl, after Martins Upitis) and the index says to verify the exact blend before shipping. Ours is a soft-light approximation and is not claimed to match theirs.

Seen on
Codrops X-Ray Reveal (verified as a pipeline stage); glsl-film-grain.
Dependencies
vanilla GLSL; or postprocessing's NoiseEffect
Difficulty
trivial (hash) to moderate (3D-noise)
Performance
Snippet-sourced: 3D noise is "fairly expensive, but looks more realistic and produces better motion" than a hash. Ours uses a hash, honestly.
Accessibility and the floor
Animated grain is a flicker and vestibular risk. Under reduced motion we freeze the time uniform rather than removing the grain, per the sourced guidance.

Notes

Composability. It goes on top of everything. That is what a post-process is.

The speed knob is a one-control demonstration of our own reduced-motion philosophy, which is why it is here. The sourced guidance is to freeze the time uniform under reduced motion, not to remove the grain: a static grain is still the right look. Freeze, do not delete. That distinction is most of our floor.