glsl-film-grain
Natural looking film grain using 3D noise functions. Inspired by Martins Upitis.
This is a fairly expensive technique to achieve film grain, but it looks more realistic than a hash function and also produces better motion.
Simplest example:
# grain = require(glsl-film-grain) void
Results in:
See blending tips and the demo source for details.
Usage
f = grain(texCoord, resolution[, frame[, q]])
Returns a float for the monochromatic grain with the given options:
texCoord
the UV coordinates of your sceneresolution
the resolution of your scene in pixels, optionally scaled to adjust the grain sizeframe
the animation frame, which is an offset into the Z of the 3D noiseq
is a coefficient for the offset calculation, and may evoke subtly different motion. Defaults to 2.5
blending tips
There are a lot of ways to blend the noise onto the 3D scene or image. The solution used in the demo uses glsl-blend-soft-light and glsl-luma.
vec3 g = vec3(grain(texCoord, p)); //blend the noise over the background, //i.e. overlay, soft light, additive vec3 color = blend(backgroundColor, g); //get the luminance of the background float luminance = luma(backgroundColor); //reduce the noise based on some //threshold of the background luminance float response = smoothstep(0.05, 0.5, luminance); color = mix(color, backgroundColor, pow(response, 2.0)); //final color gl_FragColor = vec4(color, 1.0);
License
MIT, see LICENSE.md for details.