第二个Pass将模型压扁,偏移,渲染成透明的黑色
Shader "chicai/MeshShadow"
{
Properties
{
_DiffuseIntensity("Diffuse Intensity", float) = 1
_SpecularIntensity("Specular Intensity", float) = 1
_Gloss("Gloss", float) = 1
_ShadowPos("ShadowPos", vector) = (0,0,0,0)
}
SubShader
{
Tags { "RenderType"="Opaque"}
LOD 100
Pass{}
//只能在平面上用
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
//透明渲染,会穿透渲染两层,过滤只一层
Stencil
{
Ref 100
Comp NotEqual
Pass Replace
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 pos : SV_POSITION;
};
float4 _ShadowPos;
v2f vert(appdata v)
{
v2f o;
float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
float tempPosy = worldPos.y - _ShadowPos.y;//将脚上到头顶的顶点计算到从0开始
worldPos.y = _ShadowPos.y;//地面在世界坐标中的高度,压扁
worldPos.xz += _ShadowPos.xz * tempPosy;//偏移影子
o.pos = mul(UNITY_MATRIX_VP, worldPos);
return o;
}
fixed4 frag(v2f i):SV_TARGET
{
return fixed4(0,0,0,_ShadowPos.w) ;
}
ENDCG
}
}
}