planar shadow

 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 }

 

 

  

 

上一篇:Unity shader 护盾shield的简单实现


下一篇:Unity shader 护盾shield的简单实现