1 Shader "ZSY/PlanShadow" 2 { 3 Properties 4 { 5 _ShadowColor ("Shadow Color", Color) = (0.5, 0.5, 0.5, 0.5) 6 } 7 SubShader 8 { 9 Tags { "RenderType"="Transparent" "Queue"="Transparent" } 10 Blend SrcColor SrcAlpha 11 ZWrite Off 12 13 Pass 14 { 15 Stencil 16 { 17 Ref 2 18 Comp Greater 19 Pass Replace 20 ZFail DecrSat 21 } 22 23 CGPROGRAM 24 #pragma vertex vert 25 #pragma fragment frag 26 27 #include "UnityCG.cginc" 28 29 struct appdata 30 { 31 float4 vertex : POSITION; 32 }; 33 34 struct v2f 35 { 36 float4 vertex : SV_POSITION; 37 }; 38 39 v2f vert (appdata v) 40 { 41 v2f o; 42 float4 vertex = v.vertex; 43 vertex = mul(unity_ObjectToWorld, vertex); 44 45 float3 lightdir = WorldSpaceLightDir(vertex); 46 vertex.xz += lightdir.xz * vertex.y; 47 vertex.y = 0; 48 49 vertex = mul(unity_WorldToObject, vertex); 50 51 o.vertex = UnityObjectToClipPos(vertex); 52 return o; 53 } 54 55 fixed4 _ShadowColor; 56 fixed4 frag (v2f i) : SV_Target 57 { 58 return _ShadowColor; 59 } 60 ENDCG 61 } 62 } 63 }
大致讲一下,原理是把模型顶点转到世界空间然后压扁(所有y坐标值压到0,这个根据项目实际,想多少随意),然后根据光线方向算个偏移,然后转回自身空间然后走MVP。
通常做到这里你会发现,虽然东西在平面了,但是一开半透明就有顶点重复引起的闪烁和颜色叠加,就这种
这个时候就用模板也就是Stencil语句,关于这个的细节,看这个http://blog.csdn.net/u011047171/article/details/46928463就行了。
非常干净地处理了,配合CommandBuffer就可以让你项目画质起飞了。
你是不是懒得来想让我给你CommandBuffer的代码?你们可真是小机灵鬼。
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.Rendering; 5 6 public class CommandBufferEffect : MonoBehaviour { 7 private CommandBuffer buffer; 8 9 void Start() 10 { 11 buffer = new CommandBuffer (); 12 } 13 14 public void AddCommand(Renderer rr, Shader shader) 15 { 16 Material mat = new Material (shader); 17 buffer.DrawRenderer (rr, mat); 18 } 19 20 void OnPostRender() 21 { 22 Graphics.ExecuteCommandBuffer (buffer); 23 } 24 }