阴影的制作方式很多,下面是类似王者荣耀的阴影,主要是这种阴影显示效果好,性能好。缺点是只是在一个平面上的阴影,主要用于地面是平的情况。
此阴影还是通过Renderer Feather方式添加,下面是shadow
Shader "Unlit/Shadow"
{
Properties
{
_ShadowY ("ShadowY", float) = 0.001
}
SubShader
{
Pass
{
Name "MyShadow"
Tags { "RenderType"="Transparent"}
Stencil
{
Ref 0
Comp equal
Pass incrWrap
Fail keep
ZFail keep
}
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
Cull back
Offset -1, -1
HLSLPROGRAM
#pragma vertex vert
#pragma fragment fragment
// GPU Instancing
#pragma multi_compile_instancing
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
float _ShadowY;
CBUFFER_END
struct Attributes
{
float4 positionOS : POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 positionCS : SV_POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
Varyings vert(Attributes input)
{
Varyings output = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_TRANSFER_INSTANCE_ID(input, output);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
float3 worldPos = TransformObjectToWorld(input.positionOS)/input.positionOS.w;
float3 lightDir = _MainLightPosition.xyz - worldPos * _MainLightPosition.w;
float shadowY = min(worldPos.y , _ShadowY);
float3 shadowPos = float3(0,shadowY,0);
shadowPos.xz = worldPos.xz - lightDir.zx * worldPos.y / lightDir.y;
output.positionCS = TransformWorldToHClip(shadowPos);
return output;
}
half4 fragment(Varyings input): SV_TARGET
{
UNITY_SETUP_INSTANCE_ID(input);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
return half4(0,0,0,0.3);
}
ENDHLSL
}
}
}