1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
/**
* @author mrdoob / http://mrdoob.com/
* @author marklundin / http://mark-lundin.com/
* @author alteredq / http://alteredqualia.com/
*/
import {
LinearFilter,
Mesh,
NearestFilter,
OrthographicCamera,
PlaneBufferGeometry,
RGBAFormat,
Scene,
ShaderMaterial,
StereoCamera,
WebGLRenderTarget
} from "../../../build/three.module.js";
var ParallaxBarrierEffect = function ( renderer ) {
var _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
var _scene = new Scene();
var _stereo = new StereoCamera();
var _params = { minFilter: LinearFilter, magFilter: NearestFilter, format: RGBAFormat };
var _renderTargetL = new WebGLRenderTarget( 512, 512, _params );
var _renderTargetR = new WebGLRenderTarget( 512, 512, _params );
var _material = new ShaderMaterial( {
uniforms: {
"mapLeft": { value: _renderTargetL.texture },
"mapRight": { value: _renderTargetR.texture }
},
vertexShader: [
"varying vec2 vUv;",
"void main() {",
" vUv = vec2( uv.x, uv.y );",
" gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
"}"
].join( "\n" ),
fragmentShader: [
"uniform sampler2D mapLeft;",
"uniform sampler2D mapRight;",
"varying vec2 vUv;",
"void main() {",
" vec2 uv = vUv;",
" if ( ( mod( gl_FragCoord.y, 2.0 ) ) > 1.00 ) {",
" gl_FragColor = texture2D( mapLeft, uv );",
" } else {",
" gl_FragColor = texture2D( mapRight, uv );",
" }",
"}"
].join( "\n" )
} );
var mesh = new Mesh( new PlaneBufferGeometry( 2, 2 ), _material );
_scene.add( mesh );
this.setSize = function ( width, height ) {
renderer.setSize( width, height );
var pixelRatio = renderer.getPixelRatio();
_renderTargetL.setSize( width * pixelRatio, height * pixelRatio );
_renderTargetR.setSize( width * pixelRatio, height * pixelRatio );
};
this.render = function ( scene, camera ) {
scene.updateMatrixWorld();
if ( camera.parent === null ) camera.updateMatrixWorld();
_stereo.update( camera );
renderer.setRenderTarget( _renderTargetL );
renderer.clear();
renderer.render( scene, _stereo.cameraL );
renderer.setRenderTarget( _renderTargetR );
renderer.clear();
renderer.render( scene, _stereo.cameraR );
renderer.setRenderTarget( null );
renderer.render( _scene, _camera );
};
};
export { ParallaxBarrierEffect };
|