ShaderUtils.js 11.8 KB
Newer Older
1 2 3
/**
 * @author alteredq / http://alteredqualia.com/
 * @author mr.doob / http://mrdoob.com/
4
 *
5 6
 * ShaderUtils currently contains:
 *
7 8 9
 *	fresnel
 *	normal
 * 	cube
10
 *
11
 */
M
Mr.doob 已提交
12

M
Mr.doob 已提交
13 14
if ( THREE.WebGLRenderer ) {

15 16 17 18
THREE.ShaderUtils = {

	lib: {

19
		/* -------------------------------------------------------------------------
A
alteredq 已提交
20 21
		//	Fresnel shader
		//	- based on Nvidia Cg tutorial
22
		 ------------------------------------------------------------------------- */
23

24
		'fresnel': {
M
Mr.doob 已提交
25

26
			uniforms: {
M
Mr.doob 已提交
27

28 29 30 31 32
				"mRefractionRatio": { type: "f", value: 1.02 },
				"mFresnelBias": { type: "f", value: 0.1 },
				"mFresnelPower": { type: "f", value: 2.0 },
				"mFresnelScale": { type: "f", value: 1.0 },
				"tCube": { type: "t", value: 1, texture: null }
M
Mr.doob 已提交
33

34 35 36 37 38
			},

			fragmentShader: [

				"uniform samplerCube tCube;",
M
Mr.doob 已提交
39

40 41 42
				"varying vec3 vReflect;",
				"varying vec3 vRefract[3];",
				"varying float vReflectionFactor;",
M
Mr.doob 已提交
43

44
				"void main() {",
M
Mr.doob 已提交
45

46 47
					"vec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );",
					"vec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );",
M
Mr.doob 已提交
48

49 50 51 52
					"refractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;",
					"refractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;",
					"refractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;",
					"refractedColor.a = 1.0;",
M
Mr.doob 已提交
53

54
					"gl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );",
M
Mr.doob 已提交
55

56
				"}"
M
Mr.doob 已提交
57

58
			].join("\n"),
M
Mr.doob 已提交
59

60
			vertexShader: [
M
Mr.doob 已提交
61

62 63 64 65
				"uniform float mRefractionRatio;",
				"uniform float mFresnelBias;",
				"uniform float mFresnelScale;",
				"uniform float mFresnelPower;",
M
Mr.doob 已提交
66

67 68 69
				"varying vec3 vReflect;",
				"varying vec3 vRefract[3];",
				"varying float vReflectionFactor;",
M
Mr.doob 已提交
70

71
				"void main() {",
M
Mr.doob 已提交
72

73 74
					"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
M
Mr.doob 已提交
75

76
					"vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );",
M
Mr.doob 已提交
77

78
					"vec3 I = mPosition.xyz - cameraPosition;",
M
Mr.doob 已提交
79

80 81 82 83 84
					"vReflect = reflect( I, nWorld );",
					"vRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );",
					"vRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );",
					"vRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );",
					"vReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );",
M
Mr.doob 已提交
85

86 87 88 89 90
					"gl_Position = projectionMatrix * mvPosition;",

				"}"

			].join("\n")
M
Mr.doob 已提交
91

92
		},
M
Mr.doob 已提交
93

94
		/* -------------------------------------------------------------------------
95 96
		//	Normal map shader
		//		- Blinn-Phong
A
alteredq 已提交
97
		//		- normal + diffuse + specular + AO + displacement + reflection + shadow maps
M
Mr.doob 已提交
98
		//		- point and directional lights (use with "lights: true" material option)
99
		 ------------------------------------------------------------------------- */
100

101
		'normal' : {
M
Mr.doob 已提交
102

M
Mr.doob 已提交
103 104
			uniforms: THREE.UniformsUtils.merge( [

A
alteredq 已提交
105
				THREE.UniformsLib[ "fog" ],
M
Mr.doob 已提交
106
				THREE.UniformsLib[ "lights" ],
107
				THREE.UniformsLib[ "shadowmap" ],
M
Mr.doob 已提交
108 109

				{
M
Mr.doob 已提交
110

A
alteredq 已提交
111 112 113 114
				"enableAO"		  : { type: "i", value: 0 },
				"enableDiffuse"	  : { type: "i", value: 0 },
				"enableSpecular"  : { type: "i", value: 0 },
				"enableReflection": { type: "i", value: 0 },
M
Mr.doob 已提交
115

A
alteredq 已提交
116 117 118 119 120 121
				"tDiffuse"	   : { type: "t", value: 0, texture: null },
				"tCube"		   : { type: "t", value: 1, texture: null },
				"tNormal"	   : { type: "t", value: 2, texture: null },
				"tSpecular"	   : { type: "t", value: 3, texture: null },
				"tAO"		   : { type: "t", value: 4, texture: null },
				"tDisplacement": { type: "t", value: 5, texture: null },
M
Mr.doob 已提交
122

123
				"uNormalScale": { type: "f", value: 1.0 },
M
Mr.doob 已提交
124

M
Mr.doob 已提交
125 126
				"uDisplacementBias": { type: "f", value: 0.0 },
				"uDisplacementScale": { type: "f", value: 1.0 },
M
Mr.doob 已提交
127

128 129 130
				"uDiffuseColor": { type: "c", value: new THREE.Color( 0xeeeeee ) },
				"uSpecularColor": { type: "c", value: new THREE.Color( 0x111111 ) },
				"uAmbientColor": { type: "c", value: new THREE.Color( 0x050505 ) },
M
Mr.doob 已提交
131
				"uShininess": { type: "f", value: 30 },
132 133
				"uOpacity": { type: "f", value: 1 },

A
alteredq 已提交
134 135
				"uReflectivity": { type: "f", value: 0.5 },

136 137
				"uOffset" : { type: "v2", value: new THREE.Vector2( 0, 0 ) },
				"uRepeat" : { type: "v2", value: new THREE.Vector2( 1, 1 ) }
M
Mr.doob 已提交
138

M
Mr.doob 已提交
139
				}
M
Mr.doob 已提交
140

M
Mr.doob 已提交
141
			] ),
M
Mr.doob 已提交
142

M
Mr.doob 已提交
143
			fragmentShader: [
M
Mr.doob 已提交
144

145 146 147 148
				"uniform vec3 uAmbientColor;",
				"uniform vec3 uDiffuseColor;",
				"uniform vec3 uSpecularColor;",
				"uniform float uShininess;",
M
Mr.doob 已提交
149
				"uniform float uOpacity;",
M
Mr.doob 已提交
150

151
				"uniform bool enableDiffuse;",
152
				"uniform bool enableSpecular;",
153
				"uniform bool enableAO;",
A
alteredq 已提交
154
				"uniform bool enableReflection;",
M
Mr.doob 已提交
155

156 157
				"uniform sampler2D tDiffuse;",
				"uniform sampler2D tNormal;",
158
				"uniform sampler2D tSpecular;",
159
				"uniform sampler2D tAO;",
M
Mr.doob 已提交
160

A
alteredq 已提交
161 162
				"uniform samplerCube tCube;",

163
				"uniform float uNormalScale;",
A
alteredq 已提交
164
				"uniform float uReflectivity;",
M
Mr.doob 已提交
165

166 167 168 169
				"varying vec3 vTangent;",
				"varying vec3 vBinormal;",
				"varying vec3 vNormal;",
				"varying vec2 vUv;",
M
Mr.doob 已提交
170

M
Mr.doob 已提交
171 172 173 174 175 176 177 178 179 180 181 182
				"uniform vec3 ambientLightColor;",

				"#if MAX_DIR_LIGHTS > 0",
					"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
					"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
				"#endif",

				"#if MAX_POINT_LIGHTS > 0",
					"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
					"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
				"#endif",

183
				"varying vec3 vViewPosition;",
M
Mr.doob 已提交
184

185
				THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
A
alteredq 已提交
186 187
				THREE.ShaderChunk[ "fog_pars_fragment" ],

188
				"void main() {",
M
Mr.doob 已提交
189

190
					"gl_FragColor = vec4( vec3( 1.0 ), uOpacity );",
M
Mr.doob 已提交
191 192

					"vec3 specularTex = vec3( 1.0 );",
M
Mr.doob 已提交
193

194 195 196
					"vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;",
					"normalTex.xy *= uNormalScale;",
					"normalTex = normalize( normalTex );",
M
Mr.doob 已提交
197

198
					"if( enableDiffuse )",
M
Mr.doob 已提交
199
						"gl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );",
M
Mr.doob 已提交
200

201
					"if( enableAO )",
202
						"gl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;",
M
Mr.doob 已提交
203

204 205 206
					"if( enableSpecular )",
						"specularTex = texture2D( tSpecular, vUv ).xyz;",

A
alteredq 已提交
207
					"mat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );",
208
					"vec3 finalNormal = tsb * normalTex;",
M
Mr.doob 已提交
209

210 211
					"vec3 normal = normalize( finalNormal );",
					"vec3 viewPosition = normalize( vViewPosition );",
M
Mr.doob 已提交
212

M
Mr.doob 已提交
213 214 215
					// point lights

					"#if MAX_POINT_LIGHTS > 0",
M
Mr.doob 已提交
216

217 218
						"vec3 pointDiffuse = vec3( 0.0 );",
						"vec3 pointSpecular = vec3( 0.0 );",
M
Mr.doob 已提交
219

M
Mr.doob 已提交
220
						"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
M
Mr.doob 已提交
221

M
Mr.doob 已提交
222
							"vec3 pointVector = normalize( vPointLight[ i ].xyz );",
223
							"vec3 pointHalfVector = normalize( vPointLight[ i ].xyz + viewPosition );",
M
Mr.doob 已提交
224 225
							"float pointDistance = vPointLight[ i ].w;",

226
							"float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );",
M
Mr.doob 已提交
227 228
							"float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );",

229
							"float pointSpecularWeight = specularTex.r * pow( pointDotNormalHalf, uShininess );",
M
Mr.doob 已提交
230

231
							"pointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;",
232
							"pointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;",
M
Mr.doob 已提交
233 234 235 236

						"}",

					"#endif",
M
Mr.doob 已提交
237

M
Mr.doob 已提交
238
					// directional lights
M
Mr.doob 已提交
239

M
Mr.doob 已提交
240
					"#if MAX_DIR_LIGHTS > 0",
M
Mr.doob 已提交
241

242 243
						"vec3 dirDiffuse = vec3( 0.0 );",
						"vec3 dirSpecular = vec3( 0.0 );",
M
Mr.doob 已提交
244

M
Mr.doob 已提交
245
						"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
M
Mr.doob 已提交
246

M
Mr.doob 已提交
247
							"vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
M
Mr.doob 已提交
248

M
Mr.doob 已提交
249
							"vec3 dirVector = normalize( lDirection.xyz );",
250
							"vec3 dirHalfVector = normalize( lDirection.xyz + viewPosition );",
M
Mr.doob 已提交
251

252
							"float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );",
M
Mr.doob 已提交
253
							"float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",
M
Mr.doob 已提交
254

255
							"float dirSpecularWeight = specularTex.r * pow( dirDotNormalHalf, uShininess );",
M
Mr.doob 已提交
256

257
							"dirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;",
258
							"dirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;",
M
Mr.doob 已提交
259 260 261 262

						"}",

					"#endif",
M
Mr.doob 已提交
263

264
					// all lights contribution summation
M
Mr.doob 已提交
265

266 267
					"vec3 totalDiffuse = vec3( 0.0 );",
					"vec3 totalSpecular = vec3( 0.0 );",
M
Mr.doob 已提交
268 269

					"#if MAX_DIR_LIGHTS > 0",
270 271 272 273

						"totalDiffuse += dirDiffuse;",
						"totalSpecular += dirSpecular;",

M
Mr.doob 已提交
274 275 276
					"#endif",

					"#if MAX_POINT_LIGHTS > 0",
277 278 279 280

						"totalDiffuse += pointDiffuse;",
						"totalSpecular += pointSpecular;",

M
Mr.doob 已提交
281
					"#endif",
M
Mr.doob 已提交
282

283
					"gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;",
M
Mr.doob 已提交
284

A
alteredq 已提交
285 286 287 288 289
					"if ( enableReflection ) {",

						"vec3 wPos = cameraPosition - vViewPosition;",
						"vec3 vReflect = reflect( normalize( wPos ), normal );",
						"vec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );",
A
alteredq 已提交
290
						"gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );",
A
alteredq 已提交
291 292 293

					"}",

294
					THREE.ShaderChunk[ "shadowmap_fragment" ],
A
alteredq 已提交
295 296
					THREE.ShaderChunk[ "fog_fragment" ],

297
				"}"
M
Mr.doob 已提交
298

299
			].join("\n"),
M
Mr.doob 已提交
300

301
			vertexShader: [
M
Mr.doob 已提交
302

303
				"attribute vec4 tangent;",
M
Mr.doob 已提交
304

305 306 307
				"uniform vec2 uOffset;",
				"uniform vec2 uRepeat;",

308
				"#ifdef VERTEX_TEXTURES",
M
Mr.doob 已提交
309

310 311 312
					"uniform sampler2D tDisplacement;",
					"uniform float uDisplacementScale;",
					"uniform float uDisplacementBias;",
M
Mr.doob 已提交
313

314
				"#endif",
M
Mr.doob 已提交
315

316 317 318 319
				"varying vec3 vTangent;",
				"varying vec3 vBinormal;",
				"varying vec3 vNormal;",
				"varying vec2 vUv;",
M
Mr.doob 已提交
320

M
Mr.doob 已提交
321 322 323 324 325 326 327 328 329
				"#if MAX_POINT_LIGHTS > 0",

					"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
					"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",

					"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",

				"#endif",

330
				"varying vec3 vViewPosition;",
M
Mr.doob 已提交
331

332 333
				THREE.ShaderChunk[ "shadowmap_pars_vertex" ],

334
				"void main() {",
M
Mr.doob 已提交
335

336
					"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
337

338
					"vViewPosition = -mvPosition.xyz;",
339

A
alteredq 已提交
340
					// normal, tangent and binormal vectors
M
Mr.doob 已提交
341

A
alteredq 已提交
342 343
					"vNormal = normalMatrix * normal;",
					"vTangent = normalMatrix * tangent.xyz;",
344
					"vBinormal = cross( vNormal, vTangent ) * tangent.w;",
M
Mr.doob 已提交
345

346
					"vUv = uv * uRepeat + uOffset;",
M
Mr.doob 已提交
347

M
Mr.doob 已提交
348 349 350 351 352 353 354 355 356 357 358
					// point lights

					"#if MAX_POINT_LIGHTS > 0",

						"for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",

							"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",

							"vec3 lVector = lPosition.xyz - mvPosition.xyz;",

							"float lDistance = 1.0;",
M
Mr.doob 已提交
359

M
Mr.doob 已提交
360 361 362 363 364 365 366 367 368 369
							"if ( pointLightDistance[ i ] > 0.0 )",
								"lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",

							"lVector = normalize( lVector );",

							"vPointLight[ i ] = vec4( lVector, lDistance );",

						"}",

					"#endif",
M
Mr.doob 已提交
370

371
					// displacement mapping
M
Mr.doob 已提交
372

373
					"#ifdef VERTEX_TEXTURES",
M
Mr.doob 已提交
374

375 376
						"vec3 dv = texture2D( tDisplacement, uv ).xyz;",
						"float df = uDisplacementScale * dv.x + uDisplacementBias;",
A
alteredq 已提交
377
						"vec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;",
378
						"gl_Position = projectionMatrix * displacedPosition;",
M
Mr.doob 已提交
379

380
					"#else",
M
Mr.doob 已提交
381

382
						"gl_Position = projectionMatrix * mvPosition;",
M
Mr.doob 已提交
383

384
					"#endif",
M
Mr.doob 已提交
385

386 387
					THREE.ShaderChunk[ "shadowmap_vertex" ],

388
				"}"
M
Mr.doob 已提交
389

390
			].join("\n")
M
Mr.doob 已提交
391 392 393

		},

394
		/* -------------------------------------------------------------------------
A
alteredq 已提交
395
		//	Cube map shader
396
		 ------------------------------------------------------------------------- */
397

398
		'cube': {
M
Mr.doob 已提交
399

400 401
			uniforms: { "tCube": { type: "t", value: 1, texture: null },
						"tFlip": { type: "f", value: -1 } },
M
Mr.doob 已提交
402

403
			vertexShader: [
M
Mr.doob 已提交
404

405
				"varying vec3 vViewPosition;",
M
Mr.doob 已提交
406

407
				"void main() {",
M
Mr.doob 已提交
408

409 410
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
					"vViewPosition = cameraPosition - mPosition.xyz;",
411

412
					"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
M
Mr.doob 已提交
413

414
				"}"
M
Mr.doob 已提交
415

416
			].join("\n"),
M
Mr.doob 已提交
417

418
			fragmentShader: [
M
Mr.doob 已提交
419

420
				"uniform samplerCube tCube;",
421
				"uniform float tFlip;",
M
Mr.doob 已提交
422

423
				"varying vec3 vViewPosition;",
M
Mr.doob 已提交
424

425
				"void main() {",
M
Mr.doob 已提交
426

427
					"vec3 wPos = cameraPosition - vViewPosition;",
428
					"gl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );",
M
Mr.doob 已提交
429

430
				"}"
M
Mr.doob 已提交
431

432
			].join("\n")
433

M
Mr.doob 已提交
434
		}
M
Mr.doob 已提交
435

M
Mr.doob 已提交
436 437 438
	}

};
M
Mr.doob 已提交
439 440

};