diff --git a/assets/voxygen/shaders/clouds-frag.glsl b/assets/voxygen/shaders/clouds-frag.glsl
index e6d96cf472..2f2ac74331 100644
--- a/assets/voxygen/shaders/clouds-frag.glsl
+++ b/assets/voxygen/shaders/clouds-frag.glsl
@@ -114,19 +114,9 @@ void main() {
         vec3 cam_wpos = cam_pos.xyz + focus_off.xyz;
         float rain_dist = 150.0;
         for (int i = 0; i < 7; i ++) {
+            float old_rain_dist = rain_dist;
             rain_dist *= 0.3;
 
-            vec3 rpos = vec3(vec2(dir_2d), view_pos.y) * rain_dist;
-            float dist_to_rain = length(rpos);
-            if (dist < dist_to_rain || cam_wpos.z + rpos.z > CLOUD_AVG_ALT) {
-                    continue;
-                }
-
-            if (dot(rpos * vec3(1, 1, 0.5), rpos) < 1.0) {
-                break;
-            }
-            float rain_density = rain_density_at(cam_wpos.xy + rpos.xy) * rain_occlusion_at(cam_pos.xyz + rpos.xyz) * 10.0;
-
             vec2 drop_density = vec2(30, 1);
             vec2 drop_size = vec2(0.0008, 0.05);
 
@@ -134,6 +124,23 @@ void main() {
             rain_pos += vec2(0, tick.x * fall_rate + cam_wpos.z);
 
             vec2 cell = floor(rain_pos * drop_density) / drop_density;
+
+            float drop_depth = mix(
+                old_rain_dist,
+                rain_dist,
+                fract(hash(fract(vec4(cell, rain_dist, 0) * 0.1)))
+            );
+            vec3 rpos = vec3(vec2(dir_2d), view_pos.y) * drop_depth;
+            float dist_to_rain = length(rpos);
+            if (dist < dist_to_rain || cam_wpos.z + rpos.z > CLOUD_AVG_ALT) {
+                continue;
+            }
+
+            if (dot(rpos * vec3(1, 1, 0.5), rpos) < 1.0) {
+                break;
+            }
+            float rain_density = rain_density_at(cam_wpos.xy + rpos.xy) * rain_occlusion_at(cam_pos.xyz + rpos.xyz) * 10.0;
+
             if (fract(hash(fract(vec4(cell, rain_dist, 0) * 0.01))) > rain_density) {
                 continue;
             }
diff --git a/assets/voxygen/shaders/include/rain_occlusion.glsl b/assets/voxygen/shaders/include/rain_occlusion.glsl
index 1a7a3fe4e0..b85b4c44cc 100644
--- a/assets/voxygen/shaders/include/rain_occlusion.glsl
+++ b/assets/voxygen/shaders/include/rain_occlusion.glsl
@@ -16,7 +16,7 @@ uniform u_rain_occlusion {
 
 float rain_occlusion_at(in vec3 fragPos)
 {
-    float bias = 0.000;
+    float bias = 0.5;
     float diskRadius = 0.01;
     const vec3 sampleOffsetDirections[20] = vec3[]
     (
@@ -27,10 +27,10 @@ float rain_occlusion_at(in vec3 fragPos)
        vec3( 0,  1,  1), vec3( 0, -1,  1), vec3( 0, -1, -1), vec3( 0,  1, -1)
     );
 
-    vec4 rain_pos = occlusion_texture_mat * vec4(fragPos, 1.0);
+    vec4 rain_pos = occlusion_texture_mat * vec4(fragPos - vec3(0, 0, bias), 1.0);
 
     float visibility = textureProj(sampler2DShadow(t_directed_occlusion_maps, s_directed_occlusion_maps), rain_pos);
 
     return visibility;
 }
-#endif
\ No newline at end of file
+#endif