webgl_materials_lightmap.html 4.1 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - materials - lightmap</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<style>
			body {
				background:#fff;
				padding:0;
				margin:0;
				overflow:hidden;
				font-family:georgia;
				text-align:center;
			}
			h1 { }
			a { color:skyblue }
		</style>
	</head>

	<body>
M
r76  
Mr.doob 已提交
22
		<script src="../build/three.js"></script>
M
Mr.doob 已提交
23

M
r69  
Mr.doob 已提交
24
		<script src="js/controls/OrbitControls.js"></script>
M
Mr.doob 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

		<script src="js/Detector.js"></script>
		<script src="js/libs/stats.min.js"></script>

		<script type="x-shader/x-vertex" id="vertexShader">

			varying vec3 vWorldPosition;

			void main() {

				vec4 worldPosition = modelMatrix * vec4( position, 1.0 );
				vWorldPosition = worldPosition.xyz;

				gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );

			}

		</script>

		<script type="x-shader/x-fragment" id="fragmentShader">

			uniform vec3 topColor;
			uniform vec3 bottomColor;
			uniform float offset;
			uniform float exponent;

			varying vec3 vWorldPosition;

			void main() {

				float h = normalize( vWorldPosition + offset ).y;
M
r68  
Mr.doob 已提交
56
				gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( max( h, 0.0 ), exponent ), 0.0 ) ), 1.0 );
M
Mr.doob 已提交
57 58 59 60 61 62 63 64 65 66

			}

		</script>

		<script>

			var SCREEN_WIDTH = window.innerWidth;
			var SCREEN_HEIGHT = window.innerHeight;

M
r72  
Mr.doob 已提交
67
			var container, stats;
M
Mr.doob 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
			var camera, scene, renderer;

			var clock = new THREE.Clock();

			init();
			animate();

			function init() {

				container = document.createElement( 'div' );
				document.body.appendChild( container );

				// CAMERA

				camera = new THREE.PerspectiveCamera( 40, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 10000 );
M
r72  
Mr.doob 已提交
83
				camera.position.set( 700, 200, - 500 );
M
Mr.doob 已提交
84 85 86 87 88 89 90

				// SCENE

				scene = new THREE.Scene();

				// CONTROLS

M
r86  
Mr.doob 已提交
91
				var controls = new THREE.OrbitControls( camera );
M
r72  
Mr.doob 已提交
92 93
				controls.maxPolarAngle = 0.9 * Math.PI / 2;
				controls.enableZoom = false;
M
Mr.doob 已提交
94 95 96

				// LIGHTS

M
r73  
Mr.doob 已提交
97 98 99 100 101
				var light = new THREE.DirectionalLight( 0xaabbff, 0.3 );
				light.position.x = 300;
				light.position.y = 250;
				light.position.z = -500;
				scene.add( light );
M
Mr.doob 已提交
102 103 104 105 106 107 108 109 110 111

				// SKYDOME

				var vertexShader = document.getElementById( 'vertexShader' ).textContent;
				var fragmentShader = document.getElementById( 'fragmentShader' ).textContent;
				var uniforms = {
					topColor: 	 { type: "c", value: new THREE.Color( 0x0077ff ) },
					bottomColor: { type: "c", value: new THREE.Color( 0xffffff ) },
					offset:		 { type: "f", value: 400 },
					exponent:	 { type: "f", value: 0.6 }
M
r72  
Mr.doob 已提交
112
				};
M
r73  
Mr.doob 已提交
113
				uniforms.topColor.value.copy( light.color );
M
Mr.doob 已提交
114

M
r92  
Mr.doob 已提交
115
				var skyGeo = new THREE.SphereBufferGeometry( 4000, 32, 15 );
M
r69  
Mr.doob 已提交
116 117 118 119 120 121
				var skyMat = new THREE.ShaderMaterial( {
					uniforms: uniforms,
					vertexShader: vertexShader,
					fragmentShader: fragmentShader,
					side: THREE.BackSide
				} );
M
Mr.doob 已提交
122 123 124 125 126 127

				var sky = new THREE.Mesh( skyGeo, skyMat );
				scene.add( sky );

				// RENDERER

M
r65  
Mr.doob 已提交
128
				renderer = new THREE.WebGLRenderer( { antialias: true } );
M
r70  
Mr.doob 已提交
129
				renderer.setPixelRatio( window.devicePixelRatio );
M
Mr.doob 已提交
130 131 132 133 134 135 136 137 138
				renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
				container.appendChild( renderer.domElement );

				renderer.gammaInput = true;
				renderer.gammaOutput = true;

				// STATS

				stats = new Stats();
M
r76  
Mr.doob 已提交
139
				container.appendChild( stats.dom );
M
Mr.doob 已提交
140 141 142 143

				// MODEL

				var loader = new THREE.JSONLoader();
M
r90  
Mr.doob 已提交
144
				loader.load( "models/json/lightmap/lightmap.json", function ( geometry, materials ) {
M
Mr.doob 已提交
145

M
r72  
Mr.doob 已提交
146 147 148 149 150 151
					for ( var i = 0; i < materials.length; i ++ ) {

						materials[ i ].lightMapIntensity = 0.75;

					}

M
r85  
Mr.doob 已提交
152
					var mesh = new THREE.Mesh( geometry, materials );
M
r72  
Mr.doob 已提交
153

M
r69  
Mr.doob 已提交
154 155 156 157
					mesh.scale.multiplyScalar( 100 );
					scene.add( mesh );

				} );
M
Mr.doob 已提交
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180

				//

				window.addEventListener( 'resize', onWindowResize, false );

			}

			function onWindowResize() {

				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();

				renderer.setSize( window.innerWidth, window.innerHeight );

			}

			//

			function animate() {

				requestAnimationFrame( animate );

				renderer.render( scene, camera );
M
r69  
Mr.doob 已提交
181
				stats.update();
M
Mr.doob 已提交
182 183 184 185 186 187

			}

		</script>

	</body>
M
r72  
Mr.doob 已提交
188

M
Mr.doob 已提交
189
</html>