[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低于设定值,则直接丢弃不渲染

posted @ 2020-09-05 19:21  wayneWy  阅读(3300)  评论(0编辑  收藏  举报