[UnityShader]unity中2D Sprite顯示陰影和接受陰影


首先是效果

要讓2D顯示陰影,首先假設知道Unity陰影來源(shader中的ShadowCaster)

最簡單的方法是,首先從官網下載Sprite-Default.Shader,查看源碼

然后復制粘貼到自己的Shader中,結尾加上一句FallBack "VertexLit",此時已經擁有投射陰影的能力了

(復制代碼保存到Shader中)

 1 // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
 2 
 3 Shader "Custom/2DShadow"
 4 {
 5     Properties
 6     {
 7         [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
 8         _Color ("Tint", Color) = (1,1,1,1)
 9         [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
10         [HideInInspector] _RendererColor ("RendererColor", Color) = (1,1,1,1)
11         [HideInInspector] _Flip ("Flip", Vector) = (1,1,1,1)
12         [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {}
13         [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", Float) = 0
14     }
15 
16     SubShader
17     {
18         Tags
19         {
20             "Queue"="Transparent"
21             "IgnoreProjector"="True"
22             "RenderType"="Transparent"
23             "PreviewType"="Plane"
24             "CanUseSpriteAtlas"="True"
25         }
26 
27         Cull Off
28         Lighting Off
29         ZWrite Off
30         Blend One OneMinusSrcAlpha
31 
32         Pass
33         {
34         CGPROGRAM
35             #pragma vertex SpriteVert
36             #pragma fragment SpriteFrag
37             #pragma target 2.0
38             #pragma multi_compile_instancing
39             #pragma multi_compile_local _ PIXELSNAP_ON
40             #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
41             #include "UnitySprites.cginc"
42         ENDCG
43         }
44     }
45 
46     FallBack "VertexLit"  //上面都是默認代碼,只加了這一句,原因可以看看<UnityShader入門精要>,有講Unity陰影原理
47 }

但是SpriteRndererreceiveShadows屬性和shadowCastingMode屬性是隱藏的(可以寫編輯器擴展暴露出來)在代碼中打開即可,掛上腳本,運行游戲便可以看到效果

1 void Awake()
2     {
3         transform.GetComponent<SpriteRenderer>().receiveShadows = true;
4         transform.GetComponent<SpriteRenderer>().shadowCastingMode = ShadowCastingMode.TwoSided;
5     }

 

更新:要讓Sprite接受投影

有新的需求要求Sprite能接受投影,那么上面這套就不適用了,因為Queue為Transparent時是收不到投影的

直接將Shader替換為Legacy Shaders/Transparent/Cutout/Diffuse,這是利用內置的透明度測試來達成所想要的效果

關於透明度測試可以看看<UnityShader 入門精要>,大概意思就是Alpha低於設定值,則直接丟棄不渲染


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM