Browse Source

perfect backwards compatibility for envmap_fragment for phong.

Ben Houston 9 years ago
parent
commit
ce22ecc930

+ 3 - 3
src/renderers/shaders/ShaderChunk/envmap_fragment.glsl

@@ -47,15 +47,15 @@
 
 	#ifdef ENVMAP_BLENDING_MULTIPLY
 
-		indirectReflectedLight.specular = mix( indirectReflectedLight.specular, indirectReflectedLight.specular * envColor.xyz, specularStrength * reflectivity );
+		outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );
 
 	#elif defined( ENVMAP_BLENDING_MIX )
 
-		indirectReflectedLight.specular = mix( indirectReflectedLight.specular, envColor.xyz, specularStrength * reflectivity );
+		outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );
 
 	#elif defined( ENVMAP_BLENDING_ADD )
 
-		indirectReflectedLight.specular += envColor.xyz * specularStrength * reflectivity;
+		outgoingLight += envColor.xyz * specularStrength * reflectivity;
 
 	#endif
 

+ 42 - 32
src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl

@@ -3,22 +3,19 @@ vec3 diffuse = vec3( 1.0 );
 GeometricContext geometry = GeometricContext( mvPosition.xyz, normalize( transformedNormal ), normalize( -mvPosition.xyz ) );
 GeometricContext backGeometry = GeometricContext( geometry.position, -geometry.normal, geometry.viewDir );
 
-ReflectedLight frontReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
-ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
-
 #if MAX_POINT_LIGHTS > 0
 
 	for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {
 
 		IncidentLight directLight = getPointDirectLight( pointLights[ i ], geometry );
 
-		float dotNL = dot( geometry.normal, directLight.direction );
-		frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
+		float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
+		vLightFront += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
 
 		#ifdef DOUBLE_SIDED
 
-			float dotNLBack = dot( -geometry.normal, directLight.direction );
-			backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
+			float backDotNL = saturate( dot( -geometry.normal, directLight.direction ) );
+			vLightBack += backDotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
 
 		#endif
 
@@ -32,13 +29,13 @@ ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
 
 		IncidentLight directLight = getSpotDirectLight( spotLights[ i ], geometry );
 
-		float dotNL = dot( geometry.normal, directLight.direction );
-		frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
+		float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
+		vLightFront += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
 
 		#ifdef DOUBLE_SIDED
 
-			float dotNLBack = dot( -geometry.normal, directLight.direction );
-			backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
+			float backDotNL = saturate( dot( -geometry.normal, directLight.direction ) );
+			vLightBack += backDotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
 
 		#endif
 	}
@@ -51,13 +48,13 @@ ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
 
 		IncidentLight directLight = getDirectionalDirectLight( directionalLights[ i ], geometry );
 
-		float dotNL = dot( geometry.normal, directLight.direction );
-		frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
+		float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
+		vLightFront += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
 
 		#ifdef DOUBLE_SIDED
 
-			float dotNLBack = dot( -geometry.normal, directLight.direction );
-			backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
+			float backDotNL = saturate( dot( -geometry.normal, directLight.direction ) );
+			vLightBack += backDotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
 
 		#endif
 
@@ -65,32 +62,45 @@ ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
 
 #endif
 
-#if MAX_HEMI_LIGHTS > 0
+	{
+	
+		IncidentLight frontIndirectLight;
+		frontIndirectLight.direction = geometry.normal;
+		frontIndirectLight.color = ambientLightColor;
 
-	for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
+		#ifdef DOUBLE_SIDED
+		
+			IncidentLight backIndirectLight;
+			backIndirectLight.direction = -geometry.normal;
+			backIndirectLight.color = ambientLightColor;
 
-		IncidentLight indirectLight = getHemisphereIndirectLight( hemisphereLights[ i ], geometry );
+		#endif
 
-		float dotNL = dot( geometry.normal, directLight.direction );
-		frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
+		#if MAX_HEMI_LIGHTS > 0
 
-		#ifdef DOUBLE_SIDED
-	
-			indirectLight = getHemisphereIndirectLight( hemisphereLights[ i ], backGeometry );
+			for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
 
-			float dotNLBack = dot( -geometry.normal, directLight.direction );
-			backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
+				frontIndirectLight.color += getHemisphereIndirectLight( hemisphereLights[ i ], geometry ).color;
 
-		#endif
 
-	}
+				#ifdef DOUBLE_SIDED
+			
+					backIndirectLight.color += getHemisphereIndirectLight( hemisphereLights[ i ], backGeometry ).color;
 
-#endif
+				#endif
+
+			}
 
-vLightFront = frontReflectedLight.diffuse;
+		#endif
 
-#ifdef DOUBLE_SIDED
+		float frontDotNL = saturate( dot( geometry.normal, frontIndirectLight.direction ) );
+		vLightFront += frontDotNL * frontIndirectLight.color * BRDF_Diffuse_Lambert( frontIndirectLight, geometry, diffuse );
 
-	vLightBack = backReflectedLight.diffuse;
+		#ifdef DOUBLE_SIDED
+
+			float backDotNL = saturate( dot( -geometry.normal, backIndirectLight.direction ) );
+			vLightBack += backDotNL * backIndirectLight.color * BRDF_Diffuse_Lambert( backIndirectLight, backGeometry, diffuse );
+
+		#endif
 
-#endif
+	}

+ 1 - 1
src/renderers/shaders/ShaderChunk/lights_pars.glsl

@@ -122,7 +122,7 @@ uniform vec3 ambientLightColor;
 #endif
 
 
-#ifdef USE_ENVMAP
+#if defined( USE_ENVMAP ) && defined( PHYSICAL )
 
 	IncidentLight getSpecularLightProbeIndirectLight( /*const in SpecularLightProbe specularLightProbe,*/ const in GeometricContext geometry, const in float lodLevel ) { 
 	

+ 4 - 3
src/renderers/shaders/ShaderLib.js

@@ -101,14 +101,13 @@ THREE.ShaderLib = {
 			"	ReflectedLight indirectReflectedLight = ReflectedLight( vec3( 0.0 ), diffuse );",
 
 				THREE.ShaderChunk[ "aomap_fragment" ],
-				THREE.ShaderChunk[ "envmap_fragment" ],
 				THREE.ShaderChunk[ "shadowmap_fragment" ],
 				"indirectReflectedLight.diffuse *= shadowMask;",
 		
 				"vec3 outgoingLight = indirectReflectedLight.diffuse;",
 
+				THREE.ShaderChunk[ "envmap_fragment" ],
 				THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
-
 				THREE.ShaderChunk[ "fog_fragment" ],
 
 			"	gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
@@ -241,6 +240,8 @@ THREE.ShaderLib = {
 
 			"	#endif",
 
+				THREE.ShaderChunk[ "envmap_fragment" ],
+		
 				THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
 
 				THREE.ShaderChunk[ "fog_fragment" ],
@@ -388,7 +389,6 @@ THREE.ShaderLib = {
 				THREE.ShaderChunk[ "lightmap_fragment" ],
 
 				// modulation
-				THREE.ShaderChunk[ "envmap_fragment" ],
 				THREE.ShaderChunk[ "aomap_fragment" ],
 			
 				"vec3 shadowMask = vec3( 1.0 );",
@@ -406,6 +406,7 @@ THREE.ShaderLib = {
 
 				"#endif",
 
+				THREE.ShaderChunk[ "envmap_fragment" ],
 				THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
 
 				THREE.ShaderChunk[ "fog_fragment" ],