Просмотр исходного кода

WebGLRenderer: Fix remaining shadow issues with reversed depth. (#32751)

Michael Herzog 1 месяц назад
Родитель
Сommit
3fbfa2c606

+ 25 - 36
src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js

@@ -132,14 +132,24 @@ export default /* glsl */`
 				float radius = shadowRadius * texelSize.x;
 
 				// Use IGN to rotate sampling pattern per pixel
-				float phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718; // 2*PI
+				float phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;
+
+				#ifdef USE_REVERSED_DEPTH_BUFFER
+
+					float dp = 1.0 - shadowCoord.z;
+
+				#else
+
+					float dp = shadowCoord.z;
+
+				#endif
 
 				shadow = (
-					texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +
-					texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +
-					texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +
-					texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +
-					texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )
+					texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, dp ) ) +
+					texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, dp ) ) +
+					texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, dp ) ) +
+					texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, dp ) ) +
+					texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, dp ) )
 				) * 0.2;
 
 			}
@@ -167,15 +177,7 @@ export default /* glsl */`
 				float mean = distribution.x;
 				float variance = distribution.y * distribution.y;
 
-				#ifdef USE_REVERSED_DEPTH_BUFFER
-
-					float hard_shadow = step( mean, shadowCoord.z );
-
-				#else
-
-					float hard_shadow = step( shadowCoord.z, mean );
-
-				#endif
+				float hard_shadow = step( shadowCoord.z, mean );
 
 				// Early return if fully lit
 				if ( hard_shadow == 1.0 ) {
@@ -224,14 +226,12 @@ export default /* glsl */`
 
 				#ifdef USE_REVERSED_DEPTH_BUFFER
 
-					shadow = step( depth, shadowCoord.z );
-
-				#else
-
-					shadow = step( shadowCoord.z, depth );
+					depth = 1.0 - depth;
 
 				#endif
 
+				shadow = step( shadowCoord.z, depth );
+
 			}
 
 			return mix( 1.0, shadow, shadowIntensity );
@@ -287,7 +287,7 @@ export default /* glsl */`
 			vec3 bitangent = cross( bd3D, tangent );
 
 			// Use IGN to rotate sampling pattern per pixel
-			float phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;
+			float phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;
 
 			vec2 sample0 = vogelDiskSample( 0, 5, phi );
 			vec2 sample1 = vogelDiskSample( 1, 5, phi );
@@ -328,16 +328,7 @@ export default /* glsl */`
 
 			// viewZ to perspective depth
 
-			#ifdef USE_REVERSED_DEPTH_BUFFER
-
-				float dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );
-
-			#else
-
-				float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );
-
-			#endif
-
+			float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );
 			dp += shadowBias;
 
 			// Direction from light to fragment
@@ -347,14 +338,12 @@ export default /* glsl */`
 
 			#ifdef USE_REVERSED_DEPTH_BUFFER
 
-				shadow = step( depth, dp );
-
-			#else
-
-				shadow = step( dp, depth );
+				depth = 1.0 - depth;
 
 			#endif
 
+			shadow = step( dp, depth );
+
 		}
 
 		return mix( 1.0, shadow, shadowIntensity );

+ 7 - 0
src/renderers/shaders/ShaderLib/vsm.glsl.js

@@ -33,6 +33,13 @@ void main() {
 		#else
 
 			float depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;
+
+			#ifdef USE_REVERSED_DEPTH_BUFFER
+
+				depth = 1.0 - depth;
+
+			#endif
+
 			mean += depth;
 			squared_mean += depth * depth;
 

粤ICP备19079148号