/** * @author alteredq / http://alteredqualia.com/ */ THREE.BloomPass = function ( strength, kernelSize, sigma, resolution ) { strength = ( strength !== undefined ) ? strength : 1; kernelSize = ( kernelSize !== undefined ) ? kernelSize : 25; sigma = ( sigma !== undefined ) ? sigma : 4.0; resolution = ( resolution !== undefined ) ? resolution : 256; // render targets var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat }; this.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars ); this.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars ); // screen material var screenShader = THREE.ShaderExtras[ "screen" ]; this.screenUniforms = THREE.UniformsUtils.clone( screenShader.uniforms ); this.screenUniforms[ "opacity" ].value = strength; this.materialScreen = new THREE.ShaderMaterial( { uniforms: this.screenUniforms, vertexShader: screenShader.vertexShader, fragmentShader: screenShader.fragmentShader, blending: THREE.AdditiveBlending, transparent: true } ); // convolution material var convolutionShader = THREE.ShaderExtras[ "convolution" ]; this.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms ); this.convolutionUniforms[ "uImageIncrement" ].value = THREE.BloomPass.blurx; this.convolutionUniforms[ "cKernel" ].value = THREE.ShaderExtras.buildKernel( sigma ); this.materialConvolution = new THREE.ShaderMaterial( { uniforms: this.convolutionUniforms, vertexShader: "#define KERNEL_SIZE " + kernelSize + ".0\n" + convolutionShader.vertexShader, fragmentShader: "#define KERNEL_SIZE " + kernelSize + "\n" + convolutionShader.fragmentShader } ); this.enabled = true; this.needsSwap = false; this.clear = false; }; THREE.BloomPass.prototype = { render: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) { if ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST ); // Render quad with blured scene into texture (convolution pass 1) THREE.EffectComposer.quad.material = this.materialConvolution; this.convolutionUniforms[ "tDiffuse" ].texture = readBuffer; this.convolutionUniforms[ "uImageIncrement" ].value = THREE.BloomPass.blurX; renderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetX, true ); // Render quad with blured scene into texture (convolution pass 2) this.convolutionUniforms[ "tDiffuse" ].texture = this.renderTargetX; this.convolutionUniforms[ "uImageIncrement" ].value = THREE.BloomPass.blurY; renderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTargetY, true ); // Render original scene with superimposed blur to texture THREE.EffectComposer.quad.material = this.materialScreen; this.screenUniforms[ "tDiffuse" ].texture = this.renderTargetY; if ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST ); renderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer, this.clear ); } }; THREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 ); THREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );