Browse Source

unify energy conservating with correct diffuse lambertian reflectance

Ben Houston 9 years ago
parent
commit
27dc0ad077

+ 12 - 1
src/renderers/shaders/ShaderChunk/common.glsl

@@ -91,6 +91,8 @@ vec3 linearToOutput( in vec3 a ) {
 
 }
 
+//#define ENERGY_PRESERVING_MONOCHROME
+
 
 struct IncidentLight {
  	vec3 color;
@@ -108,9 +110,18 @@ struct GeometricContext {
 	vec3 viewDir;
 };
 
+
 void BRDF_Lambert( const in IncidentLight incidentLight, const in GeometricContext geometryContext, const in vec3 diffuseColor, inout ReflectedLight reflectedLight ) {
 
-	reflectedLight.diffuse += incidentLight.color * diffuseColor * ( saturate( dot( geometryContext.normal, incidentLight.direction ) ) * RECIPROCAL_PI );
+	float lambertianReflectance = saturate( dot( geometryContext.normal, incidentLight.direction ) );
+
+	#if defined( ENERGY_PRESERVING_MONOCHROME ) || defined( ENERGY_PRESERVING_RGB )
+
+		lambertianReflectance *= RECIPROCAL_PI;
+
+	#endif
+
+	reflectedLight.diffuse += incidentLight.color * diffuseColor * lambertianReflectance;
 
 }
 

+ 1 - 0
src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl

@@ -3,6 +3,7 @@ vec3 normal = normalize( transformedNormal );
 
 vec3 diffuse = vec3( 1.0 );
 
+
 IncidentLight incidentLight;
 ReflectedLight frontReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
 ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );

+ 1 - 3
src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl

@@ -8,9 +8,7 @@ vec3 diffuse = diffuseColor.rgb;
 
 #endif
 
-#define ENERGY_PRESERVING_MONOCHROME
-
-#ifdef ENERGY_PRESERVING_RGB
+#if defined( ENERGY_PRESERVING_RGB )
 
 	diffuse *= whiteCompliment( specular );