text: /**
   * @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
  
  	} );
  
  	this.materialScreen.name = "postprocessing_screenshader";
  
  	// 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.materialConvolution.name = "postprocessing_convolutionshader"
  
  	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" ].value = 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" ].value = 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" ].value = 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 );
  