首先是效果

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

[UnityShader]unity中2D Sprite显示阴影和接受阴影的更多相关文章

  1. Unity中2D和UGUI图集的理解与使用

    图集 什么是图集? 在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是图集呢? ...

  2. Unity之2D Sprite Outline外轮廓效果

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity5.3.8f1 Unity提供了2D Object Sprite对象,但是没有提供外轮廓Outline效果的支持 ...

  3. 【Unity3D基础教程】给初学者看的Unity教程(三):通过制作Flappy Bird了解Native 2D中的Sprite,Animation

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 上一次我们讲了MonoBehaviou ...

  4. 【转】通过制作Flappy Bird了解Native 2D中的Sprite,Animation

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 上一次我们讲了MonoBehaviou ...

  5. boostrap中模态框显示在阴影之下

    boostrap中模态框显示在阴影之下 出现这种情况的原因我开始也搞了很久,问题出现在哪里呢? 有事问百度,在百度上查了一下资料,他们主要的解决办法:是 修改标签的z-index属性的值, 我试着改了 ...

  6. 在Unity中实现屏幕空间阴影(1)

    接着上篇文章,我们实现了SSR效果. 其中的在屏幕空间进行光线追踪的方法是通用的.借此我们再实现一种屏幕空间的效果,即屏幕空间阴影. 文中的图片来自Catlike coding http://catl ...

  7. Unity中调用Windows窗口句柄以及根据需求设置并且解决扩展屏窗体显示错乱/位置错误的Bug

    问题背景: 现在在搞PC端应用开发,我们开发中需要调用系统的窗口以及需要最大化最小化,缩放窗口拖拽窗口,以及设置窗口位置,去边框等功能 解决根据: 使用user32.dll解决 具体功能: Unity ...

  8. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

  9. Unity中简单使用Opengl

    简介 由于项目特殊需求,需要在unity中使用一些OpenGL的东西来绘制图形(PS:其实就是有一个拖尾算法只有OpenGL版本~~~懒得改了,直接在unity中使用OpenGL算了).所以琢磨咯下如 ...

  10. 关于Unity中的NGUI和UGUI

    一.用Unity开发2D游戏,有三套关系 1.GUI:Unity本身自带的GUI 2.NGUI:以前在Unity中广泛来做2D的,是第三方的包,需要安装 3.UGUI:Unity5.X后(其实是Uni ...

随机推荐

  1. day10-功能实现09

    家居网购项目实现09 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 21.功能20-修改购物车 21.1需求分析/图解 进入购 ...

  2. APP上架因收集个人信息问题被拒绝该怎么解决?

    近年来,随着信息技术的快速发展和移动互联网应用的普及,越来越多的应用大量收集.使用个人信息,给人们生活带来便利的同时,也出现了对个人信息的非法收集.滥用.泄漏等问题,个人信息安全面临严重威胁. 201 ...

  3. 分享.net framework4.0无法安装的几种处理方案.

    [关于.net framework4.0安装失败]-------------)方案1:http://www.win7xtzj.com/win10jiaocheng/39834.html 关键词: -- ...

  4. Spark详解(08) - Spark(3.0)内核解析和源码欣赏

    Spark详解(08) - Spark(3.0)内核解析和源码欣赏 源码全流程 Spark提交流程(YarnCluster) Spark通讯架构 Spark任务划分 Task任务调度 Shuffle原 ...

  5. Java基础篇——集合框架

    集合--对象的容器 集合与数组相似,不同的是,集合的长度可变并且只能组合引用类型数据,如果要组合基本类型,则需要装箱成包装类 Collection体系集合 Collection父接口 Collecti ...

  6. Lyndon Word 与 Lydon 分解

    \(\newcommand\m\mathbf\) \(\newcommand\t\texttt\) \(\text{By DaiRuiChen007}\) 约定: 对于两个字符串 \(S,T\),用 ...

  7. Embracing Domain Differences in Fake News- Cross-domain Fake News Detection using Multimodal Data(AAAI21)

    一.摘要 随着社交媒体的快速发展,假新闻已经成为一个重大的社会问题,它无法通过人工调查及时解决.这激发了大量关于自动假新闻检测的研究. 大多数研究探索了基于新闻记录中不同模态信息(如文本.图像和传播网 ...

  8. do while 出口條件循環

  9. MAC实用操作记录---使用命令执行文件上传下载解压打包与解包

    1.使用命令执行文件上传下载 https://www.cnblogs.com/sugartang/p/12743470.html 2.提示:打不开xx软件,在 OS X 安装软件打不开提示" ...

  10. 在线程里使用线程外的变量为什么一定要是final类型

    public class CyclicBarrierDemo { public static void main(String[] args) { /* * 七龙珠 * */ CyclicBarrie ...