ParallaxBarrierEffect.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. THREE.ParallaxBarrierEffect = function ( renderer ) {
  2. var _camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
  3. var _scene = new THREE.Scene();
  4. var _stereo = new THREE.StereoCamera();
  5. var _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };
  6. var _renderTargetL = new THREE.WebGLRenderTarget( 512, 512, _params );
  7. var _renderTargetR = new THREE.WebGLRenderTarget( 512, 512, _params );
  8. var _material = new THREE.ShaderMaterial( {
  9. uniforms: {
  10. 'mapLeft': { value: _renderTargetL.texture },
  11. 'mapRight': { value: _renderTargetR.texture }
  12. },
  13. vertexShader: [
  14. 'varying vec2 vUv;',
  15. 'void main() {',
  16. ' vUv = vec2( uv.x, uv.y );',
  17. ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',
  18. '}'
  19. ].join( '\n' ),
  20. fragmentShader: [
  21. 'uniform sampler2D mapLeft;',
  22. 'uniform sampler2D mapRight;',
  23. 'varying vec2 vUv;',
  24. 'void main() {',
  25. ' vec2 uv = vUv;',
  26. ' if ( ( mod( gl_FragCoord.y, 2.0 ) ) > 1.00 ) {',
  27. ' gl_FragColor = texture2D( mapLeft, uv );',
  28. ' } else {',
  29. ' gl_FragColor = texture2D( mapRight, uv );',
  30. ' }',
  31. '}'
  32. ].join( '\n' )
  33. } );
  34. var mesh = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), _material );
  35. _scene.add( mesh );
  36. this.setSize = function ( width, height ) {
  37. renderer.setSize( width, height );
  38. var pixelRatio = renderer.getPixelRatio();
  39. _renderTargetL.setSize( width * pixelRatio, height * pixelRatio );
  40. _renderTargetR.setSize( width * pixelRatio, height * pixelRatio );
  41. };
  42. this.render = function ( scene, camera ) {
  43. scene.updateMatrixWorld();
  44. if ( camera.parent === null ) camera.updateMatrixWorld();
  45. _stereo.update( camera );
  46. renderer.setRenderTarget( _renderTargetL );
  47. renderer.clear();
  48. renderer.render( scene, _stereo.cameraL );
  49. renderer.setRenderTarget( _renderTargetR );
  50. renderer.clear();
  51. renderer.render( scene, _stereo.cameraR );
  52. renderer.setRenderTarget( null );
  53. renderer.render( _scene, _camera );
  54. };
  55. };