Browse Source

Apply energy conservation to LAMBERT_WRAP and TOON diffuse modes by dividing by PI

clayjohn 3 years ago
parent
commit
97be1fb7b6

+ 4 - 3
drivers/gles3/shaders/scene.glsl

@@ -629,11 +629,12 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte
 		float diffuse_brdf_NL; // BRDF times N.L for calculating diffuse radiance
 		float diffuse_brdf_NL; // BRDF times N.L for calculating diffuse radiance
 
 
 #if defined(DIFFUSE_LAMBERT_WRAP)
 #if defined(DIFFUSE_LAMBERT_WRAP)
-		// energy conserving lambert wrap shader
-		diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness)));
+		// Energy conserving lambert wrap shader.
+		// https://web.archive.org/web/20210228210901/http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/
+		diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))) * (1.0 / M_PI);
 #elif defined(DIFFUSE_TOON)
 #elif defined(DIFFUSE_TOON)
 
 
-		diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL);
+		diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL) * (1.0 / M_PI);
 
 
 #elif defined(DIFFUSE_BURLEY)
 #elif defined(DIFFUSE_BURLEY)
 
 

+ 4 - 3
servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl

@@ -97,11 +97,12 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte
 		float diffuse_brdf_NL; // BRDF times N.L for calculating diffuse radiance
 		float diffuse_brdf_NL; // BRDF times N.L for calculating diffuse radiance
 
 
 #if defined(DIFFUSE_LAMBERT_WRAP)
 #if defined(DIFFUSE_LAMBERT_WRAP)
-		// energy conserving lambert wrap shader
-		diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness)));
+		// Energy conserving lambert wrap shader.
+		// https://web.archive.org/web/20210228210901/http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/
+		diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))) * (1.0 / M_PI);
 #elif defined(DIFFUSE_TOON)
 #elif defined(DIFFUSE_TOON)
 
 
-		diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL);
+		diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL) * (1.0 / M_PI);
 
 
 #elif defined(DIFFUSE_BURLEY)
 #elif defined(DIFFUSE_BURLEY)