diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 8996b1dd4f7e469f2ddf218ab1bb2d80766ce0f4..6d7e93b36457e0ac9f27b5ab7437bc3975aab2ef 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10402,7 +10402,7 @@
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
-    <real>32</real>
+    <real>16</real>
   </map>
   <key>RenderTonemapper</key>
   <map>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
index fe796a054d13b80e296d7f14ead694dcac518ef7..e0e97bb938dff00b3e96913e2cf0426157960118 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
@@ -24,19 +24,15 @@
  */
 /*[EXTRA_CODE_HERE]*/ 
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 /////////////////////////////////////////////////////////////////////////
 // The fragment shader for the sky
 /////////////////////////////////////////////////////////////////////////
 
-VARYING vec3 vary_CloudColorSun;
-VARYING vec3 vary_CloudColorAmbient;
-VARYING float vary_CloudDensity;
+in vec3 vary_CloudColorSun;
+in vec3 vary_CloudColorAmbient;
+in float vary_CloudDensity;
 
 uniform sampler2D cloud_noise_texture;
 uniform sampler2D cloud_noise_texture_next;
@@ -46,16 +42,16 @@ uniform vec3 cloud_pos_density2;
 uniform float cloud_scale;
 uniform float cloud_variance;
 
-VARYING vec2 vary_texcoord0;
-VARYING vec2 vary_texcoord1;
-VARYING vec2 vary_texcoord2;
-VARYING vec2 vary_texcoord3;
-VARYING float altitude_blend_factor;
+in vec2 vary_texcoord0;
+in vec2 vary_texcoord1;
+in vec2 vary_texcoord2;
+in vec2 vary_texcoord3;
+in float altitude_blend_factor;
 
 vec4 cloudNoise(vec2 uv)
 {
-   vec4 a = texture2D(cloud_noise_texture, uv);
-   vec4 b = texture2D(cloud_noise_texture_next, uv);
+   vec4 a = texture(cloud_noise_texture, uv);
+   vec4 b = texture(cloud_noise_texture_next, uv);
    vec4 cloud_noise_sample = mix(a, b, blend_factor);
    return cloud_noise_sample;
 }
@@ -118,8 +114,9 @@ void main()
     color.rgb *= 2.0;
 
     /// Gamma correct for WL (soft clip effect).
-    frag_data[0] = vec4(color.rgb, alpha1);
+    frag_data[0] = vec4(0);
     frag_data[1] = vec4(0.0,0.0,0.0,0.0);
     frag_data[2] = vec4(0,0,0,GBUFFER_FLAG_SKIP_ATMOS);
+    frag_data[3] = vec4(color.rgb, alpha1);
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
index 41dd485faecf173de530de85fdc3183a7188d569..fabc61eb5ee34f51d67e7508c8bf97688c7b4e44 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl
@@ -27,11 +27,7 @@
 
 /*[EXTRA_CODE_HERE]*/
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 uniform vec4 color;
 uniform vec3 moonlight_color;
@@ -39,12 +35,7 @@ uniform vec3 moon_dir;
 uniform float moon_brightness;
 uniform sampler2D diffuseMap;
 
