ParallaxBarrierEffect.js 2.0 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4 5 6 7 8
/**
 * @author mrdoob / http://mrdoob.com/
 * @author marklundin / http://mark-lundin.com/
 * @author alteredq / http://alteredqualia.com/
 */

THREE.ParallaxBarrierEffect = function ( renderer ) {

M
r74  
Mr.doob 已提交
9
	var _camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
M
Mr.doob 已提交
10 11 12

	var _scene = new THREE.Scene();

M
r74  
Mr.doob 已提交
13
	var _stereo = new THREE.StereoCamera();
M
Mr.doob 已提交
14 15 16 17 18 19 20 21 22 23

	var _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };

	var _renderTargetL = new THREE.WebGLRenderTarget( 512, 512, _params );
	var _renderTargetR = new THREE.WebGLRenderTarget( 512, 512, _params );

	var _material = new THREE.ShaderMaterial( {

		uniforms: {

M
r78  
Mr.doob 已提交
24 25
			"mapLeft": { value: _renderTargetL.texture },
			"mapRight": { value: _renderTargetR.texture }
M
Mr.doob 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39

		},

		vertexShader: [

			"varying vec2 vUv;",

			"void main() {",

			"	vUv = vec2( uv.x, uv.y );",
			"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",

			"}"

M
r72  
Mr.doob 已提交
40
		].join( "\n" ),
M
Mr.doob 已提交
41 42 43 44 45 46 47 48 49 50 51

		fragmentShader: [

			"uniform sampler2D mapLeft;",
			"uniform sampler2D mapRight;",
			"varying vec2 vUv;",

			"void main() {",

			"	vec2 uv = vUv;",

M
r63  
Mr.doob 已提交
52
			"	if ( ( mod( gl_FragCoord.y, 2.0 ) ) > 1.00 ) {",
M
Mr.doob 已提交
53 54 55 56 57 58 59 60 61 62 63

			"		gl_FragColor = texture2D( mapLeft, uv );",

			"	} else {",

			"		gl_FragColor = texture2D( mapRight, uv );",

			"	}",

			"}"

M
r72  
Mr.doob 已提交
64
		].join( "\n" )
M
Mr.doob 已提交
65 66 67

	} );

M
r69  
Mr.doob 已提交
68
	var mesh = new THREE.Mesh( new THREE.PlaneBufferGeometry( 2, 2 ), _material );
M
Mr.doob 已提交
69 70 71 72 73 74
	_scene.add( mesh );

	this.setSize = function ( width, height ) {

		renderer.setSize( width, height );

M
r75  
Mr.doob 已提交
75 76 77 78 79
		var pixelRatio = renderer.getPixelRatio();

		_renderTargetL.setSize( width * pixelRatio, height * pixelRatio );
		_renderTargetR.setSize( width * pixelRatio, height * pixelRatio );

M
Mr.doob 已提交
80 81 82 83 84 85
	};

	this.render = function ( scene, camera ) {

		scene.updateMatrixWorld();

M
r72  
Mr.doob 已提交
86
		if ( camera.parent === null ) camera.updateMatrixWorld();
M
Mr.doob 已提交
87

M
r74  
Mr.doob 已提交
88
		_stereo.update( camera );
M
Mr.doob 已提交
89

M
r74  
Mr.doob 已提交
90 91
		renderer.render( scene, _stereo.cameraL, _renderTargetL, true );
		renderer.render( scene, _stereo.cameraR, _renderTargetR, true );
M
Mr.doob 已提交
92 93 94 95 96
		renderer.render( _scene, _camera );

	};

};