Преглед изворни кода

Refactored environment mapping to use bump mapped normals (if available).

alteredq пре 13 година
родитељ
комит
a5a38ae323
3 измењених фајлова са 50 додато и 12 уклоњено
  1. 2 2
      build/Three.js
  2. 3 3
      build/custom/ThreeWebGL.js
  3. 45 7
      src/renderers/WebGLShaders.js

Разлика између датотеке није приказан због своје велике величине
+ 2 - 2
build/Three.js


Разлика између датотеке није приказан због своје велике величине
+ 3 - 3
build/custom/ThreeWebGL.js


+ 45 - 7
src/renderers/WebGLShaders.js

@@ -59,13 +59,22 @@ THREE.ShaderChunk = {
 
 
 		"#ifdef USE_ENVMAP",
 		"#ifdef USE_ENVMAP",
 
 
-			"varying vec3 vReflect;",
-
 			"uniform float reflectivity;",
 			"uniform float reflectivity;",
 			"uniform samplerCube envMap;",
 			"uniform samplerCube envMap;",
 			"uniform float flipEnvMap;",
 			"uniform float flipEnvMap;",
 			"uniform int combine;",
 			"uniform int combine;",
 
 
+			"#ifdef USE_BUMPMAP",
+
+				"uniform bool useRefract;",
+				"uniform float refractionRatio;",
+
+			"#else",
+
+				"varying vec3 vReflect;",
+
+			"#endif",
+
 		"#endif"
 		"#endif"
 
 
 	].join("\n"),
 	].join("\n"),
@@ -74,14 +83,34 @@ THREE.ShaderChunk = {
 
 
 		"#ifdef USE_ENVMAP",
 		"#ifdef USE_ENVMAP",
 
 
+			"vec3 reflectVec;",
+
+			"#ifdef USE_BUMPMAP",
+
+				"if ( useRefract ) {",
+
+					"reflectVec = refract( normalize( vWorldPosition - cameraPosition ), normal, refractionRatio );",
+
+				"} else { ",
+
+					"reflectVec = reflect( normalize( vWorldPosition - cameraPosition ), normal );",
+
+				"}",
+
+			"#else",
+
+				"reflectVec = vReflect;",
+
+			"#endif",
+
 			"#ifdef DOUBLE_SIDED",
 			"#ifdef DOUBLE_SIDED",
 
 
 				"float flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );",
 				"float flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );",
-				"vec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );",
+				"vec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );",
 
 
 			"#else",
 			"#else",
 
 
-				"vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );",
+				"vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );",
 
 
 			"#endif",
 			"#endif",
 
 
@@ -107,7 +136,7 @@ THREE.ShaderChunk = {
 
 
 	envmap_pars_vertex: [
 	envmap_pars_vertex: [
 
 
-		"#ifdef USE_ENVMAP",
+		"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP )",
 
 
 			"varying vec3 vReflect;",
 			"varying vec3 vReflect;",
 
 
@@ -123,6 +152,11 @@ THREE.ShaderChunk = {
 		"#ifdef USE_ENVMAP",
 		"#ifdef USE_ENVMAP",
 
 
 			"vec4 mPosition = modelMatrix * vec4( position, 1.0 );",
 			"vec4 mPosition = modelMatrix * vec4( position, 1.0 );",
+
+		"#endif",
+
+		"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP )",
+
 			"vec3 nWorld = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * normal;",
 			"vec3 nWorld = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * normal;",
 
 
 			"if ( useRefract ) {",
 			"if ( useRefract ) {",
@@ -565,7 +599,7 @@ THREE.ShaderChunk = {
 
 
 		"#endif",
 		"#endif",
 
 
-		"#if MAX_SPOT_LIGHTS > 0",
+		"#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )",
 
 
 			"varying vec3 vWorldPosition;",
 			"varying vec3 vWorldPosition;",
 
 
@@ -614,7 +648,7 @@ THREE.ShaderChunk = {
 
 
 		"#endif",
 		"#endif",
 
 
-		"#if MAX_SPOT_LIGHTS > 0",
+		"#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )",
 
 
 			"vWorldPosition = mPosition.xyz;",
 			"vWorldPosition = mPosition.xyz;",
 
 
@@ -668,6 +702,10 @@ THREE.ShaderChunk = {
 
 
 			"#endif",
 			"#endif",
 
 
+		"#endif",
+
+		"#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )",
+
 			"varying vec3 vWorldPosition;",
 			"varying vec3 vWorldPosition;",
 
 
 		"#endif",
 		"#endif",

Неке датотеке нису приказане због велике количине промена