12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- ( function () {
- var BloomPass = function ( strength, kernelSize, sigma, resolution ) {
- THREE.Pass.call( this );
- 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.RGBAFormat
- };
- this.renderTargetX = new THREE.WebGLRenderTarget( resolution, resolution, pars );
- this.renderTargetX.texture.name = 'BloomPass.x';
- this.renderTargetY = new THREE.WebGLRenderTarget( resolution, resolution, pars );
- this.renderTargetY.texture.name = 'BloomPass.y'; // copy material
- if ( THREE.CopyShader === undefined ) console.error( 'THREE.BloomPass relies on THREE.CopyShader' );
- var copyShader = THREE.CopyShader;
- this.copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );
- this.copyUniforms[ 'opacity' ].value = strength;
- this.materialCopy = new THREE.ShaderMaterial( {
- uniforms: this.copyUniforms,
- vertexShader: copyShader.vertexShader,
- fragmentShader: copyShader.fragmentShader,
- blending: THREE.AdditiveBlending,
- transparent: true
- } ); // convolution material
- if ( THREE.ConvolutionShader === undefined ) console.error( 'THREE.BloomPass relies on THREE.ConvolutionShader' );
- var convolutionShader = THREE.ConvolutionShader;
- this.convolutionUniforms = THREE.UniformsUtils.clone( convolutionShader.uniforms );
- this.convolutionUniforms[ 'uImageIncrement' ].value = BloomPass.blurX;
- this.convolutionUniforms[ 'cKernel' ].value = THREE.ConvolutionShader.buildKernel( sigma );
- this.materialConvolution = new THREE.ShaderMaterial( {
- uniforms: this.convolutionUniforms,
- vertexShader: convolutionShader.vertexShader,
- fragmentShader: convolutionShader.fragmentShader,
- defines: {
- 'KERNEL_SIZE_FLOAT': kernelSize.toFixed( 1 ),
- 'KERNEL_SIZE_INT': kernelSize.toFixed( 0 )
- }
- } );
- this.needsSwap = false;
- this.fsQuad = new THREE.Pass.FullScreenQuad( null );
- };
- BloomPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {
- constructor: BloomPass,
- render: function ( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {
- if ( maskActive ) renderer.state.buffers.stencil.setTest( false ); // Render quad with blured scene into texture (convolution pass 1)
- this.fsQuad.material = this.materialConvolution;
- this.convolutionUniforms[ 'tDiffuse' ].value = readBuffer.texture;
- this.convolutionUniforms[ 'uImageIncrement' ].value = BloomPass.blurX;
- renderer.setRenderTarget( this.renderTargetX );
- renderer.clear();
- this.fsQuad.render( renderer ); // Render quad with blured scene into texture (convolution pass 2)
- this.convolutionUniforms[ 'tDiffuse' ].value = this.renderTargetX.texture;
- this.convolutionUniforms[ 'uImageIncrement' ].value = BloomPass.blurY;
- renderer.setRenderTarget( this.renderTargetY );
- renderer.clear();
- this.fsQuad.render( renderer ); // Render original scene with superimposed blur to texture
- this.fsQuad.material = this.materialCopy;
- this.copyUniforms[ 'tDiffuse' ].value = this.renderTargetY.texture;
- if ( maskActive ) renderer.state.buffers.stencil.setTest( true );
- renderer.setRenderTarget( readBuffer );
- if ( this.clear ) renderer.clear();
- this.fsQuad.render( renderer );
- }
- } );
- BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );
- BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );
- THREE.BloomPass = BloomPass;
- } )();
|