-VARYING vec2 vary_texcoord0;
-
-vec3 srgb_to_linear(vec3 c);
-
-/// Soft clips the light with a gamma correction
-vec3 scaleSoftClip(vec3 light);
+in vec2 vary_texcoord0;
 
 void main() 
 {
@@ -53,24 +44,25 @@ void main()
     if( moon_dir.z > 0 )
         fade = clamp( moon_dir.z*moon_dir.z*4.0, 0.0, 1.0 );
 
-    vec4 c      = texture2D(diffuseMap, vary_texcoord0.xy);
+    vec4 c      = texture(diffuseMap, vary_texcoord0.xy);
 
     // SL-14113 Don't write to depth; prevent moon's quad from hiding stars which should be visible
     // Moon texture has transparent pixels <0x55,0x55,0x55,0x00>
     if (c.a <= 2./255.) // 0.00784
+    {
         discard;
+    }
 
-//       c.rgb  = srgb_to_linear(c.rgb);
-         c.rgb *= moonlight_color.rgb;
-         c.rgb *= moon_brightness;
 
-         c.rgb *= fade;
-         c.a   *= fade;
+    c.rgb *= moonlight_color.rgb;
+    c.rgb *= moon_brightness;
 
-         c.rgb  = scaleSoftClip(c.rgb);
+    c.rgb *= fade;
+    c.a   *= fade;
 
-    frag_data[0] = vec4(c.rgb, c.a);
+    frag_data[0] = vec4(0);
     frag_data[1] = vec4(0.0);
     frag_data[2] = vec4(0.0, 0.0, 0.0, GBUFFER_FLAG_HAS_ATMOS);
+    frag_data[3] = vec4(c.rgb, c.a);
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
index 930338cefbc10c00aae26aabf075943780241427..cc4c3b5dced8f91f2d0d84b35ee179f11545af14 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
@@ -22,12 +22,10 @@
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
- 
-/*[EXTRA_CODE_HERE]*/
 
 // Inputs
-VARYING vec3 vary_HazeColor;
-VARYING float vary_LightNormPosDot;
+in vec3 vary_HazeColor;
+in float vary_LightNormPosDot;
 
 uniform sampler2D rainbow_map;
 uniform sampler2D halo_map;
@@ -36,11 +34,9 @@ uniform float moisture_level;
 uniform float droplet_radius;
 uniform float ice_level;
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
+
+vec3 srgb_to_linear(vec3 c);
 
 /////////////////////////////////////////////////////////////////////////
 // The fragment shader for the sky
@@ -63,19 +59,16 @@ vec3 rainbow(float d)
     d = clamp(d, 0.0, 0.25) + interior_coord;
 
     float rad = (droplet_radius - 5.0f) / 1024.0f;
-    return pow(texture2D(rainbow_map, vec2(rad+0.5, d)).rgb, vec3(1.8)) * moisture_level;
+    return pow(texture(rainbow_map, vec2(rad+0.5, d)).rgb, vec3(1.8)) * moisture_level;
 }
 
 vec3 halo22(float d)
 {
     d       = clamp(d, 0.1, 1.0);
     float v = sqrt(clamp(1 - (d * d), 0, 1));
-    return texture2D(halo_map, vec2(0, v)).rgb * ice_level;
+    return texture(halo_map, vec2(0, v)).rgb * ice_level;
 }
 
