 			return blockerDepthSum / float( numBlockers );
 		}
 
-		float PCF_Filter(sampler2D shadowMap, vec2 uv, float zReceiverClipSpace, float filterRadius, const in vec2 randomSeed ) {
+		float PCF_Filter(sampler2D shadowMap, vec2 uv, float zReceiverClipSpace, float filterRadius ) {
 			float sum = 0.0;
-			float angle = rand( randomSeed ) * PI2;
-			float s = sin(angle);
-			float c = cos(angle);
+
 			for( int i = 0; i < PCF_NUM_SAMPLES; i ++ ) {
-				#ifdef ROTATE_POISSON_SAMPLES
-					vec2 poissonSample = vec2(poissonDisk[i].y * c + poissonDisk[i].x * s, poissonDisk[i].y * -s + poissonDisk[i].x * c);
-				#else
-					vec2 poissonSample = poissonDisk[i];
-				#endif
-				float depth = unpackRGBAToDepth( texture2D( shadowMap, uv + poissonSample * filterRadius ) );
-				if( zReceiverClipSpace <= depth ) sum += 1.0;
+
+				vec2 offset = poissonDisk[i] * filterRadius;
+
+				float depth1 = unpackRGBAToDepth( texture2D( shadowMap, uv + offset ) );
+				if( zReceiverClipSpace <= depth1 ) sum += 1.0;
+
+				float depth2 = unpackRGBAToDepth( texture2D( shadowMap, uv + -offset.yx ) );
+				if( zReceiverClipSpace <= depth2 ) sum += 1.0;
+
 			}
-			for( int i = 0; i < PCF_NUM_SAMPLES; i ++ ) {
-				#ifdef ROTATE_POISSON_SAMPLES
-					vec2 poissonSample = vec2(poissonDisk[i].y * c + poissonDisk[i].x * s, poissonDisk[i].y * -s + poissonDisk[i].x * c);
-				#else
-					vec2 poissonSample = poissonDisk[i];
-				#endif
-				float depth = unpackRGBAToDepth( texture2D( shadowMap, uv + -poissonSample.yx * filterRadius ) );
-				if( zReceiverClipSpace <= depth ) sum += 1.0;
-			}
+
 			return sum / ( 2.0 * float( PCF_NUM_SAMPLES ) );
 		}
 
 		float PCSS ( sampler2D shadowMap, vec4 coords ) {
+
 			vec2 uv = coords.xy;
 			float zReceiverClipSpace = coords.z;
 			float zReceiverLightSpace = -perspectiveDepthToViewZ( zReceiverClipSpace, LIGHT_NEAR_PLANE, LIGHT_FAR_PLANE );
 
 			initPoissonSamples( uv );
+			
 			// STEP 1: blocker search
-			float avgBlockerDepthClipSpace = findBlocker( shadowMap, uv, zReceiverClipSpace, zReceiverLightSpace, uv );
+			float avgBlockerDepthClipSpace = findBlocker( shadowMap, uv, zReceiverClipSpace, zReceiverLightSpace );
 
 			//There are no occluders so early out (this saves filtering)
 			if( avgBlockerDepthClipSpace == -1.0 ) return 1.0;


			// STEP 3: filtering
			//return avgBlockerDepth;
			return PCF_Filter( shadowMap, uv, zReceiverClipSpace, filterRadius, uv );
		}

	#endif


		vec2 poissonDisk[NUM_SAMPLES];

		void initPoissonSamples( const in vec2 randomSeed )	{
			poissonDisk[0] = vec2(-0.94201624, -0.39906216 );
			poissonDisk[1] = vec2( 0.94558609, -0.76890725 );
			poissonDisk[2] = vec2( -0.094184101, -0.92938870 );
