Browse Source

Examples: Added WebGL PMREM examples.

Mr.doob 4 months ago
parent
commit
5e3cd6c52b

+ 3 - 1
examples/files.json

@@ -160,6 +160,9 @@
 		"webgl_materials_video",
 		"webgl_materials_video_webcam",
 		"webgl_materials_wireframe",
+		"webgl_pmrem_cubemap",
+		"webgl_pmrem_equirectangular",
+		"webgl_pmrem_test",
 		"webgl_math_obb",
 		"webgl_math_orientation_transform",
 		"webgl_mesh_batch",
@@ -573,7 +576,6 @@
 	],
 	"tests": [
 		"webgl_furnace_test",
-		"webgl_pmrem_test",
 		"misc_uv_tests"
 	]
 }

BIN
examples/screenshots/webgl_pmrem_cubemap.jpg


BIN
examples/screenshots/webgl_pmrem_equirectangular.jpg


+ 114 - 0
examples/webgl_pmrem_cubemap.html

@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>three.js webgl - pmrem cubemap</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
+		<link type="text/css" rel="stylesheet" href="example.css">
+	</head>
+	<body>
+
+		<script type="importmap">
+			{
+				"imports": {
+					"three": "../build/three.module.js",
+					"three/addons/": "./jsm/"
+				}
+			}
+		</script>
+
+		<script type="module">
+
+			import * as THREE from 'three';
+
+			import { HDRCubeTextureLoader } from 'three/addons/loaders/HDRCubeTextureLoader.js';
+
+			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
+
+			let camera, scene, renderer;
+
+			init();
+
+			async function init() {
+
+				const container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.25, 20 );
+				camera.position.set( 0, 0, 8 );
+
+				scene = new THREE.Scene();
+
+				renderer = new THREE.WebGLRenderer( { antialias: true } );
+				renderer.setPixelRatio( window.devicePixelRatio );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.setAnimationLoop( render );
+				renderer.toneMapping = THREE.ACESFilmicToneMapping;
+
+				container.appendChild( renderer.domElement );
+
+				const controls = new OrbitControls( camera, renderer.domElement );
+				controls.minDistance = 2;
+				controls.maxDistance = 10;
+				controls.update();
+
+				new HDRCubeTextureLoader()
+					.setPath( './textures/cube/pisaHDR/' )
+					.load( [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ], function ( map ) {
+
+						const pmremGenerator = new THREE.PMREMGenerator( renderer );
+						const envMap = pmremGenerator.fromCubemap( map ).texture;
+
+						scene.background = envMap;
+						scene.backgroundBlurriness = 0.5;
+
+						pmremGenerator.dispose();
+
+						const geometry = new THREE.SphereGeometry( 0.4, 64, 64 );
+
+						for ( let i = 0; i < 6; i ++ ) {
+
+							for ( let j = 0; j < 5; j ++ ) {
+
+								const material = new THREE.MeshPhysicalMaterial( {
+									roughness: i / 5,
+									metalness: j / 4,
+									envMap: envMap
+								} );
+
+								const mesh = new THREE.Mesh( geometry, material );
+								mesh.position.x = i - 2.5;
+								mesh.position.y = j - 2;
+								scene.add( mesh );
+
+							}
+
+						}
+
+					} );
+
+				window.addEventListener( 'resize', onWindowResize );
+
+			}
+
+			function onWindowResize() {
+
+				camera.aspect = window.innerWidth / window.innerHeight;
+				camera.updateProjectionMatrix();
+
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+			}
+
+			//
+
+			function render() {
+
+				renderer.render( scene, camera );
+
+			}
+
+		</script>
+
+	</body>
+</html>

+ 116 - 0
examples/webgl_pmrem_equirectangular.html

@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>three.js webgl - pmrem equirectangular</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
+		<link type="text/css" rel="stylesheet" href="example.css">
+	</head>
+	<body>
+
+		<script type="importmap">
+			{
+				"imports": {
+					"three": "../build/three.module.js",
+					"three/addons/": "./jsm/"
+				}
+			}
+		</script>
+
+		<script type="module">
+
+			import * as THREE from 'three';
+
+			import { HDRLoader } from 'three/addons/loaders/HDRLoader.js';
+
+			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
+
+			let camera, scene, renderer;
+
+			init();
+
+			async function init() {
+
+				const container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.25, 20 );
+				camera.position.set( 0, 0, 8 );
+
+				scene = new THREE.Scene();
+
+				renderer = new THREE.WebGLRenderer( { antialias: true } );
+				renderer.setPixelRatio( window.devicePixelRatio );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.setAnimationLoop( render );
+				renderer.toneMapping = THREE.ACESFilmicToneMapping;
+
+				container.appendChild( renderer.domElement );
+
+				const controls = new OrbitControls( camera, renderer.domElement );
+				controls.minDistance = 2;
+				controls.maxDistance = 10;
+				controls.update();
+
+				new HDRLoader()
+					.setPath( 'textures/equirectangular/' )
+					.load( 'royal_esplanade_1k.hdr', function ( map ) {
+
+						map.mapping = THREE.EquirectangularReflectionMapping;
+
+						const pmremGenerator = new THREE.PMREMGenerator( renderer );
+						const envMap = pmremGenerator.fromEquirectangular( map ).texture;
+
+						scene.background = envMap;
+						scene.backgroundBlurriness = 0.5;
+
+						pmremGenerator.dispose();
+
+						const geometry = new THREE.SphereGeometry( 0.4, 64, 64 );
+
+						for ( let i = 0; i < 6; i ++ ) {
+
+							for ( let j = 0; j < 5; j ++ ) {
+
+								const material = new THREE.MeshPhysicalMaterial( {
+									roughness: i / 5,
+									metalness: j / 4,
+									envMap: envMap
+								} );
+
+								const mesh = new THREE.Mesh( geometry, material );
+								mesh.position.x = i - 2.5;
+								mesh.position.y = j - 2;
+								scene.add( mesh );
+
+							}
+
+						}
+
+					} );
+
+				window.addEventListener( 'resize', onWindowResize );
+
+			}
+
+			function onWindowResize() {
+
+				camera.aspect = window.innerWidth / window.innerHeight;
+				camera.updateProjectionMatrix();
+
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+			}
+
+			//
+
+			function render() {
+
+				renderer.render( scene, camera );
+
+			}
+
+		</script>
+
+	</body>
+</html>

粤ICP备19079148号