|
@@ -1,53 +1,38 @@
|
|
|
export default /* glsl */`
|
|
|
-#if defined( USE_SHADOWMAP ) || ( NUM_SPOT_LIGHT_COORDS > 0 )
|
|
|
|
|
|
- #if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_COORDS > 0 || NUM_POINT_LIGHT_SHADOWS > 0
|
|
|
+#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )
|
|
|
|
|
|
- // Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.
|
|
|
- vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );
|
|
|
- vec4 shadowWorldPosition;
|
|
|
+ // Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.
|
|
|
+ vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );
|
|
|
+ vec4 shadowWorldPosition;
|
|
|
|
|
|
- #endif
|
|
|
-
|
|
|
- #if NUM_DIR_LIGHT_SHADOWS > 0
|
|
|
-
|
|
|
- #pragma unroll_loop_start
|
|
|
- for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {
|
|
|
-
|
|
|
- shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );
|
|
|
- vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;
|
|
|
-
|
|
|
- }
|
|
|
- #pragma unroll_loop_end
|
|
|
+#endif
|
|
|
|
|
|
- #endif
|
|
|
+#if defined( USE_SHADOWMAP )
|
|
|
|
|
|
- #if NUM_SPOT_LIGHT_COORDS > 0
|
|
|
+ #if NUM_DIR_LIGHT_SHADOWS > 0
|
|
|
|
|
|
- #pragma unroll_loop_start
|
|
|
- for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {
|
|
|
+ #pragma unroll_loop_start
|
|
|
+ for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {
|
|
|
|
|
|
- shadowWorldPosition = worldPosition;
|
|
|
- #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )
|
|
|
- shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;
|
|
|
- #endif
|
|
|
- vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;
|
|
|
+ shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );
|
|
|
+ vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;
|
|
|
|
|
|
- }
|
|
|
- #pragma unroll_loop_end
|
|
|
+ }
|
|
|
+ #pragma unroll_loop_end
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if NUM_POINT_LIGHT_SHADOWS > 0
|
|
|
|
|
|
- #pragma unroll_loop_start
|
|
|
- for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {
|
|
|
+ #pragma unroll_loop_start
|
|
|
+ for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {
|
|
|
|
|
|
- shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );
|
|
|
- vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;
|
|
|
+ shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );
|
|
|
+ vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;
|
|
|
|
|
|
- }
|
|
|
- #pragma unroll_loop_end
|
|
|
+ }
|
|
|
+ #pragma unroll_loop_end
|
|
|
|
|
|
#endif
|
|
|
|
|
@@ -60,4 +45,24 @@ export default /* glsl */`
|
|
|
*/
|
|
|
|
|
|
#endif
|
|
|
+
|
|
|
+// spot lights can be evaluated without active shadow mapping (when SpotLight.map is used)
|
|
|
+
|
|
|
+#if NUM_SPOT_LIGHT_COORDS > 0
|
|
|
+
|
|
|
+ #pragma unroll_loop_start
|
|
|
+ for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {
|
|
|
+
|
|
|
+ shadowWorldPosition = worldPosition;
|
|
|
+ #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )
|
|
|
+ shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;
|
|
|
+ #endif
|
|
|
+ vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;
|
|
|
+
|
|
|
+ }
|
|
|
+ #pragma unroll_loop_end
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
`;
|