|
@@ -79,6 +79,14 @@ IncidentLight directLight;
|
|
|
#endif
|
|
|
|
|
|
#if defined( USE_SHADOWMAP ) && defined( CSM_FADE )
|
|
|
+ vec2 cascade;
|
|
|
+ float cascadeCenter;
|
|
|
+ float closestEdge;
|
|
|
+ float margin;
|
|
|
+ float csmx;
|
|
|
+ float csmy;
|
|
|
+
|
|
|
+ #unroll_loop_start
|
|
|
for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
|
|
|
|
|
|
directionalLight = directionalLights[ i ];
|
|
@@ -86,23 +94,23 @@ IncidentLight directLight;
|
|
|
|
|
|
// NOTE: Depth gets larger away from the camera.
|
|
|
// cascade.x is closer, cascade.y is further
|
|
|
- vec2 cascade = CSM_cascades[ i ];
|
|
|
- float cascadeCenter = ( cascade.x + cascade.y ) / 2.0;
|
|
|
- float closestEdge = linearDepth < cascadeCenter ? cascade.x : cascade.y;
|
|
|
- float margin = 0.25 * pow( closestEdge, 2.0 );
|
|
|
- float csmx = cascade.x - margin / 2.0;
|
|
|
- float csmy = cascade.y + margin / 2.0;
|
|
|
- if( i < NUM_DIR_LIGHT_SHADOWS && linearDepth >= csmx && ( linearDepth < csmy || i == CSM_CASCADES - 1 ) ) {
|
|
|
+ cascade = CSM_cascades[ i ];
|
|
|
+ cascadeCenter = ( cascade.x + cascade.y ) / 2.0;
|
|
|
+ closestEdge = linearDepth < cascadeCenter ? cascade.x : cascade.y;
|
|
|
+ margin = 0.25 * pow( closestEdge, 2.0 );
|
|
|
+ csmx = cascade.x - margin / 2.0;
|
|
|
+ csmy = cascade.y + margin / 2.0;
|
|
|
+ if( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS && linearDepth >= csmx && ( linearDepth < csmy || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 ) ) {
|
|
|
|
|
|
float dist = min( linearDepth - csmx, csmy - linearDepth );
|
|
|
float ratio = clamp( dist / margin, 0.0, 1.0 );
|
|
|
- if( i < NUM_DIR_LIGHT_SHADOWS ) {
|
|
|
+ if( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS ) {
|
|
|
|
|
|
vec3 prevColor = directLight.color;
|
|
|
directionalLightShadow = directionalLightShadows[ i ];
|
|
|
directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
|
|
|
|
|
|
- bool shouldFadeLastCascade = i == CSM_CASCADES - 1 && linearDepth > cascadeCenter;
|
|
|
+ bool shouldFadeLastCascade = UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth > cascadeCenter;
|
|
|
directLight.color = mix( prevColor, directLight.color, shouldFadeLastCascade ? ratio : 1.0 );
|
|
|
|
|
|
}
|
|
@@ -110,7 +118,7 @@ IncidentLight directLight;
|
|
|
ReflectedLight prevLight = reflectedLight;
|
|
|
RE_Direct( directLight, geometry, material, reflectedLight );
|
|
|
|
|
|
- bool shouldBlend = i != CSM_CASCADES - 1 || i == CSM_CASCADES - 1 && linearDepth < cascadeCenter;
|
|
|
+ bool shouldBlend = UNROLLED_LOOP_INDEX != CSM_CASCADES - 1 || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth < cascadeCenter;
|
|
|
float blendRatio = shouldBlend ? ratio : 1.0;
|
|
|
|
|
|
reflectedLight.directDiffuse = mix( prevLight.directDiffuse, reflectedLight.directDiffuse, blendRatio );
|
|
@@ -121,6 +129,7 @@ IncidentLight directLight;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+ #unroll_loop_end
|
|
|
#else
|
|
|
|
|
|
#pragma unroll_loop
|