EquirectangularToCubeGenerator.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /**
  2. * @author Richard M. / https://github.com/richardmonette
  3. */
  4. import {
  5. BackSide,
  6. BoxBufferGeometry,
  7. Mesh,
  8. NoBlending,
  9. PerspectiveCamera,
  10. Scene,
  11. ShaderMaterial,
  12. WebGLRenderTargetCube
  13. } from "../../../build/three.module.js";
  14. var EquirectangularToCubeGenerator = ( function () {
  15. var camera = new PerspectiveCamera( 90, 1, 0.1, 10 );
  16. var scene = new Scene();
  17. var boxMesh = new Mesh( new BoxBufferGeometry( 1, 1, 1 ), getShader() );
  18. boxMesh.material.side = BackSide;
  19. scene.add( boxMesh );
  20. var EquirectangularToCubeGenerator = function ( sourceTexture, options ) {
  21. options = options || {};
  22. this.sourceTexture = sourceTexture;
  23. this.resolution = options.resolution || 512;
  24. this.views = [
  25. { t: [ 1, 0, 0 ], u: [ 0, - 1, 0 ] },
  26. { t: [ - 1, 0, 0 ], u: [ 0, - 1, 0 ] },
  27. { t: [ 0, 1, 0 ], u: [ 0, 0, 1 ] },
  28. { t: [ 0, - 1, 0 ], u: [ 0, 0, - 1 ] },
  29. { t: [ 0, 0, 1 ], u: [ 0, - 1, 0 ] },
  30. { t: [ 0, 0, - 1 ], u: [ 0, - 1, 0 ] },
  31. ];
  32. var params = {
  33. format: options.format || this.sourceTexture.format,
  34. magFilter: this.sourceTexture.magFilter,
  35. minFilter: this.sourceTexture.minFilter,
  36. type: options.type || this.sourceTexture.type,
  37. generateMipmaps: this.sourceTexture.generateMipmaps,
  38. anisotropy: this.sourceTexture.anisotropy,
  39. encoding: this.sourceTexture.encoding
  40. };
  41. this.renderTarget = new WebGLRenderTargetCube( this.resolution, this.resolution, params );
  42. };
  43. EquirectangularToCubeGenerator.prototype = {
  44. constructor: EquirectangularToCubeGenerator,
  45. update: function ( renderer ) {
  46. var currentRenderTarget = renderer.getRenderTarget();
  47. boxMesh.material.uniforms.equirectangularMap.value = this.sourceTexture;
  48. for ( var i = 0; i < 6; i ++ ) {
  49. var v = this.views[ i ];
  50. camera.position.set( 0, 0, 0 );
  51. camera.up.set( v.u[ 0 ], v.u[ 1 ], v.u[ 2 ] );
  52. camera.lookAt( v.t[ 0 ], v.t[ 1 ], v.t[ 2 ] );
  53. renderer.setRenderTarget( this.renderTarget, i );
  54. renderer.clear();
  55. renderer.render( scene, camera );
  56. }
  57. renderer.setRenderTarget( currentRenderTarget );
  58. return this.renderTarget.texture;
  59. },
  60. dispose: function () {
  61. this.renderTarget.dispose();
  62. }
  63. };
  64. function getShader() {
  65. var shaderMaterial = new ShaderMaterial( {
  66. uniforms: {
  67. "equirectangularMap": { value: null },
  68. },
  69. vertexShader:
  70. "varying vec3 localPosition;\n\
  71. \n\
  72. void main() {\n\
  73. localPosition = position;\n\
  74. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\
  75. }",
  76. fragmentShader:
  77. "#include <common>\n\
  78. varying vec3 localPosition;\n\
  79. uniform sampler2D equirectangularMap;\n\
  80. \n\
  81. vec2 EquirectangularSampleUV(vec3 v) {\n\
  82. vec2 uv = vec2(atan(v.z, v.x), asin(v.y));\n\
  83. uv *= vec2(0.1591, 0.3183); // inverse atan\n\
  84. uv += 0.5;\n\
  85. return uv;\n\
  86. }\n\
  87. \n\
  88. void main() {\n\
  89. vec2 uv = EquirectangularSampleUV(normalize(localPosition));\n\
  90. gl_FragColor = texture2D(equirectangularMap, uv);\n\
  91. }",
  92. blending: NoBlending
  93. } );
  94. shaderMaterial.type = 'EquirectangularToCubeGenerator';
  95. return shaderMaterial;
  96. }
  97. return EquirectangularToCubeGenerator;
  98. } )();
  99. export { EquirectangularToCubeGenerator };