From 3a5d02cc39d59bf06dc46f2944babe7a71198ca0 Mon Sep 17 00:00:00 2001 From: alteredq Date: Tue, 30 Aug 2011 18:59:00 +0200 Subject: [PATCH] Added vignette shader / effect. Updated postprocessing example. --- build/Three.js | 3 +- build/custom/ThreeExtras.js | 3 +- examples/js/postprocessing/VignettePass.js | 46 +++++++++++++++ examples/webgl_postprocessing.html | 28 +++++---- src/extras/ShaderUtils.js | 68 +++++++++++++++++++++- 5 files changed, 133 insertions(+), 15 deletions(-) create mode 100644 examples/js/postprocessing/VignettePass.js diff --git a/build/Three.js b/build/Three.js index 340cbc9b..3f41e2ee 100644 --- a/build/Three.js +++ b/build/Three.js @@ -356,8 +356,9 @@ THREE.ShaderChunk.fog_fragment,"}"].join("\n"),vertexShader:"attribute vec4 tang cube:{uniforms:{tCube:{type:"t",value:1,texture:null}},vertexShader:"varying vec3 vViewPosition;\nvoid main() {\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\nvViewPosition = cameraPosition - mPosition.xyz;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform samplerCube tCube;\nvarying vec3 vViewPosition;\nvoid main() {\nvec3 wPos = cameraPosition - vViewPosition;\ngl_FragColor = textureCube( tCube, vec3( - wPos.x, wPos.yz ) );\n}"},convolution:{uniforms:{tDiffuse:{type:"t", value:0,texture:null},uImageIncrement:{type:"v2",value:new THREE.Vector2(0.001953125,0)},cKernel:{type:"fv1",value:[]}},vertexShader:"varying vec2 vUv;\nuniform vec2 uImageIncrement;\nvoid main(void) {\nvUv = uv - ((KERNEL_SIZE - 1.0) / 2.0) * uImageIncrement;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"varying vec2 vUv;\nuniform sampler2D tDiffuse;\nuniform vec2 uImageIncrement;\nuniform float cKernel[KERNEL_SIZE];\nvoid main(void) {\nvec2 imageCoord = vUv;\nvec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\nfor( int i=0; i25&&(j=25);g=(j-1)*0.5;e=Array(j);for(c=f=0;c25&&(h=25);f=(h-1)*0.5;c=Array(h);for(b=e=0;b + @@ -62,7 +63,8 @@ void main() { - gl_FragColor = vec4( time, vUv.x, vUv.y, 1.0 ); + //gl_FragColor = vec4( time, vUv.x, vUv.y, 1.0 ); + gl_FragColor = vec4( 0.2, 0.4, 0.5, 1.0 ); } @@ -155,23 +157,27 @@ container.appendChild( renderer.domElement ); + // + stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.top = '0px'; - container.appendChild( stats.domElement ); + //container.appendChild( stats.domElement ); // var effectBloom = new THREE.BloomPass( 0.75 ); - var effectFilm = new THREE.FilmPass( 0.35, 0.5, 2048, false ); + var effectFilm = new THREE.FilmPass( 0.75, 0.025, 648, false ); var effectFilmBW = new THREE.FilmPass( 0.35, 0.5, 2048, true ); var effectSepia = new THREE.SepiaPass( 1.0 ); var effectScreen = new THREE.ScreenPass(); var effectDotScreen = new THREE.DotScreenPass( new THREE.Vector2( 0, 0 ), 0.5, 0.4 ); + var effectVignette = new THREE.VignettePass( 0.95, 1.6 ); - effectFilm.renderToScreen = true; - effectFilmBW.renderToScreen = true; - effectDotScreen.renderToScreen = true; + //effectFilm.renderToScreen = true; + //effectFilmBW.renderToScreen = true; + //effectDotScreen.renderToScreen = true; + effectVignette.renderToScreen = true; // @@ -215,6 +221,7 @@ composer1.addPass( renderScene ); composer1.addPass( effectBloom ); composer1.addPass( effectFilmBW ); + composer1.addPass( effectVignette ); // @@ -222,6 +229,7 @@ composer2.addPass( renderScene ); composer2.addPass( effectDotScreen ); + composer2.addPass( effectVignette ); // @@ -230,6 +238,7 @@ composer3.addPass( renderScene ); composer3.addPass( effectSepia ); composer3.addPass( effectFilm ); + composer3.addPass( effectVignette ); // @@ -237,8 +246,7 @@ composer4.addPass( renderScene ); composer4.addPass( effectBloom ); - composer4.addPass( effectSepia ); - composer4.addPass( effectScreen ); + composer4.addPass( effectVignette ); // diff --git a/src/extras/ShaderUtils.js b/src/extras/ShaderUtils.js index 9da0fbf9..6a7ddaf7 100644 --- a/src/extras/ShaderUtils.js +++ b/src/extras/ShaderUtils.js @@ -574,7 +574,7 @@ THREE.ShaderUtils = { uniforms: { tDiffuse: { type: "t", value: 0, texture: null }, - amount: { type: "f", value: 1.0 } + amount: { type: "f", value: 1.0 } }, @@ -593,9 +593,10 @@ THREE.ShaderUtils = { fragmentShader: [ + "uniform float amount;", + "varying vec2 vUv;", "uniform sampler2D tDiffuse;", - "uniform float amount;", "void main() {", @@ -680,6 +681,67 @@ THREE.ShaderUtils = { }, + /* ------------------------------------------------------------------------------------------------ + // Vignette shader + // - based on PaintEffect postprocess from ro.me + // http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js + ------------------------------------------------------------------------------------------------ */ + + 'vignette': { + + uniforms: { + + tDiffuse: { type: "t", value: 0, texture: null }, + offset: { type: "f", value: 1.0 }, + darkness: { type: "f", value: 1.0 } + + }, + + vertexShader: [ + + "varying vec2 vUv;", + + "void main() {", + + "vUv = vec2( uv.x, 1.0 - uv.y );", + "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", + + "}" + + ].join("\n"), + + fragmentShader: [ + + "uniform float offset;", + "uniform float darkness;", + + "varying vec2 vUv;", + "uniform sampler2D tDiffuse;", + + "void main() {", + + // Eskil's vignette + + "vec4 texel = texture2D( tDiffuse, vUv );", + "vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );", + "gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );", + + /* + // alternative version from glfx.js + // this one makes more "dusty" look (as opposed to "burned") + + "vec4 color = texture2D( tDiffuse, vUv );", + "float dist = distance( vUv, vec2( 0.5 ) );", + "color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );", + "gl_FragColor = color;", + */ + + "}" + + ].join("\n") + + }, + /* ------------------------------------------------------------------------- // Full-screen textured quad shader ------------------------------------------------------------------------- */ @@ -689,7 +751,7 @@ THREE.ShaderUtils = { uniforms: { tDiffuse: { type: "t", value: 0, texture: null }, - opacity: { type: "f", value: 1.0 } + opacity: { type: "f", value: 1.0 } },