89 lines
2.7 KiB
HLSL
89 lines
2.7 KiB
HLSL
#ifndef CHARACTER_SHADOW_DEPTH_PASS_INCLUDED
|
|
#define CHARACTER_SHADOW_DEPTH_PASS_INCLUDED
|
|
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
#include "CharacterShadowTransforms.hlsl"
|
|
#include "../Common/PotaToonCommon.hlsl"
|
|
|
|
// Below material properties must be declared in seperate shader input to make compatible with SRP Batcher.
|
|
// CBUFFER_START(UnityPerMaterial)
|
|
// float4 _ClippingMask_ST;
|
|
// CBUFFER_END
|
|
// TEXTURE2D(_ClippingMask);
|
|
|
|
SAMPLER(sampler_ClippingMask);
|
|
|
|
struct Attributes
|
|
{
|
|
float4 position : POSITION;
|
|
float2 texcoord0 : TEXCOORD0;
|
|
float2 texcoord1 : TEXCOORD1;
|
|
float2 texcoord2 : TEXCOORD2;
|
|
float2 texcoord3 : TEXCOORD3;
|
|
float3 normal : NORMAL;
|
|
// UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
|
|
struct Varyings
|
|
{
|
|
float2 uv0 : TEXCOORD0;
|
|
float2 uv1 : TEXCOORD1;
|
|
float2 uv2 : TEXCOORD2;
|
|
float2 uv3 : TEXCOORD3;
|
|
float3 positionOS : TEXCOORD4;
|
|
float4 positionCS : SV_POSITION;
|
|
// UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
// UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
Varyings CharShadowVertex(Attributes input)
|
|
{
|
|
Varyings output = (Varyings)0;
|
|
// UNITY_SETUP_INSTANCE_ID(input);
|
|
// UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
|
|
|
output.uv0 = input.texcoord0;
|
|
output.uv1 = input.texcoord1;
|
|
output.uv2 = input.texcoord2;
|
|
output.uv3 = input.texcoord3;
|
|
|
|
output.positionCS = CharShadowObjectToHClip(input.position.xyz, TransformObjectToWorldDir(input.normal), _DepthBias * 0.01, _NormalBias * 0.01);
|
|
|
|
#if UNITY_REVERSED_Z
|
|
output.positionCS.z = min(output.positionCS.z, UNITY_NEAR_CLIP_VALUE);
|
|
#else
|
|
output.positionCS.z = max(output.positionCS.z, UNITY_NEAR_CLIP_VALUE);
|
|
#endif
|
|
output.positionCS.xy *= _CharShadowCascadeParams.y;
|
|
|
|
output.positionOS = input.position.xyz;
|
|
|
|
return output;
|
|
}
|
|
|
|
float2 CharShadowFragment(Varyings input) : SV_TARGET
|
|
{
|
|
// UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
|
|
|
|
if (IfCharShadowCulled(TransformWorldToView(TransformObjectToWorld(input.positionOS)).z))
|
|
clip(-1);
|
|
|
|
const float2 uvArray[4] = { input.uv0, input.uv1, input.uv2, input.uv3 };
|
|
float clippingMask = SelectMask(SAMPLE_TEXTURE2D(_ClippingMask, sampler_ClippingMask, TRANSFORM_TEX(SelectUV(_ClippingMaskUV, uvArray), _ClippingMask)), _ClippingMaskCH);
|
|
clip(clippingMask - 0.5);
|
|
#if defined(_ALPHATEST_ON)
|
|
float alpha = SAMPLE_TEXTURE2D(_MainTex, sampler_ClippingMask, TRANSFORM_TEX(SelectUV(_BaseMapUV, uvArray), _MainTex)).a * _BaseColor.a;
|
|
float cutoff = _Cutoff;
|
|
if (_SurfaceType >= REFRACTION_SURFACE)
|
|
cutoff = 0;
|
|
clip(alpha - cutoff - 0.001);
|
|
#endif
|
|
|
|
float2 output = input.positionCS.z;
|
|
if (_ToonType == FACE_TYPE)
|
|
output.y = 0;
|
|
|
|
return output;
|
|
}
|
|
#endif
|