mirror of
https://github.com/wahyd4/three.js.git
synced 2026-08-09 13:06:01 +10:00
Masking was real pain to get working with multiple render targets :/. Unfortunately this introduced dependencies on MaskPass.js and ShaderPass.js even for use cases that do not use masking. Bah, will need to figure out some better way for deployment.
98 lines
3.1 KiB
JavaScript
98 lines
3.1 KiB
JavaScript
/**
|
|
* @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 !== resolution ) ? 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.MeshShaderMaterial( {
|
|
|
|
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.MeshShaderMaterial( {
|
|
|
|
uniforms: this.convolutionUniforms,
|
|
vertexShader: "#define KERNEL_SIZE " + kernelSize + ".0\n" + convolutionShader.vertexShader,
|
|
fragmentShader: "#define KERNEL_SIZE " + kernelSize + "\n" + convolutionShader.fragmentShader
|
|
|
|
} );
|
|
|
|
this.needsSwap = 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.materials[ 0 ] = 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.materials[ 0 ] = 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, false );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
THREE.BloomPass.blurX = new THREE.Vector2( 0.001953125, 0.0 );
|
|
THREE.BloomPass.blurY = new THREE.Vector2( 0.0, 0.001953125 );
|
|
|
|
|