ShaderUtils.js 11.1 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
97
		//		- normal + diffuse + specular + AO + displacement 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

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

115 116 117 118
				"tDiffuse"	: { type: "t", value: 0, texture: null },
				"tNormal"	: { type: "t", value: 2, texture: null },
				"tSpecular"	: { type: "t", value: 3, texture: null },
				"tAO"		: { type: "t", value: 4, texture: null },
M
Mr.doob 已提交
119

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

122
				"tDisplacement": { type: "t", value: 5, texture: null },
M
Mr.doob 已提交
123 124
				"uDisplacementBias": { type: "f", value: 0.0 },
				"uDisplacementScale": { type: "f", value: 1.0 },
M
Mr.doob 已提交
125

126 127 128
				"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 已提交
129 130
				"uShininess": { type: "f", value: 30 },
				"uOpacity": { type: "f", value: 1 }
M
Mr.doob 已提交
131

M
Mr.doob 已提交
132
				}
M
Mr.doob 已提交
133

M
Mr.doob 已提交
134
			] ),
M
Mr.doob 已提交
135

M
Mr.doob 已提交
136
			fragmentShader: [
M
Mr.doob 已提交
137

138 139 140 141
				"uniform vec3 uAmbientColor;",
				"uniform vec3 uDiffuseColor;",
				"uniform vec3 uSpecularColor;",
				"uniform float uShininess;",
M
Mr.doob 已提交
142
				"uniform float uOpacity;",
M
Mr.doob 已提交
143

144
				"uniform bool enableDiffuse;",
145
				"uniform bool enableSpecular;",
146
				"uniform bool enableAO;",
M
Mr.doob 已提交
147

148 149
				"uniform sampler2D tDiffuse;",
				"uniform sampler2D tNormal;",
150
				"uniform sampler2D tSpecular;",
151
				"uniform sampler2D tAO;",
M
Mr.doob 已提交
152

153
				"uniform float uNormalScale;",
M
Mr.doob 已提交
154

155 156 157 158
				"varying vec3 vTangent;",
				"varying vec3 vBinormal;",
				"varying vec3 vNormal;",
				"varying vec2 vUv;",
M
Mr.doob 已提交
159

M
Mr.doob 已提交
160 161 162 163 164 165 166 167 168 169 170 171
				"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",

172
				"varying vec3 vViewPosition;",
M
Mr.doob 已提交
173

174
				THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
A
alteredq 已提交
175 176
				THREE.ShaderChunk[ "fog_pars_fragment" ],

177
				"void main() {",
M
Mr.doob 已提交
178

179
					"gl_FragColor = vec4( vec3( 1.0 ), uOpacity );",
M
Mr.doob 已提交
180 181

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

183 184 185
					"vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;",
					"normalTex.xy *= uNormalScale;",
					"normalTex = normalize( normalTex );",
M
Mr.doob 已提交
186

187
					"if( enableDiffuse )",
M
Mr.doob 已提交
188
						"gl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );",
M
Mr.doob 已提交
189

190
					"if( enableAO )",
191
						"gl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;",
M
Mr.doob 已提交
192

193 194 195
					"if( enableSpecular )",
						"specularTex = texture2D( tSpecular, vUv ).xyz;",

196 197
					"mat3 tsb = mat3( vTangent, vBinormal, vNormal );",
					"vec3 finalNormal = tsb * normalTex;",
M
Mr.doob 已提交
198

199 200
					"vec3 normal = normalize( finalNormal );",
					"vec3 viewPosition = normalize( vViewPosition );",
M
Mr.doob 已提交
201

M
Mr.doob 已提交
202 203 204
					// point lights

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

206 207
						"vec3 pointDiffuse = vec3( 0.0 );",
						"vec3 pointSpecular = vec3( 0.0 );",
M
Mr.doob 已提交
208

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

M
Mr.doob 已提交
211
							"vec3 pointVector = normalize( vPointLight[ i ].xyz );",
212
							"vec3 pointHalfVector = normalize( vPointLight[ i ].xyz + viewPosition );",
M
Mr.doob 已提交
213 214 215 216 217 218 219 220 221
							"float pointDistance = vPointLight[ i ].w;",

							"float pointDotNormalHalf = dot( normal, pointHalfVector );",
							"float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );",

							"float pointSpecularWeight = 0.0;",
							"if ( pointDotNormalHalf >= 0.0 )",
								"pointSpecularWeight = specularTex.r * pow( pointDotNormalHalf, uShininess );",

222 223
							"pointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;",
							"pointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight;",
M
Mr.doob 已提交
224 225 226 227

						"}",

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

M
Mr.doob 已提交
229
					// directional lights
M
Mr.doob 已提交
230

M
Mr.doob 已提交
231
					"#if MAX_DIR_LIGHTS > 0",
M
Mr.doob 已提交
232

233 234
						"vec3 dirDiffuse = vec3( 0.0 );",
						"vec3 dirSpecular = vec3( 0.0 );",
M
Mr.doob 已提交
235

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

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

M
Mr.doob 已提交
240
							"vec3 dirVector = normalize( lDirection.xyz );",
241
							"vec3 dirHalfVector = normalize( lDirection.xyz + viewPosition );",
M
Mr.doob 已提交
242

M
Mr.doob 已提交
243 244
							"float dirDotNormalHalf = dot( normal, dirHalfVector );",
							"float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",
M
Mr.doob 已提交
245

M
Mr.doob 已提交
246 247 248
							"float dirSpecularWeight = 0.0;",
							"if ( dirDotNormalHalf >= 0.0 )",
								"dirSpecularWeight = specularTex.r * pow( dirDotNormalHalf, uShininess );",
M
Mr.doob 已提交
249

250 251
							"dirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;",
							"dirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight;",
M
Mr.doob 已提交
252 253 254 255

						"}",

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

257
					// all lights contribution summation
M
Mr.doob 已提交
258

259 260
					"vec3 totalDiffuse = vec3( 0.0 );",
					"vec3 totalSpecular = vec3( 0.0 );",
M
Mr.doob 已提交
261 262

					"#if MAX_DIR_LIGHTS > 0",
263 264 265 266

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

M
Mr.doob 已提交
267 268 269
					"#endif",

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

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

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

276
					"gl_FragColor.xyz = gl_FragColor.xyz * totalDiffuse + totalSpecular + ambientLightColor * uAmbientColor;",
M
Mr.doob 已提交
277

278
					THREE.ShaderChunk[ "shadowmap_fragment" ],
A
alteredq 已提交
279 280
					THREE.ShaderChunk[ "fog_fragment" ],

281
				"}"
M
Mr.doob 已提交
282

283
			].join("\n"),
