瀏覽代碼

Simplified shadowmap_fragment.

Mr.doob 9 年之前
父節點
當前提交
aaeea271af
共有 1 個文件被更改,包括 23 次插入77 次删除
  1. 23 77
      src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl

+ 23 - 77
src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl

@@ -6,7 +6,7 @@ vec3 shadowMask = vec3( 1.0 );
 
 	for ( int i = 0; i < NUM_SHADOWS; i ++ ) {
 
-		float texelSizeY =  1.0 / shadowMapSize[ i ].y;
+		float texelSizeY = 1.0 / shadowMapSize[ i ].y;
 
 		float shadow = 0.0;
 
@@ -87,7 +87,7 @@ vec3 shadowMask = vec3( 1.0 );
 
 #endif // POINT_LIGHT_SHADOWS
 
-			float texelSizeX =  1.0 / shadowMapSize[ i ].x;
+			float texelSizeX = 1.0 / shadowMapSize[ i ].x;
 
 			vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;
 
@@ -103,83 +103,34 @@ vec3 shadowMask = vec3( 1.0 );
 
 			if ( frustumTest ) {
 
-	#if defined( SHADOWMAP_TYPE_PCF )
-
-				// Percentage-close filtering
-				// (9 pixel kernel)
-				// http://fabiensanglard.net/shadowmappingPCF/
-
-				/*
-						// nested loops breaks shader compiler / validator on some ATI cards when using OpenGL
-						// must enroll loop manually
-					for ( float y = -1.25; y <= 1.25; y += 1.25 )
-						for ( float x = -1.25; x <= 1.25; x += 1.25 ) {
-							vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );
-									// doesn't seem to produce any noticeable visual difference compared to simple texture2D lookup
-									//vec4 rgbaDepth = texture2DProj( shadowMap[ i ], vec4( vShadowCoord[ i ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ i ].w ) );
-							float fDepth = unpackDepth( rgbaDepth );
-							if ( fDepth < shadowCoord.z )
-								shadow += 1.0;
-					}
-					shadow /= 9.0;
-				*/
-
 				shadowCoord.z += shadowBias[ i ];
 
-				const float ShadowDelta = 1.0 / 9.0;
-
-				float xPixelOffset = texelSizeX;
-				float yPixelOffset = texelSizeY;
-
-				float dx0 = - 1.25 * xPixelOffset;
-				float dy0 = - 1.25 * yPixelOffset;
-				float dx1 = 1.25 * xPixelOffset;
-				float dy1 = 1.25 * yPixelOffset;
-
-				float fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );
-				if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;
-
-				fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );
-				if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;
-
-				fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );
-				if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;
-
-				fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );
-				if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;
-
-				fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );
-				if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;
-
-				fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );
-				if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;
-
-				fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );
-				if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;
-
-				fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );
-				if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;
+	#if defined( SHADOWMAP_TYPE_PCF )
 
-				fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );
-				if ( fDepth < shadowCoord.z ) shadow += ShadowDelta;
+				float dx0 = - texelSizeX;
+				float dy0 = - texelSizeY;
+				float dx1 = + texelSizeX;
+				float dy1 = + texelSizeY;
+
+				shadow += step( unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) ), shadowCoord.z );
+				shadow += step( unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) ), shadowCoord.z );
+				shadow += step( unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) ), shadowCoord.z );
+				shadow += step( unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) ), shadowCoord.z );
+				shadow += step( unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) ), shadowCoord.z );
+				shadow += step( unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) ), shadowCoord.z );
+				shadow += step( unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) ), shadowCoord.z );
+				shadow += step( unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) ), shadowCoord.z );
+				shadow += step( unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) ), shadowCoord.z );
+				shadow *= 1.0 / 9.0;
 
 				shadow *= shadowDarkness[ i ];
 
 	#elif defined( SHADOWMAP_TYPE_PCF_SOFT )
 
-				// Percentage-close filtering
-				// (9 pixel kernel)
-				// http://fabiensanglard.net/shadowmappingPCF/
-
-				shadowCoord.z += shadowBias[ i ];
-
-				float xPixelOffset = texelSizeX;
-				float yPixelOffset = texelSizeY;
-
-				float dx0 = - 1.0 * xPixelOffset;
-				float dy0 = - 1.0 * yPixelOffset;
-				float dx1 = 1.0 * xPixelOffset;
-				float dy1 = 1.0 * yPixelOffset;
+				float dx0 = - texelSizeX;
+				float dy0 = - texelSizeY;
+				float dx1 = + texelSizeX;
+				float dy1 = + texelSizeY;
 
 				mat3 shadowKernel;
 				mat3 depthKernel;
@@ -219,13 +170,8 @@ vec3 shadowMask = vec3( 1.0 );
 
 	#else // no percentage-closer filtering:
 
-				shadowCoord.z += shadowBias[ i ];
-
 				vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );
-				float fDepth = unpackDepth( rgbaDepth );
-
-				if ( fDepth < shadowCoord.z )
-					shadow = shadowDarkness[ i ];
+				shadow = step( unpackDepth( rgbaDepth ), shadowCoord.z ) * shadowDarkness[ i ];
 
 	#endif