AnaglyphEffect.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. * @author marklundin / http://mark-lundin.com/
  4. * @author alteredq / http://alteredqualia.com/
  5. */
  6. THREE.AnaglyphEffect = function ( renderer, width, height ) {
  7. var _camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
  8. var _scene = new THREE.Scene();
  9. var _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };
  10. if ( width === undefined ) width = 512;
  11. if ( height === undefined ) height = 512;
  12. var _renderTargetL = new THREE.WebGLRenderTarget( width, height, _params );
  13. var _renderTargetR = new THREE.WebGLRenderTarget( width, height, _params );
  14. var _material = new THREE.ShaderMaterial( {
  15. uniforms: {
  16. "mapLeft": { type: "t", value: _renderTargetL },
  17. "mapRight": { type: "t", value: _renderTargetR }
  18. },
  19. vertexShader: [
  20. "varying vec2 vUv;",
  21. "void main() {",
  22. " vUv = vec2( uv.x, uv.y );",
  23. " gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
  24. "}"
  25. ].join( "\n" ),
  26. fragmentShader: [
  27. "uniform sampler2D mapLeft;",
  28. "uniform sampler2D mapRight;",
  29. "varying vec2 vUv;",
  30. "void main() {",
  31. " vec4 colorL, colorR;",
  32. " vec2 uv = vUv;",
  33. " colorL = texture2D( mapLeft, uv );",
  34. " colorR = texture2D( mapRight, uv );",
  35. // http://3dtv.at/Knowhow/AnaglyphComparison_en.aspx
  36. " gl_FragColor = vec4( colorL.g * 0.7 + colorL.b * 0.3, colorR.g, colorR.b, colorL.a + colorR.a ) * 1.1;",
  37. "}"
  38. ].join( "\n" )
  39. } );
  40. var mesh = new THREE.Mesh( new THREE.PlaneBufferGeometry( 2, 2 ), _material );
  41. _scene.add( mesh );
  42. this.setSize = function ( width, height ) {
  43. _renderTargetL.setSize( width, height );
  44. _renderTargetR.setSize( width, height );
  45. renderer.setSize( width, height );
  46. };
  47. this.render = function ( scene, camera ) {
  48. if ( camera instanceof THREE.StereoCamera === false ) {
  49. console.error( 'THREE.StereoCamera.render(): camera should now be an insteance of THREE.StereoCamera.' );
  50. return;
  51. }
  52. scene.updateMatrixWorld();
  53. if ( camera.parent === null ) camera.updateMatrixWorld();
  54. renderer.render( scene, camera.cameraL, _renderTargetL, true );
  55. renderer.render( scene, camera.cameraR, _renderTargetR, true );
  56. renderer.render( _scene, _camera );
  57. };
  58. this.dispose = function() {
  59. if ( _renderTargetL ) _renderTargetL.dispose();
  60. if ( _renderTargetR ) _renderTargetR.dispose();
  61. };
  62. };