webgl_materials_skin.html 7.8 KB
Newer Older
M
Mr.doob 已提交
1
<!DOCTYPE html>
2 3 4 5
<html lang="en">
	<head>
		<title>three.js webgl - materials - skin [Lee Perry-Smith]</title>
		<meta charset="utf-8">
6
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
M
Mr.doob 已提交
7
		<link type="text/css" rel="stylesheet" href="main.css">
8 9 10 11
	</head>
	<body>

		<div id="info">
M
Mr.doob 已提交
12
			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> - webgl skin rendering demo.<br/>
13
			<a href="http://graphics.cs.williams.edu/data/meshes.xml#14" target="_blank" rel="noopener">Lee Perry-Smith</a> head.
14 15
		</div>

M
Mugen87 已提交
16
		<script type="module">
17

M
Mr.doob 已提交
18
			import * as THREE from '../build/three.module.js';
M
Mugen87 已提交
19 20 21 22 23 24 25 26 27 28 29

			import Stats from './jsm/libs/stats.module.js';

			import { GLTFLoader } from './jsm/loaders/GLTFLoader.js';
			import { EffectComposer } from './jsm/postprocessing/EffectComposer.js';
			import { RenderPass } from './jsm/postprocessing/RenderPass.js';
			import { ShaderPass } from './jsm/postprocessing/ShaderPass.js';
			import { BloomPass } from './jsm/postprocessing/BloomPass.js';
			import { TexturePass } from './jsm/postprocessing/TexturePass.js';

			import { SkinShaderAdvanced, SkinShaderBeckmann } from './jsm/shaders/SkinShader.js';
30

31
			var statsEnabled = true;
32 33 34 35 36 37 38

			var container, stats, loader;

			var camera, scene, renderer;

			var mesh;

39
			var composer, composerUV1, composerUV2, composerUV3, composerBeckmann;
40

L
Lewy Blue 已提交
41
			var directionalLight;
42 43 44 45 46 47 48

			var mouseX = 0, mouseY = 0;
			var targetX = 0, targetY = 0;

			var windowHalfX = window.innerWidth / 2;
			var windowHalfY = window.innerHeight / 2;

49 50
			var firstPass = true;

51 52 53 54 55 56 57 58
			init();
			animate();

			function init() {

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

M
Mr.doob 已提交
59
				camera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 1, 10000 );
60
				camera.position.z = 900;
61

M
Mr.doob 已提交
62 63
				scene = new THREE.Scene();
				scene.background = new THREE.Color( 0x050505 );
64 65 66

				// LIGHTS

M
Mr.doob 已提交
67
				directionalLight = new THREE.DirectionalLight( 0xffeedd, 1.5 );
M
Mr.doob 已提交
68
				directionalLight.position.set( 1, 0.5, 1 );
69
				scene.add( directionalLight );
70

M
Mr.doob 已提交
71
				directionalLight = new THREE.DirectionalLight( 0xddddff, 0.5 );
L
Lewy Blue 已提交
72
				directionalLight.position.set( - 1, 0.5, - 1 );
73 74 75 76
				scene.add( directionalLight );

				// MATERIALS

L
Lewy Blue 已提交
77
				var diffuse = 0xbbbbbb, specular = 0x555555;
78

M
Mugen87 已提交
79
				var shader = SkinShaderAdvanced;
80

M
Mr.doob 已提交
81
				var uniformsUV = THREE.UniformsUtils.clone( shader.uniforms );
82

M
Mr.doob 已提交
83
				var textureLoader = new THREE.TextureLoader();
84

85
				uniformsUV[ "tNormal" ].value = textureLoader.load( "models/gltf/LeePerrySmith/Infinite-Level_02_Tangent_SmoothUV.jpg" );
L
Lewy Blue 已提交
86
				uniformsUV[ "uNormalScale" ].value = - 1.5;
87

88
				uniformsUV[ "tDiffuse" ].value = textureLoader.load( "models/gltf/LeePerrySmith/Map-COL.jpg" );
89 90 91

				uniformsUV[ "passID" ].value = 0;

B
Ben Houston 已提交
92 93
				uniformsUV[ "diffuse" ].value.setHex( diffuse );
				uniformsUV[ "specular" ].value.setHex( specular );
94

95
				uniformsUV[ "uRoughness" ].value = 0.185;
96
				uniformsUV[ "uSpecularBrightness" ].value = 0.7;
97

98

M
Mr.doob 已提交
99
				var uniforms = THREE.UniformsUtils.clone( uniformsUV );
100 101 102 103
				uniforms[ "tDiffuse" ].value = uniformsUV[ "tDiffuse" ].value;
				uniforms[ "tNormal" ].value = uniformsUV[ "tNormal" ].value;
				uniforms[ "passID" ].value = 1;

104

105 106
				var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true };
				var parametersUV = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShaderUV, uniforms: uniformsUV, lights: true };
107

M
Mr.doob 已提交
108
				var material = new THREE.ShaderMaterial( parameters );
109 110
				material.extensions.derivatives = true;

M
Mr.doob 已提交
111
				var materialUV = new THREE.ShaderMaterial( parametersUV );
112
				materialUV.extensions.derivatives = true;
113 114 115

				// LOADER

M
Mugen87 已提交
116
				loader = new GLTFLoader();
L
Lewy Blue 已提交
117
				loader.load( "models/gltf/LeePerrySmith/LeePerrySmith.glb", function ( gltf ) {
M
Mr.doob 已提交
118

119
					createScene( gltf.scene.children[ 0 ].geometry, 100, material );
M
Mr.doob 已提交
120 121

				} );
122 123 124

				// RENDERER

