EffectComposer.js 2.8 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

11 12 13 14
		var pixelRatio = renderer.getPixelRatio();

		var width  = Math.floor( renderer.context.canvas.width  / pixelRatio ) || 1;
		var height = Math.floor( renderer.context.canvas.height / pixelRatio ) || 1;
15
		var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false };
16

17
		renderTarget = new THREE.WebGLRenderTarget( width, height, parameters );
18 19 20

	}

21 22
	this.renderTarget1 = renderTarget;
	this.renderTarget2 = renderTarget.clone();
23 24 25 26

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

27 28
	this.passes = [];

29
	if ( THREE.CopyShader === undefined )
30
		console.error( "THREE.EffectComposer relies on THREE.CopyShader" );
31

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

34 35 36 37
};

THREE.EffectComposer.prototype = {

38 39 40 41 42 43 44 45
	swapBuffers: function() {

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

	},

46 47 48 49 50 51
	addPass: function ( pass ) {

		this.passes.push( pass );

	},

52 53 54 55 56 57
	insertPass: function ( pass, index ) {

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

	},

58 59
	render: function ( delta ) {

60 61 62 63 64
		this.writeBuffer = this.renderTarget1;
		this.readBuffer = this.renderTarget2;

		var maskActive = false;

65
		var pass, i, il = this.passes.length;
66 67 68

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

69
			pass = this.passes[ i ];
70

71 72 73 74 75
			if ( !pass.enabled ) continue;

			pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );

			if ( pass.needsSwap ) {
76

77 78 79 80 81 82 83 84 85 86 87 88
				if ( maskActive ) {

					var context = this.renderer.context;

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

					this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );

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

				}

89 90 91
				this.swapBuffers();

			}
92

93
			if ( pass instanceof THREE.MaskPass ) {
94 95 96

				maskActive = true;

97
			} else if ( pass instanceof THREE.ClearMaskPass ) {
98 99 100 101 102

				maskActive = false;

			}

103 104 105 106
		}

	},

107 108
	reset: function ( renderTarget ) {

109
		if ( renderTarget === undefined ) {
110

111
			renderTarget = this.renderTarget1.clone();
112

113
			var pixelRatio = this.renderer.getPixelRatio();
114 115 116

			renderTarget.width  = Math.floor( this.renderer.context.canvas.width  / pixelRatio );
			renderTarget.height = Math.floor( this.renderer.context.canvas.height / pixelRatio );
117 118 119

		}

120 121
		this.renderTarget1 = renderTarget;
		this.renderTarget2 = renderTarget.clone();
122 123 124 125

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

126 127 128 129 130 131 132 133 134 135 136
	},

	setSize: function ( width, height ) {

		var renderTarget = this.renderTarget1.clone();

		renderTarget.width = width;
		renderTarget.height = height;

		this.reset( renderTarget );

137 138 139
	}

};