Files
Cielonos/Assets/PotaToon/Shaders/ChracterShadow/CharacterShadowTransforms.hlsl
SoulliesOfficial f7af60351b 阶段性完成
2025-12-08 05:27:53 -05:00

50 lines
1.6 KiB
HLSL

#ifndef CHARACTER_SHADOW_TRANSFORMS_INCLUDED
#define CHARACTER_SHADOW_TRANSFORMS_INCLUDED
#include "./CharacterShadowInput.hlsl"
float3 ApplyCharShadowBias(float3 positionWS, float3 normalWS, float3 lightDirection, float depthBias, float normalBias)
{
// Depth Bias
positionWS = lightDirection * depthBias + positionWS;
// Normal Bias
float invNdotL = 1.0 - saturate(dot(lightDirection, normalWS));
float scale = invNdotL * -normalBias;
positionWS = normalWS * scale.xxx + positionWS;
return positionWS;
}
float4 CharShadowWorldToHClipWithoutBias(float3 positionWS)
{
return mul(_CharShadowViewProjM, float4(positionWS, 1.0));
}
float4 CharShadowObjectToHClip(float3 positionOS, float3 normalWS, float depthBias, float normalBias)
{
float3 positionWS = TransformObjectToWorld(positionOS);
positionWS = ApplyCharShadowBias(positionWS, normalWS, _BrightestLightDirection.xyz, _CharShadowBias.x + depthBias, _CharShadowBias.y + normalBias);
return CharShadowWorldToHClipWithoutBias(positionWS);
}
float4 CharShadowObjectToHClipWithoutBias(float3 positionOS)
{
float3 positionWS = TransformObjectToWorld(positionOS);
return CharShadowWorldToHClipWithoutBias(positionWS);
}
// Skip if too far (since we don't use mipmap for charshadowmap, manually cull this calculation based on view depth.)
bool IfCharShadowCulled(float viewPosZ)
{
return viewPosZ < _CharShadowCullingDist;
}
float GetCharShadowFade(float viewPosZ)
{
const float fadeStart = _CharShadowCullingDist * 0.9;
const float div = _CharShadowCullingDist * 0.1;
return saturate((viewPosZ - fadeStart) / div);
}
#endif