M
Mr.doob 已提交
125
				renderer = new THREE.WebGLRenderer();
126
				renderer.setPixelRatio( window.devicePixelRatio );
T
tschw 已提交
127
				renderer.setSize( window.innerWidth, window.innerHeight );
128 129 130 131 132 133 134 135 136
				renderer.autoClear = false;

				container.appendChild( renderer.domElement );

				// STATS

				if ( statsEnabled ) {

					stats = new Stats();
M
Mr.doob 已提交
137
					container.appendChild( stats.dom );
138 139 140 141 142 143 144 145 146

				}

				// EVENTS

				document.addEventListener( 'mousemove', onDocumentMouseMove, false );

				// POSTPROCESSING

M
Mr.doob 已提交
147
				var renderModelUV = new RenderPass( scene, camera, materialUV, new THREE.Color( 0x575757 ) );
148

M
Mugen87 已提交
149 150 151
				var effectBloom1 = new BloomPass( 1, 15, 2, 512 );
				var effectBloom2 = new BloomPass( 1, 25, 3, 512 );
				var effectBloom3 = new BloomPass( 1, 25, 4, 512 );
152 153 154 155 156 157 158

				effectBloom1.clear = true;
				effectBloom2.clear = true;
				effectBloom3.clear = true;

				//

M
Mr.doob 已提交
159
				var pars = {
160
					generateMipmaps: true,
W
WestLangley 已提交
161
					minFilter: THREE.LinearMipmapLinearFilter,
M
Mr.doob 已提交
162 163
					magFilter: THREE.LinearFilter,
					format: THREE.RGBFormat,
M
Mr.doob 已提交
164 165 166
					stencilBuffer: false
				};

167 168 169 170 171
				var rtwidth = 512;
				var rtheight = 512;

				//

M
Mr.doob 已提交
172
				composer = new EffectComposer( renderer, new THREE.WebGLRenderTarget( rtwidth, rtheight, pars ) );
M
Mr.doob 已提交
173
				composer.addPass( renderModelUV );
174
				composer.renderToScreen = false;
175

M
Mugen87 已提交
176
				var renderScene = new TexturePass( composer.renderTarget2.texture );
177 178 179

				//

M
Mr.doob 已提交
180
				composerUV1 = new EffectComposer( renderer, new THREE.WebGLRenderTarget( rtwidth, rtheight, pars ) );
181 182 183

				composerUV1.addPass( renderScene );
				composerUV1.addPass( effectBloom1 );
184
				composerUV1.renderToScreen = false;
185

M
Mr.doob 已提交
186
				composerUV2 = new EffectComposer( renderer, new THREE.WebGLRenderTarget( rtwidth, rtheight, pars ) );
187 188 189

				composerUV2.addPass( renderScene );
				composerUV2.addPass( effectBloom2 );
190
				composerUV2.renderToScreen = false;
191

M
Mr.doob 已提交
192
				composerUV3 = new EffectComposer( renderer, new THREE.WebGLRenderTarget( rtwidth, rtheight, pars ) );
193 194 195

				composerUV3.addPass( renderScene );
				composerUV3.addPass( effectBloom3 );
196
				composerUV3.renderToScreen = false;
197 198 199

				//

M
Mugen87 已提交
200
				var effectBeckmann = new ShaderPass( SkinShaderBeckmann );
M
Mr.doob 已提交
201
				composerBeckmann = new EffectComposer( renderer, new THREE.WebGLRenderTarget( rtwidth, rtheight, pars ) );
202 203 204 205
				composerBeckmann.addPass( effectBeckmann );

				//

M
Mr.doob 已提交
206
				uniforms[ "tBlur1" ].value = composer.renderTarget2.texture;
207 208 209
				uniforms[ "tBlur2" ].value = composerUV1.renderTarget2.texture;
				uniforms[ "tBlur3" ].value = composerUV2.renderTarget2.texture;
				uniforms[ "tBlur4" ].value = composerUV3.renderTarget2.texture;
210

211
				uniforms[ "tBeckmann" ].value = composerBeckmann.renderTarget1.texture;
212

A
alteredq 已提交
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
				//

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

			}

			function onWindowResize() {

				windowHalfX = window.innerWidth / 2;
				windowHalfY = window.innerHeight / 2;

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

				renderer.setSize( window.innerWidth, window.innerHeight );
228 229 230 231 232

			}

			function createScene( geometry, scale, material ) {

M
Mr.doob 已提交
233
				mesh = new THREE.Mesh( geometry, material );
234 235 236 237 238 239 240
				mesh.position.y = - 50;
				mesh.scale.set( scale, scale, scale );

				scene.add( mesh );

			}

241
			function onDocumentMouseMove( event ) {
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272

				mouseX = ( event.clientX - windowHalfX );
				mouseY = ( event.clientY - windowHalfY );

			}

			//

			function animate() {

				requestAnimationFrame( animate );

				render();
				if ( statsEnabled ) stats.update();

			}

			function render() {

				targetX = mouseX * .001;
				targetY = mouseY * .001;

				if ( mesh ) {

					mesh.rotation.y += 0.05 * ( targetX - mesh.rotation.y );
					mesh.rotation.x += 0.05 * ( targetY - mesh.rotation.x );

				}

				renderer.clear();

273 274 275 276 277 278
				if ( firstPass ) {

					composerBeckmann.render();
					firstPass = false;

				}
279

M
Mr.doob 已提交
280
				composer.render();
281 282 283 284 285 286 287 288 289 290 291 292 293

				composerUV1.render();
				composerUV2.render();
				composerUV3.render();

				renderer.render( scene, camera );

			}

		</script>

	</body>
</html>