| |
| |
| |
|
|
|
|
| THREE.BokehPass = function ( scene, camera, params ) { |
|
|
| THREE.Pass.call( this ); |
|
|
| this.scene = scene; |
| this.camera = camera; |
|
|
| var focus = ( params.focus !== undefined ) ? params.focus : 1.0; |
| var aspect = ( params.aspect !== undefined ) ? params.aspect : camera.aspect; |
| var aperture = ( params.aperture !== undefined ) ? params.aperture : 0.025; |
| var maxblur = ( params.maxblur !== undefined ) ? params.maxblur : 1.0; |
|
|
| |
|
|
| var width = params.width || window.innerWidth || 1; |
| var height = params.height || window.innerHeight || 1; |
|
|
| this.renderTargetColor = new THREE.WebGLRenderTarget( width, height, { |
| minFilter: THREE.LinearFilter, |
| magFilter: THREE.LinearFilter, |
| format: THREE.RGBFormat |
| } ); |
| this.renderTargetColor.texture.name = "BokehPass.color"; |
|
|
| this.renderTargetDepth = this.renderTargetColor.clone(); |
| this.renderTargetDepth.texture.name = "BokehPass.depth"; |
|
|
| |
|
|
| this.materialDepth = new THREE.MeshDepthMaterial(); |
| this.materialDepth.depthPacking = THREE.RGBADepthPacking; |
| this.materialDepth.blending = THREE.NoBlending; |
|
|
| |
|
|
| if ( THREE.BokehShader === undefined ) { |
|
|
| console.error( "THREE.BokehPass relies on THREE.BokehShader" ); |
|
|
| } |
|
|
| var bokehShader = THREE.BokehShader; |
| var bokehUniforms = THREE.UniformsUtils.clone( bokehShader.uniforms ); |
|
|
| bokehUniforms[ "tDepth" ].value = this.renderTargetDepth.texture; |
|
|
| bokehUniforms[ "focus" ].value = focus; |
| bokehUniforms[ "aspect" ].value = aspect; |
| bokehUniforms[ "aperture" ].value = aperture; |
| bokehUniforms[ "maxblur" ].value = maxblur; |
| bokehUniforms[ "nearClip" ].value = camera.near; |
| bokehUniforms[ "farClip" ].value = camera.far; |
|
|
| this.materialBokeh = new THREE.ShaderMaterial( { |
| defines: Object.assign( {}, bokehShader.defines ), |
| uniforms: bokehUniforms, |
| vertexShader: bokehShader.vertexShader, |
| fragmentShader: bokehShader.fragmentShader |
| } ); |
|
|
| this.uniforms = bokehUniforms; |
| this.needsSwap = false; |
|
|
| this.fsQuad = new THREE.Pass.FullScreenQuad( this.materialBokeh ); |
|
|
| this.oldClearColor = new THREE.Color(); |
| this.oldClearAlpha = 1; |
|
|
| }; |
|
|
| THREE.BokehPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), { |
|
|
| constructor: THREE.BokehPass, |
|
|
| render: function ( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) { |
|
|
| |
|
|
| this.scene.overrideMaterial = this.materialDepth; |
|
|
| this.oldClearColor.copy( renderer.getClearColor() ); |
| this.oldClearAlpha = renderer.getClearAlpha(); |
| var oldAutoClear = renderer.autoClear; |
| renderer.autoClear = false; |
|
|
| renderer.setClearColor( 0xffffff ); |
| renderer.setClearAlpha( 1.0 ); |
| renderer.setRenderTarget( this.renderTargetDepth ); |
| renderer.clear(); |
| renderer.render( this.scene, this.camera ); |
|
|
| |
|
|
| this.uniforms[ "tColor" ].value = readBuffer.texture; |
| this.uniforms[ "nearClip" ].value = this.camera.near; |
| this.uniforms[ "farClip" ].value = this.camera.far; |
|
|
| if ( this.renderToScreen ) { |
|
|
| renderer.setRenderTarget( null ); |
| this.fsQuad.render( renderer ); |
|
|
| } else { |
|
|
| renderer.setRenderTarget( writeBuffer ); |
| renderer.clear(); |
| this.fsQuad.render( renderer ); |
|
|
| } |
|
|
| this.scene.overrideMaterial = null; |
| renderer.setClearColor( this.oldClearColor ); |
| renderer.setClearAlpha( this.oldClearAlpha ); |
| renderer.autoClear = this.oldAutoClear; |
|
|
| } |
|
|
| } ); |
|
|