mirror of
https://github.com/wahyd4/three.js.git
synced 2026-08-16 00:15:56 +10:00
Cause everywhere there are warnings about not writing to the same texture which is also being read. Curiously enough this didn't make problems so far (save for mysterious lines when doing "heat" effect in ro.me).
94 lines
2.9 KiB
JavaScript
94 lines
2.9 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 ) {
|
|
|
|
// 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;
|
|
|
|
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 );
|
|
|
|
|