From b143aa96fcd6d16558464c98bcfd9984f7d29750 Mon Sep 17 00:00:00 2001
From: Graham Linden <graham@lindenlab.com>
Date: Mon, 13 May 2019 15:33:48 -0700
Subject: [PATCH] SL-10856

Modify calc of sunlight to avoid clipping in gamma correct on values outside 0-1 range.

Modify shaders to put back ambient clamp tuned to be close to ambient contrib in low/mid lighting.
---
 indra/llinventory/llsettingssky.cpp                    | 10 ++++++++--
 .../app_settings/shaders/class1/deferred/alphaF.glsl   |  3 +--
 .../shaders/class1/deferred/materialF.glsl             |  3 +--
 .../shaders/class1/deferred/softenLightF.glsl          |  3 +--
 .../shaders/class1/windlight/atmosphericsFuncs.glsl    |  6 +++---
 .../shaders/class2/deferred/softenLightF.glsl          |  3 +--
 .../app_settings/shaders/class3/lighting/lightV.glsl   |  2 +-
 7 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index cfca2d0d78c..211af6a7ae0 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -32,6 +32,10 @@
 #include "llfasttimer.h"
 #include "v3colorutil.h"
 
+#if LL_WINDOWS
+#pragma optimize("", off)
+#endif
+
 //=========================================================================
 namespace
 {
@@ -1276,8 +1280,10 @@ void LLSettingsSky::calculateLightSettings() const
     LLColor3 tmpAmbient = ambient + (smear(1.f) - ambient) * cloud_shadow;
 
     //brightness of surface both sunlight and ambient
-    mSunDiffuse = gammaCorrect(componentMult(sunlight,   light_transmittance));
-    mSunAmbient = gammaCorrect(componentMult(tmpAmbient, light_transmittance));
+    // reduce range to 0 - 1 before gamma correct to prevent clipping
+    // then restore to full 0 - 3 range before storage
+    mSunDiffuse = gammaCorrect(componentMult(sunlight * 0.33333f,   light_transmittance)) * 3.0f;
+    mSunAmbient = gammaCorrect(componentMult(tmpAmbient * 0.33333f, light_transmittance)) * 3.0f;
 
     F32 moon_brightness = getIsMoonUp() ? getMoonBrightness() : 0.001f;
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
index dbd7abd7e50..b439fbbff6c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
@@ -223,8 +223,7 @@ void main()
     float ambient = da;
     ambient *= 0.5;
     ambient *= ambient;
-    //ambient = max(getAmbientClamp(), ambient); // keeps shadows dark
-    ambient = 1.0 - ambient;
+    ambient = min(getAmbientClamp(), 1.0 - ambient);
 
     vec3 sun_contrib = min(final_da, shadow) * sunlit;
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index 7533762a969..274d1818f0b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -320,8 +320,7 @@ void main()
     float ambient = da;
     ambient *= 0.5;
     ambient *= ambient;
-    //ambient = max(getAmbientClamp(), ambient);
-    ambient = 1.0 - ambient;
+    ambient = min(getAmbientClamp(), 1.0 - ambient);
 
     vec3 sun_contrib = min(final_da, shadow) * sunlit;
    
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index b6e3951ee32..2a24915ade5 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -106,8 +106,7 @@ void main()
         float ambient = da;
         ambient *= 0.5;
         ambient *= ambient;
-        //ambient = max(getAmbientClamp(), ambient);
-        ambient = 1.0 - ambient;
+        ambient = min(getAmbientClamp(), 1.0 - ambient);
 
         vec3 sun_contrib = final_da * sunlit;
 
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index 6788cc1f630..7f5ac00963b 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -44,7 +44,7 @@ uniform float sun_moon_glow_factor;
 
 float getAmbientClamp()
 {
-    return 0.66f;
+    return 0.2f;
 }
 
 void calcAtmosphericVars(vec3 inPositionEye, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten) {
@@ -137,7 +137,7 @@ void calcAtmosphericVars(vec3 inPositionEye, float ambFactor, out vec3 sunlit, o
           + tmpAmbient));
 
     //brightness of surface both sunlight and ambient
-    sunlit = sunlight.rgb * 0.5;
-    amblit = tmpAmbient.rgb * .25;
+    sunlit = sunlight.rgb;
+    amblit = tmpAmbient.rgb;
     additive *= vec3(1.0 - temp1);
 }
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index e41b4b99a3f..39b13b46cc9 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -116,8 +116,7 @@ void main()
         float ambient = da;
         ambient *= 0.5;
         ambient *= ambient;
-        //ambient = max(getAmbientClamp(), ambient);
-        ambient = 1.0 - ambient;
+        ambient = min(getAmbientClamp(), 1.0 - ambient);
 
         vec3 sun_contrib = min(scol, final_da) * sunlit;
 
diff --git a/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl
index 48c883d98ac..2f64ab25cb1 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl
@@ -32,7 +32,7 @@ vec4 sumLights(vec3 pos, vec3 norm, vec4 color);
 vec4 calcLighting(vec3 pos, vec3 norm, vec4 color)
 {
 	vec4 c = sumLights(pos, norm, color);
-    c.rgb += atmosAmbient() * color.rgb;
+    c.rgb += atmosAmbient() * color.rgb * 0.25;
     return c; 
 }
 
-- 
GitLab