[UnityShader]unity中2D Sprite显示阴影和接受阴影
2024-10-21 10:19:56
首先是效果
要让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 }
但是SpriteRnderer的receiveShadows属性和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低于设定值,则直接丢弃不渲染
最新文章
- 不一样的猜数字游戏 — leetcode 375. Guess Number Higher or Lower II
- mysql整数字段 int bigint smallint tinyint
- 如何用css画出三角形
- Effective C++ -----条款38:通过复合塑模出has-a或“根据某物实现出”
- python学习应用笔记(一)
- IE10 下兼容性问题
- (转载)Cocos2dx-OpenGL ES2.0教程:编写自己的shader(2)
- yii2的安装
- 那些年,我们一起被坑的H5音频
- sql 参数
- hdu4393 Throw nails(只用模拟前面500来次,后面根据速度、位置、id值排序即可)
- OData.NET已在 GitHub上开源
- gridcontrol datatemplate trigger
- 排序 之 快排、归并、插入 - <;时间复杂度>;----掌握思想和过程
- SVN与Git
- 利用post请求发送内容进行爬虫
- VS Code调试.Net Core版Hello World
- 表单提交 fastadmin form
- FormData的使用
- SWT中ole/activex实践--操作word的一个例子