From 76d71b4b5a0925454b5c86dc3904d7d5e3d17bec Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Thu, 24 Jun 2021 01:52:01 +0200
Subject: [PATCH] [#82] Light bleeding reduction

---
 .../resources/shaders/shadowMapping.inc           | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/projects/voxelization/resources/shaders/shadowMapping.inc b/projects/voxelization/resources/shaders/shadowMapping.inc
index c97e0b81..8f14d35d 100644
--- a/projects/voxelization/resources/shaders/shadowMapping.inc
+++ b/projects/voxelization/resources/shaders/shadowMapping.inc
@@ -35,7 +35,7 @@ float ComputeMSMShadowIntensity(vec4 _4Moments, float FragmentDepth, float Depth
     	vec4(0.0));
     float Quotient=(Switch[0]*z[2]-b[0]*(Switch[0]+z[2])+b[1])
                   /((z[2]-Switch[1])*(z[0]-z[1]));
-    return clamp(Switch[2]+Switch[3]*Quotient, 0, 1);
+    return 1-clamp(Switch[2]+Switch[3]*Quotient, 0, 1);
 }
 
 vec4 quantizeMoments(vec4 moments){
@@ -59,6 +59,16 @@ vec4 unquantizeMoments(vec4 moments){
     return T * moments;
 }
 
+float rescaleRange(float a, float b, float v)
+{
+    return clamp((v - a) / (b - a), 0, 1);
+}
+
+float reduceLightBleeding(float shadow, float amount)
+{
+   return rescaleRange(amount, 1.0f, shadow);
+}
+
 float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sampler shadowMapSampler, vec2 offset){
     vec4 lightPos = lightInfo.lightMatrix * vec4(worldPos, 1);
     lightPos /= lightPos.w;
@@ -78,7 +88,8 @@ float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sample
     float depthBias     = 0.f;
     float momentBias    = 0.00005;
     
-    return 1-ComputeMSMShadowIntensity(shadowMapSample, lightPos.z, depthBias, momentBias);
+    float shadow = ComputeMSMShadowIntensity(shadowMapSample, lightPos.z, depthBias, momentBias);
+    return reduceLightBleeding(shadow, 0.1f);
 }
 
 #endif // #ifndef SHADOW_MAPPING_INC
\ No newline at end of file
-- 
GitLab