第二个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 } } }