-/// Soft clips the light with a gamma correction
-vec3 scaleSoftClip(vec3 light);
-
 void main()
 {
     // Potential Fill-rate optimization.  Add cloud calculation 
@@ -91,11 +84,10 @@ void main()
     color.rgb += rainbow(optic_d);
     color.rgb += halo_22;
     color.rgb *= 2.;
-    color.rgb = scaleSoftClip(color.rgb);
 
-    // Gamma correct for WL (soft clip effect).
-    frag_data[0] = vec4(color.rgb, 1.0);
-    frag_data[1] = vec4(0.0,0.0,0.0,0.0);
+    frag_data[0] = vec4(0);
+    frag_data[1] = vec4(0);
     frag_data[2] = vec4(0.0,0.0,0.0,GBUFFER_FLAG_SKIP_ATMOS); //1.0 in norm.w masks off fog
+    frag_data[3] = vec4(color.rgb, 1.0);
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
index cdafdba15c100f0084bd2b6511c443d1a0bd4c86..4f1756c367f1bc1dd63cf4ae0c785d3370437875 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
@@ -25,15 +25,11 @@
 
 /*[EXTRA_CODE_HERE]*/
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
-VARYING vec4 vertex_color;
-VARYING vec2 vary_texcoord0;
-VARYING vec2 screenpos;
+in vec4 vertex_color;
+in vec2 vary_texcoord0;
+in vec2 screenpos;
 
 uniform sampler2D diffuseMap;
 uniform float blend_factor;
@@ -62,8 +58,9 @@ void main()
     col.a = (col.a * factor) * 32.0f;
     col.a *= twinkle();
 
-    frag_data[0] = col;
+    frag_data[0] = vec4(0);
     frag_data[1] = vec4(0.0f);
     frag_data[2] = vec4(0.0, 1.0, 0.0, GBUFFER_FLAG_SKIP_ATMOS);
+    frag_data[3] = col;
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunDiscF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunDiscF.glsl
index e35ea83f0a69849aa44bd73739014c070d662cb4..a85e6ebc66912fb3da321a2aedd8c516d4aa2b47 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunDiscF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunDiscF.glsl
@@ -27,36 +27,29 @@
 
 /*[EXTRA_CODE_HERE]*/
 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_data[3];
-#else
-#define frag_data gl_FragData
-#endif
+out vec4 frag_data[4];
 
 vec3 srgb_to_linear(vec3 c);
-vec3 fullbrightAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
 
 uniform sampler2D diffuseMap;
 uniform sampler2D altDiffuseMap;
 uniform float blend_factor; // interp factor between sunDisc A/B
-VARYING vec2 vary_texcoord0;
-VARYING float sun_fade;
+in vec2 vary_texcoord0;
+in float sun_fade;
 
 void main() 
 {
-    vec4 sunDiscA = texture2D(diffuseMap, vary_texcoord0.xy);
-    vec4 sunDiscB = texture2D(altDiffuseMap, vary_texcoord0.xy);
+    vec4 sunDiscA = texture(diffuseMap, vary_texcoord0.xy);
+    vec4 sunDiscB = texture(altDiffuseMap, vary_texcoord0.xy);
     vec4 c     = mix(sunDiscA, sunDiscB, blend_factor);
 
-    //c.rgb = fullbrightAtmosTransport(c.rgb);
-    c.rgb = fullbrightScaleSoftClip(c.rgb);
 
     // SL-9806 stars poke through
     //c.a *= sun_fade;
 
-    frag_data[0] = c;
+    frag_data[0] = vec4(0);
     frag_data[1] = vec4(0.0f);
     frag_data[2] = vec4(0.0, 1.0, 0.0, GBUFFER_FLAG_SKIP_ATMOS);
+    frag_data[3] = c;
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl b/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl
index b6f080739e6299d990ccf8527f04f53019e43585..a1839d4a6777a11bfaf2e45f678aecb0185c2b35 100644
--- a/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl
@@ -151,7 +151,7 @@ vec4 prefilterEnvMap(vec3 R)
 			// Solid angle of 1 pixel across all cube faces
 			float omegaP = 4.0 * PI / (6.0 * envMapDim * envMapDim);
 			// Biased (+1.0) mip level for better result
-			float mipLevel = roughness == 0.0 ? 0.0 : max(0.5 * log2(omegaS / omegaP) + 1.0, 0.0f);
+			float mipLevel = roughness == 0.0 ? 0.0 : clamp(0.5 * log2(omegaS / omegaP) + 1.0, 0.0f, max_probe_lod);
 			color += textureLod(reflectionProbes, vec4(L, sourceIdx), mipLevel) * dotNL;
 			totalWeight += dotNL;
 		}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl
index 7d8f9c218d110d647d8e000cecfd87b0ba18ea90..0fb30559d41faa148e11594c888c9f97570977ed 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl
@@ -37,7 +37,6 @@ uniform sampler2D depthMap;
 uniform sampler2D diffuseRect;
 uniform sampler2D specularRect;
 uniform sampler2D emissiveRect; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl
-uniform sampler2D     noiseMap;
 uniform sampler2D     lightFunc;
 
 uniform vec3  env_mat[3];
@@ -132,9 +131,6 @@ void main()
     }
     else
     {
-
-        float noise = texture2D(noiseMap, tc).b;
-
         diffuse = srgb_to_linear(diffuse);
         spec.rgb = srgb_to_linear(spec.rgb);
 
@@ -154,7 +150,6 @@ void main()
 
                     float fa         = light_col[i].a;
                     float dist_atten = calcLegacyDistanceAttenuation(dist, fa);
-                    dist_atten *= noise;
 
                     float lit = nl * dist_atten;
 
diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl
index 5ed8a75e0e8a404d1a6b89385cfb9b98a1e6f2e2..30b7895157a67b3d797c66af4ed5f8b4d2b1c146 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl
@@ -41,7 +41,6 @@ uniform sampler2D normalMap;
 uniform sampler2D emissiveRect; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl
 uniform samplerCube environmentMap;
 uniform sampler2D lightMap;
-uniform sampler2D noiseMap;
 uniform sampler2D projectionMap; // rgba
 uniform sampler2D lightFunc;
 
@@ -187,7 +186,6 @@ void main()
         diffuse = srgb_to_linear(diffuse);
         spec.rgb = srgb_to_linear(spec.rgb);
 
-        float noise = texture2D(noiseMap, tc).b;
         if (proj_tc.z > 0.0 &&
             proj_tc.x < 1.0 &&
             proj_tc.y < 1.0 &&
@@ -199,7 +197,7 @@ void main()
 
             if (nl > 0.0)
             {
-                lit = nl * dist_atten * noise;
+                lit = nl * dist_atten;
 
                 dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy );
 
@@ -209,7 +207,7 @@ void main()
                 amb_da += (nl*0.5+0.5) /* * (1.0-shadow) */ * proj_ambiance;
             }
         
-            amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, noise, proj_tc.xy );
+            amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy );
             final_color += diffuse.rgb * amb_rgb;
         }
     
diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
index a6a254391548b83c1c35c905cf866c5a86c63556..bd06a680f540f90dc6202ec5c58d00469504369f 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
@@ -656,7 +656,7 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
         vec2 tc, vec3 pos, vec3 norm, float glossiness)
 {
     // TODO - don't hard code lods
-    float reflection_lods = max_probe_lod-1;
+    float reflection_lods = max_probe_lod;
     preProbeSample(pos);
 
     vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
index dfd1d47b3ec4baec154756d28eb0581a6b0777e4..0e3ebd1534b0bba2032f391de7c1dafe69a25512 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -211,7 +211,7 @@ void main()
     else if (!GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_ATMOS))
     {
         //should only be true of WL sky, just port over base color value
-        color = srgb_to_linear(baseColor.rgb);
+        color = srgb_to_linear(texture2D(emissiveRect, tc).rgb);
     }
     else
     {
diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl
index 3d8b95b882ecbc2d860f31f6034fc65c933cf55f..33ea2129cf43125bc73b8c477fd4a18e626ae5d1 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl
@@ -51,7 +51,6 @@ uniform sampler2D normalMap;
 uniform sampler2D emissiveRect; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl
 uniform samplerCube environmentMap;
 uniform sampler2D lightMap;
-uniform sampler2D noiseMap;
 uniform sampler2D projectionMap; // rgba
 uniform sampler2D lightFunc;
 
@@ -193,7 +192,6 @@ void main()
         diffuse = srgb_to_linear(diffuse);
         spec.rgb = srgb_to_linear(spec.rgb);
         
-        float noise = texture2D(noiseMap, tc).b;
         if (proj_tc.z > 0.0 &&
             proj_tc.x < 1.0 &&
             proj_tc.y < 1.0 &&
@@ -205,7 +203,7 @@ void main()
 
             if (nl > 0.0)
             {
-                lit = nl * dist_atten * noise;
+                lit = nl * dist_atten;
 
                 dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy );
 
@@ -214,7 +212,7 @@ void main()
                 amb_da += (nl*0.5+0.5) /* * (1.0-shadow) */ * proj_ambiance;
             }
 
-            vec3 amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, noise, proj_tc.xy );
+            vec3 amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy );
             final_color += diffuse.rgb*amb_rgb;
   #if DEBUG_LEG_LIGHT_TYPE
             final_color = vec3(0,0.5,0);
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index d88f0f9847ee1ed8151b43f30067f46956f1e17e..c59fad82a47f6f94d10e3a5c9175723ad309400f 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -1758,7 +1758,11 @@ void LLEnvironment::updateGLVariablesForSettings(LLShaderUniforms* uniforms, con
             { // maximize and remove tinting if this is an irradiance map render pass and the parameter feeds into the sky background color
                 auto max_vec = [](LLVector4 col)
                 {
-                    col.mV[0] = col.mV[1] = col.mV[2] = llmax(llmax(col.mV[0], col.mV[1]), col.mV[2]);
+                    LLColor3 color(col);
+                    F32 h, s, l;
+                    color.calcHSL(&h, &s, &l);
+
+                    col.mV[0] = col.mV[1] = col.mV[2] = l;
                     return col;
                 };
 
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index c664dbbe9e39455c0078c85a4d455fc2c9b61e6a..58ce571505fabeb9e737c404a409d180331146ec 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -1018,7 +1018,7 @@ void LLReflectionMapManager::initReflectionMaps()
         mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2);
 
         mIrradianceMaps = new LLCubeMapArray();
-        mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 4, mReflectionProbeCount, FALSE);
+        mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 3, mReflectionProbeCount, FALSE);
     }
 
     if (mVertexBuffer.isNull())