EffectComposer.js 3.9 KB
Newer Older
1 2 3 4
/**
 * @author alteredq / http://alteredqualia.com/
 */

M
Mr.doob 已提交
5
THREE.EffectComposer = function ( renderer, renderTarget ) {
6 7 8

	this.renderer = renderer;

9
	if ( renderTarget === undefined ) {
10

M
Mr.doob 已提交
11 12 13 14 15 16
		var parameters = {
			minFilter: THREE.LinearFilter,
			magFilter: THREE.LinearFilter,
			format: THREE.RGBAFormat,
			stencilBuffer: false
		};
17

18
		var size = renderer.getDrawingBufferSize();
M
Mr.doob 已提交
19
		renderTarget = new THREE.WebGLRenderTarget( size.width, size.height, parameters );
20 21
		renderTarget.texture.name = 'EffectComposer.rt1';

22 23
	}

24 25
	this.renderTarget1 = renderTarget;
	this.renderTarget2 = renderTarget.clone();
26
	this.renderTarget2.texture.name = 'EffectComposer.rt2';
27 28 29 30

	this.writeBuffer = this.renderTarget1;
	this.readBuffer = this.renderTarget2;

M
Mugen87 已提交
31
	this.passes = [];
32

33 34 35 36 37 38 39 40 41 42 43 44 45
	// dependencies

	if ( THREE.CopyShader === undefined ) {

		console.error( 'THREE.EffectComposer relies on THREE.CopyShader' );

	}

	if ( THREE.ShaderPass === undefined ) {

		console.error( 'THREE.EffectComposer relies on THREE.ShaderPass' );

	}
46 47 48

	this.copyPass = new THREE.ShaderPass( THREE.CopyShader );

M
Mr.doob 已提交
49
	this._previousFrameTime = Date.now();
50

51 52
};

M
Mr.doob 已提交
53
Object.assign( THREE.EffectComposer.prototype, {
54

M
Mugen87 已提交
55
	swapBuffers: function () {
56 57 58 59 60 61 62

		var tmp = this.readBuffer;
		this.readBuffer = this.writeBuffer;
		this.writeBuffer = tmp;

	},

63 64 65 66
	addPass: function ( pass ) {

		this.passes.push( pass );

67
		var size = this.renderer.getDrawingBufferSize();
68 69
		pass.setSize( size.width, size.height );

70 71
	},

72 73 74 75 76 77
	insertPass: function ( pass, index ) {

		this.passes.splice( index, 0, pass );

	},

78 79
	render: function ( deltaTime ) {

M
Mr.doob 已提交
80 81 82 83 84 85
		// deltaTime value is in seconds

		if ( deltaTime === undefined ) {

			deltaTime = ( Date.now() - this._previousFrameTime ) * 0.001;

86
		}
M
Mr.doob 已提交
87 88

		this._previousFrameTime = Date.now();
89

90 91
		var maskActive = false;

92
		var pass, i, il = this.passes.length;
93 94 95

		for ( i = 0; i < il; i ++ ) {

96
			pass = this.passes[ i ];
97

M
Mr.doob 已提交
98
			if ( pass.enabled === false ) continue;
99

100
			pass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );
101 102

			if ( pass.needsSwap ) {
103

104 105 106 107 108 109
				if ( maskActive ) {

					var context = this.renderer.context;

					context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );

110
					this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );
111 112 113 114 115

					context.stencilFunc( context.EQUAL, 1, 0xffffffff );

				}

116 117 118
				this.swapBuffers();

			}
119

120
			if ( THREE.MaskPass !== undefined ) {
121

122
				if ( pass instanceof THREE.MaskPass ) {
123

124
					maskActive = true;
125

126 127 128 129 130
				} else if ( pass instanceof THREE.ClearMaskPass ) {

					maskActive = false;

				}
131 132 133

			}

134 135 136 137
		}

	},

138 139
	reset: function ( renderTarget ) {

140
		if ( renderTarget === undefined ) {
141

142
			var size = this.renderer.getDrawingBufferSize();
143

M
Mr.doob 已提交
144
			renderTarget = this.renderTarget1.clone();
M
Mugen87 已提交
145
			renderTarget.setSize( size.width, size.height );
146 147 148

		}

D
Daosheng Mu 已提交
149 150
		this.renderTarget1.dispose();
		this.renderTarget2.dispose();
M
Mr.doob 已提交
151
		this.renderTarget1 = renderTarget;
152
		this.renderTarget2 = renderTarget.clone();
153 154 155 156

		this.writeBuffer = this.renderTarget1;
		this.readBuffer = this.renderTarget2;

157 158 159 160
	},

	setSize: function ( width, height ) {

D
Daosheng Mu 已提交
161 162
		this.renderTarget1.setSize( width, height );
		this.renderTarget2.setSize( width, height );
163

164 165
		for ( var i = 0; i < this.passes.length; i ++ ) {

M
Mugen87 已提交
166
			this.passes[ i ].setSize( width, height );
167 168 169

		}

170 171
	}

M
Mr.doob 已提交
172
} );
173 174 175 176


THREE.Pass = function () {

177 178
	// if set to true, the pass is processed by the composer
	this.enabled = true;
179

180 181
	// if set to true, the pass indicates to swap read and write buffer after rendering
	this.needsSwap = true;
182

183 184
	// if set to true, the pass clears its buffer before rendering
	this.clear = false;
185

186 187
	// if set to true, the result of the pass is rendered to screen
	this.renderToScreen = false;
188 189 190

};

M
Mr.doob 已提交
191
Object.assign( THREE.Pass.prototype, {
192

M
Mugen87 已提交
193
	setSize: function ( width, height ) {},
194

195
	render: function ( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {
196

197
		console.error( 'THREE.Pass: .render() must be implemented in derived pass.' );
198

199
	}
200

M
Mr.doob 已提交
201
} );