I've solved things by myself.
A little step toward being a shaders guru
Replace this block in
PixelShader_ps
Code: Select all
@property( hlms_pssm_splits )
float fShadow = 1.0;
if( inPs.depth <= passBuf.pssmSplitPoints@value(CurrentShadowMap) )
fShadow = getShadow( texShadowMap[@value(CurrentShadowMap)], inPs.posL0, passBuf.shadowRcv[@counter(CurrentShadowMap)].invShadowMapSize );
@foreach( hlms_pssm_splits, n, 1 ) else if( inPs.depth <= passBuf.pssmSplitPoints@value(CurrentShadowMap) )
fShadow = getShadow( texShadowMap[@value(CurrentShadowMap)], inPs.posL@n, passBuf.shadowRcv[@counter(CurrentShadowMap)].invShadowMapSize );
@end @end @property( !hlms_pssm_splits && hlms_num_shadow_maps && hlms_lights_directional )
float fShadow = getShadow( texShadowMap[@value(CurrentShadowMap)], inPs.posL0, passBuf.shadowRcv[@counter(CurrentShadowMap)].invShadowMapSize );
@end
with this one
Code: Select all
@property( hlms_pssm_splits )
@psub( pssm_split_n, hlms_pssm_splits, 1 )
@pset( pssm_split_blend_m, 0 )
@padd( pssm_split_blend_m_plus_1, pssm_split_blend_m, 1 )
float pssm_split_blend_point0 = lerp( 0.0, passBuf.pssmSplitPoints@value(pssm_split_blend_m), 0.9 );
@foreach( pssm_split_n, n, 1 ) float pssm_split_blend_point@n = lerp( passBuf.pssmSplitPoints@value(pssm_split_blend_m), passBuf.pssmSplitPoints@value(pssm_split_blend_m_plus_1), 0.9 );
@add( pssm_split_blend_m, 1 )
@add( pssm_split_blend_m_plus_1, 1 )
@end
float fShadow = 1.0;
float fShadowNextSplit = 1.0;
if( inPs.depth <= passBuf.pssmSplitPoints@value(CurrentShadowMap) )
{
fShadow = getShadow( texShadowMap[@value(CurrentShadowMap)], inPs.posL0, passBuf.shadowRcv[@counter(CurrentShadowMap)].invShadowMapSize );
if( inPs.depth > pssm_split_blend_point0 )
{
fShadowNextSplit = getShadow( texShadowMap[@value(CurrentShadowMap)], inPs.posL@value(CurrentShadowMap), passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize );
fShadow = lerp( fShadow, fShadowNextSplit, (inPs.depth - pssm_split_blend_point0) / (passBuf.pssmSplitPoints0 - pssm_split_blend_point0) );
}
}
@foreach( pssm_split_n, n, 1 ) else if( inPs.depth <= passBuf.pssmSplitPoints@value(CurrentShadowMap) )
{
fShadow = getShadow( texShadowMap[@value(CurrentShadowMap)], inPs.posL@n, passBuf.shadowRcv[@counter(CurrentShadowMap)].invShadowMapSize );
if( inPs.depth > pssm_split_blend_point@n )
{
fShadowNextSplit = getShadow( texShadowMap[@value(CurrentShadowMap)], inPs.posL@value(CurrentShadowMap), passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize );
fShadow = lerp( fShadow, fShadowNextSplit, (inPs.depth - pssm_split_blend_point@n) / (passBuf.pssmSplitPoints@n - pssm_split_blend_point@n) );
}
}
@end
@psub( pssm_split_m, pssm_split_n, 1 )
else if( inPs.depth <= passBuf.pssmSplitPoints@value(pssm_split_n) )
{
fShadow = getShadow( texShadowMap[@value(CurrentShadowMap)], inPs.posL@value(CurrentShadowMap), passBuf.shadowRcv[@counter(CurrentShadowMap)].invShadowMapSize );
float pssmSplitPointFade = lerp( passBuf.pssmSplitPoints@value(pssm_split_m), passBuf.pssmSplitPoints@value(pssm_split_n), 0.5 );
if( inPs.depth > pssmSplitPointFade )
{
fShadow = lerp( fShadow, 1.0, (inPs.depth - pssmSplitPointFade) / (passBuf.pssmSplitPoints@value(pssm_split_n) - pssmSplitPointFade) );
}
}
@end @property( !hlms_pssm_splits && hlms_num_shadow_maps && hlms_lights_directional )
float fShadow = getShadow( texShadowMap[@value(CurrentShadowMap)], inPs.posL0, passBuf.shadowRcv[@counter(CurrentShadowMap)].invShadowMapSize );
@end
and enjoy your last splits fading in.
As a bonus track, you'll receive also blending between the various splits.
Check the "Blend between Cascades" section at
this link to more info about what I'm talking about.
[edit]
Fixed an issue when spotlights are used (
CurrentShadowMap value not updated)
Fade in starts at the half of the last split (instead of beginning)