diff --git a/projects/voxelization/resources/shaders/shadow.frag b/projects/voxelization/resources/shaders/shadow.frag
index 83500f941e5b74f640e5558e69d97b8d872b3821..067b3798a9324f6ce68c302e578f5131b7a2c9c3 100644
--- a/projects/voxelization/resources/shaders/shadow.frag
+++ b/projects/voxelization/resources/shaders/shadow.frag
@@ -2,7 +2,7 @@
 #extension GL_ARB_separate_shader_objects : enable
 #extension GL_GOOGLE_include_directive : enable
 
-#include "shadowMapping.inc"
+#include "lightInfo.inc"
 
 layout(set=0, binding=0) uniform LightInfoBuffer {
     LightInfo lightInfo;
@@ -14,6 +14,6 @@ layout(location = 0) in vec4 passPos;
 
 void main()	{
     float z         = passPos.z / passPos.w;
-    vec2  zWarped   = applyDepthWarp(z,     lightInfo.warps);
-    outMoments      = vec4(zWarped, zWarped*zWarped);
+    float z2        = z*z;   
+    outMoments      = vec4(z, z2, z2*z, z2*z2);
 }
\ No newline at end of file
diff --git a/projects/voxelization/resources/shaders/shadowMapping.inc b/projects/voxelization/resources/shaders/shadowMapping.inc
index 91461c91c111ff66c463ca7dbf8d837dcf1bc9c6..7f92067fb978ec6ae9d6f0d89bc3f7b966b3e83e 100644
--- a/projects/voxelization/resources/shaders/shadowMapping.inc
+++ b/projects/voxelization/resources/shaders/shadowMapping.inc
@@ -3,30 +3,39 @@
 
 #include "lightInfo.inc"
 
-vec2 applyDepthWarp(float z, vec2 warp){
-    z               = 2 * z - 1;
-    float positive  =  exp( z * warp.x);
-    float negative  = -exp(-z * warp.y);
-    return vec2(positive, negative);
-}
-
-float rescale(float a, float b, float v)
+// nice math blob from the moment shadow mapping presentation
+float ComputeMSMShadowIntensity(vec4 _4Moments, float FragmentDepth, float DepthBias, float MomentBias)
 {
-    return clamp((v - a) / (b - a), 0, 1);
-}
-
-float reduceVSMBleeding(float shadowValue, float newMin)
-{
-   return rescale(newMin, 1.0f, shadowValue);
-}
-
-float chebyshevInequality(float mean, float meanSquare, float sampleIn){
-    float variance  = meanSquare -  mean * mean;
-    float d         = sampleIn - mean;
-    float pMax      = clamp(variance / (variance + d*d), 0, 1);
-    pMax            = reduceVSMBleeding(pMax, 0.1);
-    
-    return pMax;
+    vec4 b=mix(_4Moments, vec4(0.5f,0.5f,0.5f,0.5f),MomentBias);
+    vec3 z;
+    z[0]=FragmentDepth-DepthBias;
+    float L32D22=-b[0] * b[1] + b[2];
+    float D22= -b[0] * b[0] + b[1];
+    float SquaredDepthVariance=-b[1]*b[1]+b[3];
+    float D33D22=dot(vec2(SquaredDepthVariance,-L32D22),
+                     vec2(D22,                  L32D22));
+                     
+    float InvD22=1.0f/D22;
+    float L32=L32D22*InvD22;
+    vec3 c=vec3(1.0f,z[0],z[0]*z[0]);
+    c[1]-=b.x;
+    c[2]-=b.y+L32*c[1];
+    c[1]*=InvD22;
+    c[2]*=D22/D33D22;
+    c[1]-=L32*c[2];
+    c[0]-=dot(c.yz,b.xy);
+    float p=c[1]/c[2];
+    float q=c[0]/c[2];
+    float r=sqrt((p*p*0.25f)-q);
+    z[1]=-p*0.5f-r;
+    z[2]=-p*0.5f+r;
+    vec4 Switch=
+    	(z[2]<z[0])?vec4(z[1],z[0],1.0f,1.0f):(
+    	(z[1]<z[0])?vec4(z[0],z[1],0.0f,1.0f):
+    	vec4(0.0f,0.0f,0.0f,0.0f));
+    float Quotient=(Switch[0]*z[2]-b[0]*(Switch[0]+z[2])+b[1])
+                  /((z[2]-Switch[1])*(z[0]-z[1]));
+    return clamp(Switch[2]+Switch[3]*Quotient, 0, 1);
 }
 
 float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sampler shadowMapSampler){
@@ -39,17 +48,13 @@ float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sample
     }
     
     lightPos.z          = clamp(lightPos.z, 0, 1);
-    vec2 warpedSample   = applyDepthWarp(lightPos.z, lightInfo.warps);
-    
-    // using exponential variance shadow mapping
-    vec4 shadowMapSample    = texture(sampler2D(shadowMap, shadowMapSampler), lightPos.xy);
-    vec2 positiveMoments    = shadowMapSample.rb;
-    vec2 negativeMoments    = shadowMapSample.ga;
-
-    float s1                = chebyshevInequality(positiveMoments.r, positiveMoments.g, warpedSample.x);
-    float s2                = chebyshevInequality(negativeMoments.r, negativeMoments.g, warpedSample.y);
 
-    return min(s1, s2);
+    vec4 shadowMapSample    = texture(sampler2D(shadowMap, shadowMapSampler), lightPos.xy);
+    
+    float depthBias     = 0.f;
+    float momentBias    = 0.000002;
+    
+    return 1-ComputeMSMShadowIntensity(shadowMapSample, lightPos.z, depthBias, momentBias);
 }
 
 #endif // #ifndef SHADOW_MAPPING_INC
\ No newline at end of file