diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index 09bb6c5bb884ffc9f2d33fdfd483974a89142746..c8f4d7c570f58e6b80ab2c96f22b30d78c508106 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -42,6 +42,9 @@ vec3 scaleSoftClipFrag(vec3 l);
 
 void calcFragAtmospherics(vec3 inPositionEye, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten);
 
+vec3 srgb_to_linear(vec3 cs);
+vec3 linear_to_srgb(vec3 cs);
+
 #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
 
 #ifdef DEFINE_GL_FRAGCOLOR
@@ -199,7 +202,7 @@ void main()
 #endif
 
 #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
-    vec3 gamma_diff = diffcol.rgb;
+    vec3 gamma_diff = linear_to_srgb(diffcol.rgb);
 #endif
 
 #if HAS_SPECULAR_MAP
@@ -332,6 +335,7 @@ void main()
     }
 
     col = atmosFragLighting(col, additive, atten);
+    col = scaleSoftClipFrag(col);
 
     vec3 npos = normalize(-pos.xyz);
             
@@ -352,7 +356,8 @@ void main()
     glare = min(glare, 1.0);
     float al = max(diffcol.a,glare)*vertex_color.a;
 
-    col = scaleSoftClipFrag(col);
+    //convert to gamma space for display on screen
+    col.rgb = linear_to_srgb(col.rgb);
 
 #ifdef WATER_FOG
     vec4 temp = applyWaterFogView(pos, vec4(col.rgb, al));
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
index cbc19bbba34476a4811f655ca22eabade9d3bf80..058e939ec8f0b6820a5e6461c71546915f9331d0 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
@@ -44,8 +44,8 @@ vec3 linear_to_srgb(vec3 cl);
 
 void main() 
 {
-	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord);
-	diff.rgb = linear_to_srgb(diff.rgb);
-	frag_color = diff;
+    vec4 diff = texture2DRect(diffuseRect, vary_fragcoord);
+    diff.rgb = linear_to_srgb(diff.rgb);
+    frag_color = diff;
 }
 
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
index efcf848ab10e3ecd86672e3a1a4f958c2f7dbd95..565c00ba798731bcba0663f6332ef8b1220c5955 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
@@ -67,7 +67,11 @@ vec3 atmosLighting(vec3 light)
 void calcFragAtmospherics(vec3 inPositionEye, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten) {
 
     vec3 P = inPositionEye;
-    
+   
+    //(TERRAIN) limit altitude
+    if (P.y > max_y) P *= (max_y / P.y);
+    if (P.y < -max_y) P *= (-max_y / P.y); 
+
     vec3 tmpLightnorm = lightnorm.xyz;
 
     vec3 Pn = normalize(P);
@@ -93,7 +97,7 @@ void calcFragAtmospherics(vec3 inPositionEye, float ambFactor, out vec3 sunlit,
     //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
     temp2.y = max(0.0, tmpLightnorm.y);
     temp2.y = 1. / temp2.y;
-    sunlight *= exp( - light_atten * temp2.y);
+    sunlight *= exp(-light_atten * temp2.y);
 
     // main atmospheric scattering line integral
     temp2.z = Plen * density_multiplier;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 8bc8de3dbae4421b46c59f9fd04d03c4526db6ba..efb3b7c69b67007e2504dc553660ce6b085fb5ae 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8507,6 +8507,8 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
     shader.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff);
     shader.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff);
     
+    LLEnvironment& environment = LLEnvironment::instance();
+    shader.uniform1i(LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp() ? 1 : 0);
 
     if (shader.getUniformLocation(LLShaderMgr::DEFERRED_NORM_MATRIX) >= 0)
     {