|
|
|
|
|
|
// This file is empty on purpose. Projects can put their custom shadow algorithms in here so they get automatically included by Shadow.hlsl. |
|
|
|
|
|
|
|
float EvalShadow_CascadedMoment( ShadowContext shadowContext, float3 positionWS, float3 normalWS, int shadowDataIndex, float3 L ) |
|
|
|
{ |
|
|
|
ShadowData sd = shadowContext.shadowDatas[shadowDataIndex]; |
|
|
|
// normal based bias |
|
|
|
positionWS += EvalShadow_NormalBias( normalWS, saturate( dot( normalWS, L ) ), sd.texelSizeRcp.zw, sd.normalBias ); |
|
|
|
|
|
|
|
// load the right shadow data for the current face |
|
|
|
float4 dirShadowSplitSpheres[4]; |
|
|
|
uint payloadOffset = EvalShadow_LoadSplitSpheres( shadowContext, shadowDataIndex, dirShadowSplitSpheres ); |
|
|
|
int shadowSplitIndex = EvalShadow_GetSplitSphereIndexForDirshadows( positionWS, dirShadowSplitSpheres ); |
|
|
|
if (shadowSplitIndex < 0) |
|
|
|
return 1.0; |
|
|
|
|
|
|
|
// get the shadowmap data for the correct cascade |
|
|
|
sd = shadowContext.shadowDatas[shadowDataIndex + 1 + shadowSplitIndex]; |
|
|
|
|
|
|
|
// get shadowmap texcoords |
|
|
|
float3 posTC = EvalShadow_GetTexcoords( sd, positionWS ); |
|
|
|
|
|
|
|
// sample the texture |
|
|
|
uint texIdx, sampIdx; |
|
|
|
float slice; |
|
|
|
UnpackShadowmapId( sd.id, texIdx, sampIdx, slice ); |
|
|
|
|
|
|
|
uint shadowType, shadowAlgorithm; |
|
|
|
UnpackShadowType( sd.shadowType, shadowType, shadowAlgorithm ); |
|
|
|
|
|
|
|
switch( shadowAlgorithm ) |
|
|
|
{ |
|
|
|
case (GPUSHADOWALGORITHM_CUSTOM + 1): return 1.0; |
|
|
|
default: return SampleShadow_SelectAlgorithm( shadowContext, sd, payloadOffset, posTC, sd.bias, slice, shadowAlgorithm, texIdx, sampIdx ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
float EvalShadow_CascadedMoment( ShadowContext shadowContext, float3 positionWS, float3 normalWS, int shadowDataIndex, float3 L, float2 unPositionSS ) |
|
|
|
{ |
|
|
|
return EvalShadow_CascadedMoment( shadowContext, positionWS, normalWS, shadowDataIndex, L ); |
|
|
|
} |