CardboardEffect.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.CardboardEffect = function ( renderer ) {
  5. var _camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
  6. var _scene = new THREE.Scene();
  7. var _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };
  8. var _renderTarget = new THREE.WebGLRenderTarget( 512, 512, _params );
  9. _renderTarget.scissorTest = true;
  10. // https://github.com/borismus/webvr-boilerplate/blob/master/src/distortion/barrel-distortion-fragment.js
  11. var _material = new THREE.ShaderMaterial( {
  12. uniforms: {
  13. 'texture': { type: 't', value: _renderTarget },
  14. 'distortion': { type: 'v2', value: new THREE.Vector2( 0.441, 0.156 ) },
  15. 'leftCenter': { type: 'v2', value: new THREE.Vector2( 0.5, 0.5 ) },
  16. 'rightCenter': { type: 'v2', value: new THREE.Vector2( 0.5, 0.5 ) },
  17. 'background': { type: 'v4', value: new THREE.Vector4( 0.0, 0.0, 0.0, 1.0 ) },
  18. },
  19. vertexShader: [
  20. 'varying vec2 vUV;',
  21. 'void main() {',
  22. 'vUV = uv;',
  23. 'gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);',
  24. '}'
  25. ].join( '\n' ),
  26. fragmentShader: [
  27. 'uniform sampler2D texture;',
  28. 'uniform vec2 distortion;',
  29. 'uniform vec2 leftCenter;',
  30. 'uniform vec2 rightCenter;',
  31. 'uniform vec4 background;',
  32. 'varying vec2 vUV;',
  33. 'float poly(float val) {',
  34. 'return 1.0 + (distortion.x + distortion.y * val) * val;',
  35. '}',
  36. 'vec2 barrel(vec2 v, vec2 center) {',
  37. 'vec2 w = v - center;',
  38. 'return poly(dot(w, w)) * w + center;',
  39. '}',
  40. 'void main() {',
  41. 'bool isLeft = (vUV.x < 0.5);',
  42. 'float offset = isLeft ? 0.0 : 0.5;',
  43. 'vec2 a = barrel(vec2((vUV.x - offset) / 0.5, vUV.y), isLeft ? leftCenter : rightCenter);',
  44. 'if (a.x < 0.0 || a.x > 1.0 || a.y < 0.0 || a.y > 1.0) {',
  45. 'gl_FragColor = background;',
  46. '} else {',
  47. 'gl_FragColor = texture2D(texture, vec2(a.x * 0.5 + offset, a.y));',
  48. '}',
  49. '}'
  50. ].join( '\n' )
  51. } );
  52. var mesh = new THREE.Mesh( new THREE.PlaneBufferGeometry( 2, 2 ), _material );
  53. _scene.add( mesh );
  54. this.setSize = function ( width, height ) {
  55. _renderTarget.setSize( width, height );
  56. renderer.setSize( width, height );
  57. };
  58. this.render = function ( scene, camera ) {
  59. if ( camera instanceof THREE.StereoCamera === false ) {
  60. console.error( 'THREE.StereoCamera.render(): camera should now be an insteance of THREE.StereoCamera.' );
  61. return;
  62. }
  63. scene.updateMatrixWorld();
  64. if ( camera.parent === null ) camera.updateMatrixWorld();
  65. var width = _renderTarget.width / 2;
  66. var height = _renderTarget.height;
  67. _renderTarget.scissor.set( 0, 0, width, height );
  68. _renderTarget.viewport.set( 0, 0, width, height );
  69. renderer.render( scene, camera.cameraL, _renderTarget );
  70. _renderTarget.scissor.set( width, 0, width, height );
  71. _renderTarget.viewport.set( width, 0, width, height );
  72. renderer.render( scene, camera.cameraR, _renderTarget );
  73. renderer.render( _scene, _camera );
  74. };
  75. };
粤ICP备19079148号