From 7defff4de756f9d1040ff2113fdfd9a91c374f60 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Mon, 22 Nov 2021 17:05:17 -0500
Subject: [PATCH] Fix nan in lighting breaking tonemapping and color grading

---
 .../shaders/class1/deferred/multiSpotLightF.glsl           | 7 ++++++-
 .../app_settings/shaders/class1/deferred/spotLightF.glsl   | 5 ++++-
 .../shaders/class2/deferred/multiSpotLightF.glsl           | 7 +++----
 .../app_settings/shaders/class2/deferred/spotLightF.glsl   | 5 +----
 4 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
index 14efbf717e7..5daeb2827cc 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
@@ -131,6 +131,7 @@ void main()
 	vec3 pos = getPosition(frag.xy).xyz;
 	vec3 lv = center.xyz-pos.xyz;
 	float dist = length(lv);
+
 	dist /= size;
 	if (dist > 1.0)
 	{
@@ -191,7 +192,8 @@ void main()
 			lit = da * dist_atten * noise;
 
 			col = dlit*lit*diff_tex;
-			amb_da += (da*0.5)*proj_ambiance;
+
+			amb_da += (da*0.5+0.5)*proj_ambiance;
 		}
 		//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
 		vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
@@ -201,6 +203,9 @@ void main()
 		amb_da *= dist_atten * noise;
 			
 		amb_da = min(amb_da, 1.0-lit);
+
+		amb_da = max(amb_da, 0.0); // Prevent nan in lighting
+
 		col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
 	}
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
index 8b9ae587486..4e8ddfb2777 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
@@ -191,7 +191,7 @@ void main()
 			lit = da * dist_atten * noise;
 
 			col = dlit*lit*diff_tex;
-			amb_da += (da*0.5)*proj_ambiance;
+			amb_da += (da*0.5+0.5)*proj_ambiance;
 		}
 		//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0);
 		vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod);
@@ -201,6 +201,9 @@ void main()
 		amb_da *= dist_atten * noise;
 			
 		amb_da = min(amb_da, 1.0-lit);
+
+		amb_da = max(amb_da, 0.0); // Prevent nan in lighting
+
 		col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
 	}
 
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
index f295a7c2faf..c4018825920 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
@@ -215,6 +215,8 @@ void main()
         amb_da *= dist_atten * noise;
         amb_da = min(amb_da, 1.0-lit);
 
+        amb_da = max(amb_da, 0.0); // Prevent nan in lighting
+
         col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
     }
     
@@ -275,10 +277,7 @@ void main()
     }
 #endif
 
-    //not sure why, but this line prevents MATBUG-194
-    col = max(col, vec3(0.0));
-
-    //output linear
+    //output linear, sum of lights will be gamma corrected later	
     frag_color.rgb = col;
     frag_color.a = 0.0;
 }
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
index 44b34061ffe..30db661534d 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -213,6 +213,7 @@ void main()
 		amb_da += (da*da*0.5+0.5) /* * (1.0-shadow) */ * proj_ambiance;
 		amb_da *= dist_atten * noise;
 		amb_da = min(amb_da, 1.0-lit);
+		amb_da = max(amb_da, 0.0); // Prevent nan in lighting
 	
 	    col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
 	}
@@ -273,10 +274,6 @@ void main()
 		}
 	}
 #endif
-	
-	//not sure why, but this line prevents MATBUG-194
-	col = max(col, vec3(0.0));
-
 	//output linear colors as gamma correction happens down stream
 	frag_color.rgb = col;	
 	frag_color.a = 0.0;
-- 
GitLab