webgl_materials_envmaps.html 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>three.js webgl - materials - environment maps</title>
  5. <meta charset="utf-8">
  6. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  7. <style>
  8. body {
  9. background:#000;
  10. color:#fff;
  11. padding:0;
  12. margin:0;
  13. overflow:hidden;
  14. font-family:georgia;
  15. text-align:center;
  16. }
  17. a { color:skyblue; text-decoration:none }
  18. #info {
  19. position: absolute;
  20. width: 100%;
  21. }
  22. </style>
  23. </head>
  24. <body>
  25. <script src="../build/three.js"></script>
  26. <script src="js/controls/OrbitControls.js"></script>
  27. <script src="js/libs/dat.gui.min.js"></script>
  28. <div id="info">
  29. <a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> - webgl environment mapping example<br/>
  30. Equirectangular Map by <a href="http://gl.ict.usc.edu/Data/HighResProbes/">University of Southern California</a><br/>
  31. Spherical Map by <a href="http://www.pauldebevec.com/Probes/">Paul Debevec</a>
  32. </div>
  33. <script>
  34. var controls, camera, scene, renderer;
  35. var cameraCube, sceneCube;
  36. var textureEquirec, textureCube, textureSphere;
  37. var cubeMesh, sphereMesh;
  38. var sphereMaterial;
  39. init();
  40. animate();
  41. function init() {
  42. // CAMERAS
  43. camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 100000 );
  44. camera.position.set( 0, 0, 1000 );
  45. cameraCube = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 100000 );
  46. // SCENE
  47. scene = new THREE.Scene();
  48. sceneCube = new THREE.Scene();
  49. // Lights
  50. var ambient = new THREE.AmbientLight( 0xffffff );
  51. scene.add( ambient );
  52. // Textures
  53. var r = "textures/cube/Bridge2/";
  54. var urls = [ r + "posx.jpg", r + "negx.jpg",
  55. r + "posy.jpg", r + "negy.jpg",
  56. r + "posz.jpg", r + "negz.jpg" ];
  57. textureCube = new THREE.CubeTextureLoader().load( urls );
  58. textureCube.format = THREE.RGBFormat;
  59. textureCube.mapping = THREE.CubeReflectionMapping;
  60. textureCube.encoding = THREE.sRGBEncoding;
  61. var textureLoader = new THREE.TextureLoader();
  62. textureEquirec = textureLoader.load( "textures/2294472375_24a3b8ef46_o.jpg" );
  63. textureEquirec.mapping = THREE.EquirectangularReflectionMapping;
  64. textureEquirec.magFilter = THREE.LinearFilter;
  65. textureEquirec.minFilter = THREE.LinearMipMapLinearFilter;
  66. textureEquirec.encoding = THREE.sRGBEncoding;
  67. textureSphere = textureLoader.load( "textures/metal.jpg" );
  68. textureSphere.mapping = THREE.SphericalReflectionMapping;
  69. textureSphere.encoding = THREE.sRGBEncoding;
  70. // Materials
  71. var equirectShader = THREE.ShaderLib[ "equirect" ];
  72. var equirectMaterial = new THREE.ShaderMaterial( {
  73. fragmentShader: equirectShader.fragmentShader,
  74. vertexShader: equirectShader.vertexShader,
  75. uniforms: equirectShader.uniforms,
  76. depthWrite: false,
  77. side: THREE.BackSide
  78. } );
  79. equirectMaterial.uniforms[ "tEquirect" ].value = textureEquirec;
  80. // enable code injection for non-built-in material
  81. Object.defineProperty( equirectMaterial, 'map', {
  82. get: function () {
  83. return this.uniforms.tEquirect.value;
  84. }
  85. } );
  86. var cubeShader = THREE.ShaderLib[ "cube" ];
  87. var cubeMaterial = new THREE.ShaderMaterial( {
  88. fragmentShader: cubeShader.fragmentShader,
  89. vertexShader: cubeShader.vertexShader,
  90. uniforms: cubeShader.uniforms,
  91. depthWrite: false,
  92. side: THREE.BackSide
  93. } );
  94. cubeMaterial.uniforms[ "tCube" ].value = textureCube;
  95. Object.defineProperty( cubeMaterial, 'map', {
  96. get: function () {
  97. return this.uniforms.tCube.value;
  98. }
  99. } );
  100. // Skybox
  101. cubeMesh = new THREE.Mesh( new THREE.BoxBufferGeometry( 100, 100, 100 ), cubeMaterial );
  102. sceneCube.add( cubeMesh );
  103. //
  104. var geometry = new THREE.SphereBufferGeometry( 400.0, 48, 24 );
  105. sphereMaterial = new THREE.MeshLambertMaterial( { envMap: textureCube } );
  106. sphereMesh = new THREE.Mesh( geometry, sphereMaterial );
  107. scene.add( sphereMesh );
  108. //
  109. renderer = new THREE.WebGLRenderer();
  110. renderer.autoClear = false;
  111. renderer.setPixelRatio( window.devicePixelRatio );
  112. renderer.setSize( window.innerWidth, window.innerHeight );
  113. document.body.appendChild( renderer.domElement );
  114. renderer.gammaOutput = true;
  115. //
  116. controls = new THREE.OrbitControls( camera, renderer.domElement );
  117. controls.minDistance = 500;
  118. controls.maxDistance = 2500;
  119. //
  120. var params = {
  121. Cube: function () {
  122. cubeMesh.material = cubeMaterial;
  123. cubeMesh.visible = true;
  124. sphereMaterial.envMap = textureCube;
  125. sphereMaterial.needsUpdate = true;
  126. },
  127. Equirectangular: function () {
  128. cubeMesh.material = equirectMaterial;
  129. cubeMesh.visible = true;
  130. sphereMaterial.envMap = textureEquirec;
  131. sphereMaterial.needsUpdate = true;
  132. },
  133. Spherical: function () {
  134. cubeMesh.visible = false;
  135. sphereMaterial.envMap = textureSphere;
  136. sphereMaterial.needsUpdate = true;
  137. },
  138. Refraction: false
  139. };
  140. var gui = new dat.GUI();
  141. gui.add( params, 'Cube' );
  142. gui.add( params, 'Equirectangular' );
  143. gui.add( params, 'Spherical' );
  144. gui.add( params, 'Refraction' ).onChange( function ( value ) {
  145. if ( value ) {
  146. textureEquirec.mapping = THREE.EquirectangularRefractionMapping;
  147. textureCube.mapping = THREE.CubeRefractionMapping;
  148. } else {
  149. textureEquirec.mapping = THREE.EquirectangularReflectionMapping;
  150. textureCube.mapping = THREE.CubeReflectionMapping;
  151. }
  152. sphereMaterial.needsUpdate = true;
  153. } );
  154. gui.open();
  155. window.addEventListener( 'resize', onWindowResize, false );
  156. }
  157. function onWindowResize() {
  158. camera.aspect = window.innerWidth / window.innerHeight;
  159. camera.updateProjectionMatrix();
  160. cameraCube.aspect = window.innerWidth / window.innerHeight;
  161. cameraCube.updateProjectionMatrix();
  162. renderer.setSize( window.innerWidth, window.innerHeight );
  163. }
  164. //
  165. function animate() {
  166. requestAnimationFrame( animate );
  167. render();
  168. }
  169. function render() {
  170. camera.lookAt( scene.position );
  171. cameraCube.rotation.copy( camera.rotation );
  172. renderer.render( sceneCube, cameraCube );
  173. renderer.render( scene, camera );
  174. }
  175. </script>
  176. </body>
  177. </html>