M
Mr.doob 已提交
284

285
			vertexShader: [
M
Mr.doob 已提交
286

287
				"attribute vec4 tangent;",
M
Mr.doob 已提交
288

289
				"#ifdef VERTEX_TEXTURES",
M
Mr.doob 已提交
290

291 292 293
					"uniform sampler2D tDisplacement;",
					"uniform float uDisplacementScale;",
					"uniform float uDisplacementBias;",
M
Mr.doob 已提交
294

295
				"#endif",
M
Mr.doob 已提交
296

297 298 299 300
				"varying vec3 vTangent;",
				"varying vec3 vBinormal;",
				"varying vec3 vNormal;",
				"varying vec2 vUv;",
M
Mr.doob 已提交
301

M
Mr.doob 已提交
302 303 304 305 306 307 308 309 310
				"#if MAX_POINT_LIGHTS > 0",

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

					"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",

				"#endif",

311
				"varying vec3 vViewPosition;",
M
Mr.doob 已提交
312

313 314
				THREE.ShaderChunk[ "shadowmap_pars_vertex" ],

315
				"void main() {",
M
Mr.doob 已提交
316

317
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
M
Mr.doob 已提交
318

319
					"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
320

321
					"vViewPosition = -mvPosition.xyz;",
322

323
					"vNormal = normalize( normalMatrix * normal );",
M
Mr.doob 已提交
324

325
					// tangent and binormal vectors
M
Mr.doob 已提交
326

327
					"vTangent = normalize( normalMatrix * tangent.xyz );",
M
Mr.doob 已提交
328

329 330
					"vBinormal = cross( vNormal, vTangent ) * tangent.w;",
					"vBinormal = normalize( vBinormal );",
M
Mr.doob 已提交
331

332
					"vUv = uv;",
M
Mr.doob 已提交
333

M
Mr.doob 已提交
334 335 336 337 338 339 340 341 342 343 344
					// 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 已提交
345

M
Mr.doob 已提交
346 347 348 349 350 351 352 353 354 355
							"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 已提交
356

357
					// displacement mapping
M
Mr.doob 已提交
358

359
					"#ifdef VERTEX_TEXTURES",
M
Mr.doob 已提交
360

361 362 363 364
						"vec3 dv = texture2D( tDisplacement, uv ).xyz;",
						"float df = uDisplacementScale * dv.x + uDisplacementBias;",
						"vec4 displacedPosition = vec4( vNormal.xyz * df, 0.0 ) + mvPosition;",
						"gl_Position = projectionMatrix * displacedPosition;",
M
Mr.doob 已提交
365

366
					"#else",
M
Mr.doob 已提交
367

368
						"gl_Position = projectionMatrix * mvPosition;",
M
Mr.doob 已提交
369

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

372 373
					THREE.ShaderChunk[ "shadowmap_vertex" ],

374
				"}"
M
Mr.doob 已提交
375

376
			].join("\n")
M
Mr.doob 已提交
377 378 379

		},

380
		/* -------------------------------------------------------------------------
A
alteredq 已提交
381
		//	Cube map shader
382
		 ------------------------------------------------------------------------- */
383

384
		'cube': {
M
Mr.doob 已提交
385

386
			uniforms: { "tCube": { type: "t", value: 1, texture: null } },
M
Mr.doob 已提交
387

388
			vertexShader: [
M
Mr.doob 已提交
389

390
				"varying vec3 vViewPosition;",
M
Mr.doob 已提交
391

392
				"void main() {",
M
Mr.doob 已提交
393

394 395
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
					"vViewPosition = cameraPosition - mPosition.xyz;",
396

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

399
				"}"
M
Mr.doob 已提交
400

401
			].join("\n"),
M
Mr.doob 已提交
402

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

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

407
				"varying vec3 vViewPosition;",
M
Mr.doob 已提交
408

409
				"void main() {",
M
Mr.doob 已提交
410

411 412
					"vec3 wPos = cameraPosition - vViewPosition;",
					"gl_FragColor = textureCube( tCube, vec3( - wPos.x, wPos.yz ) );",
M
Mr.doob 已提交
413

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

416
			].join("\n")
417

M
Mr.doob 已提交
418
		}
M
Mr.doob 已提交
419

M
Mr.doob 已提交
420 421 422
	}

};
M
Mr.doob 已提交
423 424

};