123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- 'use strict';
- /**
- * Screen-space ambient occlusion pass.
- *
- * Has the following parameters
- * - radius
- * - Ambient occlusion shadow radius (numeric value).
- * - onlyAO
- * - Display only ambient occlusion result (boolean value).
- * - aoClamp
- * - Ambient occlusion clamp (numeric value).
- * - lumInfluence
- * - Pixel luminosity influence in AO calculation (numeric value).
- *
- * To output to screen set renderToScreens true
- *
- * @author alteredq / http://alteredqualia.com/
- * @author tentone
- * @class SSAOPass
- */
- THREE.SSAOPass = function ( scene, camera, width, height ) {
- if ( THREE.SSAOShader === undefined ) {
- console.warn( 'THREE.SSAOPass depends on THREE.SSAOShader' );
- return new THREE.ShaderPass();
- }
- THREE.ShaderPass.call( this, THREE.SSAOShader );
- this.width = ( width !== undefined ) ? width : 512;
- this.height = ( height !== undefined ) ? height : 256;
- this.renderToScreen = false;
- this.camera2 = camera;
- this.scene2 = scene;
- //Depth material
- this.depthMaterial = new THREE.MeshDepthMaterial();
- this.depthMaterial.depthPacking = THREE.RGBADepthPacking;
- this.depthMaterial.blending = THREE.NoBlending;
- //Depth render target
- this.depthRenderTarget = new THREE.WebGLRenderTarget( this.width, this.height, { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter } );
- //this.depthRenderTarget.texture.name = 'SSAOShader.rt';
- //Shader uniforms
- this.uniforms[ 'tDepth' ].value = this.depthRenderTarget.texture;
- this.uniforms[ 'size' ].value.set( this.width, this.height );
- this.uniforms[ 'cameraNear' ].value = this.camera2.near;
- this.uniforms[ 'cameraFar' ].value = this.camera2.far;
- this.uniforms[ 'radius' ].value = 4;
- this.uniforms[ 'onlyAO' ].value = false;
- this.uniforms[ 'aoClamp' ].value = 0.25;
- this.uniforms[ 'lumInfluence' ].value = 0.7;
- //Setters and getters for uniforms
- Object.defineProperties( this, {
- radius: {
- get: function () {
- return this.uniforms[ 'radius' ].value;
- },
- set: function ( value ) {
- this.uniforms[ 'radius' ].value = value;
- }
- },
- onlyAO: {
- get: function () {
- return this.uniforms[ 'onlyAO' ].value;
- },
- set: function ( value ) {
- this.uniforms[ 'onlyAO' ].value = value;
- }
- },
- aoClamp: {
- get: function () {
- return this.uniforms[ 'aoClamp' ].value;
- },
- set: function ( value ) {
- this.uniforms[ 'aoClamp' ].value = value;
- }
- },
- lumInfluence: {
- get: function () {
- return this.uniforms[ 'lumInfluence' ].value;
- },
- set: function ( value ) {
- this.uniforms[ 'lumInfluence' ].value = value;
- }
- },
- } );
- };
- THREE.SSAOPass.prototype = Object.create( THREE.ShaderPass.prototype );
- /**
- * Render using this pass.
- *
- * @method render
- * @param {WebGLRenderer} renderer
- * @param {WebGLRenderTarget} writeBuffer Buffer to write output.
- * @param {WebGLRenderTarget} readBuffer Input buffer.
- * @param {Number} delta Delta time in milliseconds.
- * @param {Boolean} maskActive Not used in this pass.
- */
- THREE.SSAOPass.prototype.render = function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {
- //Render depth into depthRenderTarget
- this.scene2.overrideMaterial = this.depthMaterial;
- renderer.render( this.scene2, this.camera2, this.depthRenderTarget, true );
- this.scene2.overrideMaterial = null;
- //SSAO shaderPass
- THREE.ShaderPass.prototype.render.call( this, renderer, writeBuffer, readBuffer, delta, maskActive );
- };
- /**
- * Change scene to be renderer by this render pass.
- *
- * @method setScene
- * @param {Scene} scene
- */
- THREE.SSAOPass.prototype.setScene = function ( scene ) {
- this.scene2 = scene;
- };
- /**
- * Set camera used by this render pass.
- *
- * @method setCamera
- * @param {Camera} camera
- */
- THREE.SSAOPass.prototype.setCamera = function ( camera ) {
- this.camera2 = camera;
- this.uniforms[ 'cameraNear' ].value = this.camera2.near;
- this.uniforms[ 'cameraFar' ].value = this.camera2.far;
- };
- /**
- * Set resolution of this render pass.
- *
- * @method setSize
- * @param {Number} width
- * @param {Number} height
- */
- THREE.SSAOPass.prototype.setSize = function ( width, height ) {
- this.width = width;
- this.height = height;
- this.uniforms[ 'size' ].value.set( this.width, this.height );
- this.depthRenderTarget.setSize( this.width, this.height );
- };
|