diff --git a/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflUtil.glsl b/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflUtil.glsl
index b2d1e75d04bc4234ce208d97d316cb3e972589a1..f14f7eac8d33214be9d380ef7044a208de5e499e 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflUtil.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/screenSpaceReflUtil.glsl
@@ -36,7 +36,7 @@ uniform mat4 inv_modelview_delta;
 
 vec4 getPositionWithDepth(vec2 pos_screen, float depth);
 
-float random (vec2 uv) 
+float random (vec2 uv)
 {
     return fract(sin(dot(uv, vec2(12.9898, 78.233))) * 43758.5453123); //simple random function
 }
@@ -75,7 +75,7 @@ float getLinearDepth(vec2 tc)
     return -pos.z;
 }
 
-bool traceScreenRay(vec3 position, vec3 reflection, out vec4 hitColor, out float hitDepth, float depth, sampler2D textureFrame) 
+bool traceScreenRay(vec3 position, vec3 reflection, out vec4 hitColor, out float hitDepth, float depth, sampler2D textureFrame)
 {
     // transform position and reflection into same coordinate frame as the sceneMap and sceneDepth
     reflection += position;
@@ -93,22 +93,27 @@ bool traceScreenRay(vec3 position, vec3 reflection, out vec4 hitColor, out float
     bool hit = false;
     hitColor = vec4(0);
     
-    
     int i = 0;
-    if (depth > depthRejectBias) 
+    if (depth > depthRejectBias)
     {
-        for (; i < iterationCount && !hit; i++) 
+        for (; i < iterationCount && !hit; i++)
         {
             screenPosition = generateProjectedPosition(marchingPosition);
+            if (screenPosition.x > 1 || screenPosition.x < 0 ||
+                screenPosition.y > 1 || screenPosition.y < 0)
+            {
+                hit = false;
+                break;
+            }
             depthFromScreen = getLinearDepth(screenPosition);
             delta = abs(marchingPosition.z) - depthFromScreen;
             
-            if (depth < depthFromScreen + epsilon && depth > depthFromScreen - epsilon) 
+            if (depth < depthFromScreen + epsilon && depth > depthFromScreen - epsilon)
             {
                 break;
             }
 
-            if (abs(delta) < distanceBias) 
+            if (abs(delta) < distanceBias)
             {
                 vec4 color = vec4(1);
                 if(debugDraw)
@@ -118,7 +123,7 @@ bool traceScreenRay(vec3 position, vec3 reflection, out vec4 hitColor, out float
                 hit = true;
                 break;
             }
-            if (isBinarySearchEnabled && delta > 0) 
+            if (isBinarySearchEnabled && delta > 0)
             {
                 break;
             }
@@ -130,7 +135,7 @@ bool traceScreenRay(vec3 position, vec3 reflection, out vec4 hitColor, out float
                 step = step * (1.0 - rayStep * max(directionSign, 0.0));
                 marchingPosition += step * (-directionSign);
             }
-            else 
+            else
             {
                 marchingPosition += step;
             }
@@ -148,15 +153,21 @@ bool traceScreenRay(vec3 position, vec3 reflection, out vec4 hitColor, out float
                 marchingPosition = marchingPosition - step * sign(delta);
                 
                 screenPosition = generateProjectedPosition(marchingPosition);
+                if (screenPosition.x > 1 || screenPosition.x < 0 ||
+                    screenPosition.y > 1 || screenPosition.y < 0)
+                {
+                    hit = false;
+                    break;
+                }
                 depthFromScreen = getLinearDepth(screenPosition);
                 delta = abs(marchingPosition.z) - depthFromScreen;
 
-                if (depth < depthFromScreen + epsilon && depth > depthFromScreen - epsilon) 
+                if (depth < depthFromScreen + epsilon && depth > depthFromScreen - epsilon)
                 {
                     break;
                 }
 
-                if (abs(delta) < distanceBias && depthFromScreen != (depth - distanceBias)) 
+                if (abs(delta) < distanceBias && depthFromScreen != (depth - distanceBias))
                 {
                     vec4 color = vec4(1);
                     if(debugDraw)
@@ -326,8 +337,8 @@ collectedColor = vec4(1, 0, 1, 1);
     float jitter = mod( c, 1.0);
     
     vec2 screenpos = 1 - abs(tc * 2 - 1);
-    float vignette = clamp((abs(screenpos.x) * abs(screenpos.y)) * 64,0, 1);
-    vignette *= clamp((dot(normalize(viewPos), n) * 0.5 + 0.5) * 16, 0, 1);
+    float vignette = clamp((abs(screenpos.x) * abs(screenpos.y)) * 16,0, 1);
+    vignette *= clamp((dot(normalize(viewPos), n) * 0.5 + 0.5) * 5.5 - 0.8, 0, 1);
     
     float zFar = 128.0;
     vignette *= clamp(1.0+(viewPos.z/zFar), 0.0, 1.0);
@@ -345,7 +356,7 @@ collectedColor = vec4(1, 0, 1, 1);
     {
         if (vignette > 0)
         {
-            for (int i = 0; i < totalSamples; i++) 
+            for (int i = 0; i < totalSamples; i++)
             {
                 vec3 firstBasis = normalize(cross(getPoissonSample(i), rayDirection));
                 vec3 secondBasis = normalize(cross(rayDirection, firstBasis));
@@ -358,7 +369,7 @@ collectedColor = vec4(1, 0, 1, 1);
 
                 hitpoint.a = 0;
 
-                if (hit) 
+                if (hit)
                 {
                     ++hits;
                     collectedColor += hitpoint;