Spaces:
Running
Running
| /** | |
| * @author alteredq / http://alteredqualia.com/ | |
| * | |
| * Film grain & scanlines shader | |
| * | |
| * - ported from HLSL to WebGL / GLSL | |
| * http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html | |
| * | |
| * Screen Space Static Postprocessor | |
| * | |
| * Produces an analogue noise overlay similar to a film grain / TV static | |
| * | |
| * Original implementation and noise algorithm | |
| * Pat 'Hawthorne' Shearon | |
| * | |
| * Optimized scanlines + noise version with intensity scaling | |
| * Georg 'Leviathan' Steinrohder | |
| * | |
| * This version is provided under a Creative Commons Attribution 3.0 License | |
| * http://creativecommons.org/licenses/by/3.0/ | |
| */ | |
| THREE.FilmShader = { | |
| uniforms: { | |
| "tDiffuse": { value: null }, | |
| "time": { value: 0.0 }, | |
| "nIntensity": { value: 0.5 }, | |
| "sIntensity": { value: 0.05 }, | |
| "sCount": { value: 4096 }, | |
| "grayscale": { value: 1 } | |
| }, | |
| vertexShader: [ | |
| "varying vec2 vUv;", | |
| "void main() {", | |
| "vUv = uv;", | |
| "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", | |
| "}" | |
| ].join( "\n" ), | |
| fragmentShader: [ | |
| "#include <common>", | |
| // control parameter | |
| "uniform float time;", | |
| "uniform bool grayscale;", | |
| // noise effect intensity value (0 = no effect, 1 = full effect) | |
| "uniform float nIntensity;", | |
| // scanlines effect intensity value (0 = no effect, 1 = full effect) | |
| "uniform float sIntensity;", | |
| // scanlines effect count value (0 = no effect, 4096 = full effect) | |
| "uniform float sCount;", | |
| "uniform sampler2D tDiffuse;", | |
| "varying vec2 vUv;", | |
| "void main() {", | |
| // sample the source | |
| "vec4 cTextureScreen = texture2D( tDiffuse, vUv );", | |
| // make some noise | |
| "float dx = rand( vUv + time );", | |
| // add noise | |
| "vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx, 0.0, 1.0 );", | |
| // get us a sine and cosine | |
| "vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );", | |
| // add scanlines | |
| "cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;", | |
| // interpolate between source and result by intensity | |
| "cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );", | |
| // convert to grayscale if desired | |
| "if( grayscale ) {", | |
| "cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );", | |
| "}", | |
| "gl_FragColor = vec4( cResult, cTextureScreen.a );", | |
| "}" | |
| ].join( "\n" ) | |
| }; | |