前言

今天我们来实现一个比较简单实用的shader特效 - 2D Sprite影子效果

最终效果:

准备工作:

打开unity新建一个2D场景,导入一张2D人物图片和一张透明的图片(用来接收影子),修改图片Texture Type为 Sprite 类型,

拖入2D人物精灵图到场景,然后拖拽透明图到人物精灵图节点下,命名为shadow,用来接收影子

然后新建一个材质球,拖拽到 shadow 节点上,shader选择我们将要新建的shadow.shader。
场景如下:

实现思路:

其实很简单,就是把人物的纹理传递给shadow shader, 把alpha值大于0的像素的rgb变为黑色即可。

shader:

// ---------------------------【2D Sprite 影子】---------------------------
Shader "lcl/shader2D/playerShadow"
{// ---------------------------【子着色器】---------------------------SubShader{// No culling or depthCull Off ZWrite Off ZTest Always// 开启透明度Blend SrcAlpha OneMinusSrcAlpha// 设置渲染队列Tags { "Queue"="Transparent" "RenderType"="Opaque" }// ---------------------------【通道一】---------------------------Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};// 顶点着色获取v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv;o.uv.y = 1 - o.uv.y;return o;}//通过c#获取到人物纹理传递过来sampler2D _PlayerTex;// 片元着色获取fixed4 frag (v2f i) : SV_Target{// 采样传过来的纹理fixed4 col = tex2D(_PlayerTex, i.uv);// 这里用step代替if// 当 透明度值大于1时, 就呈现黑色(即影子)col.rgb = 1 - step(0,col.a);return col;}ENDCG}}
}

c#:

using UnityEngine;
public class playerShadow : MonoBehaviour {public GameObject shadow;void Start () {if (!shadow) {return;}// 获取纹理并传递到shadervar shadowMat = shadow.GetComponent<SpriteRenderer> ().material;var playerTex = GetComponent<SpriteRenderer> ().sprite.texture;shadowMat.SetTexture ("_PlayerTex", playerTex);}
}

最后把c#脚本拖拽到人物节点上,把shadow拖拽到shadow变量上,点击运行即可

最终效果:

unity-shader 2D - Sprite 影子相关推荐

  1. Unity Shader 2D水流效果

    水流的模拟主要运用了顶点变换和纹理动画的结合: 顶点变换中,利用正弦函数模拟河流的大致形态,例如波长,振幅等. 纹理动画中,将纹理坐标朝某一方向持续滚动以形成流动的效果. 脚本如下: 1 Shader ...

  2. unity shader 2D火焰流动特效

    效果图: /* *author:maki 火焰流动效果 */ Shader "Custom/FireLiner" {Properties{_Albedo("Albedo& ...

  3. 2d shader unity 阴影_【Unity Shader】平面阴影(Planar Shadow)

    来介绍一种适用于移动平台的高性能实时阴影解决方案--平面阴影(Planar Shadow). 由于Unity内置的实时阴影实现方式是屏幕空间阴影贴图(Screen Space Shadow Map)非 ...

  4. Unity九宫格切割图片 2D Sprite

    1.安装 2D Sprite 在unity中 Window–>Package Manager–>搜索框输入 2D Sprite -->Package Manager左上角的Packa ...

  5. Unity报错之 No Sprite Editor Window registered. Please download 2D Sprite package from Package Manager.

    Unity报错之 No Sprite Editor Window registered. Please download 2D Sprite package from Package Manager. ...

  6. 2022-04-30 Unity核心2——Sprite

    文章目录 一.Single 图片编辑 二.Multiple 图片编辑 三.Polygon 多边形编辑 四.Sprite Renderer 精灵渲染器 五.Sprite Creator 精灵创造者 六. ...

  7. unity shader入门精要_Unity Shader 入门(二):shader 基础

    一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门精要学习 https://github.com/candycat1992/Unity_Shaders_Book/tree/u ...

  8. Unity Shader中各部分定义内容详解

    Unity Shader中各部分定义内容详解 样板 Shader "Practice/Unlit/SimpleUnlit" {Properties{_MainTex (" ...

  9. Unity Shader基础

    ShaderLab 在unity中,所有的unity shader都是使用shaderlab来编写的.Shaderlab是unity提供的编写unity shader的一种说明性的语言. Unity ...

最新文章

  1. 10年以后,Google Labs再次回归!VR部门负责人任新leader
  2. 【转】android-修改TextView中部分文字的颜色
  3. linux中ps aux和ps -ef下显示的意义
  4. 什么是JSON处理(JSON-P API)?
  5. SqlServer中dateTime、dateTime2、date、datetimeoffset的区别
  6. java in thread main_JAVA报错:Exception in thread main……求帮助?
  7. JavaFX加载界面报错:fxcontroller can only be applied to root element?
  8. 【注意力机制】SENet(Squeeze-and-Excitation Networks)详解
  9. Python——高阶函数
  10. ArcGIS 计算挖填方区域和挖填方量
  11. 制作LINUX安装DEB,脚本中的函数报错怎么办?
  12. RocketMQ(一)RocketMQ介绍及核心概念
  13. 联想m7216更换墨粉流程图_联想m7216复印机说明书 联想复印机怎样更换墨粉
  14. 模型机CPU设计——ALU函数发生器(6)
  15. 代码审查工具FxCop建议采用的规则总结
  16. c罗说什么语言,那些年属于C罗的经典语录,那一句话最感动你?
  17. 华为matebook笔记本鸿蒙,聊聊鸿蒙对笔记本电脑行业的影响
  18. 一个有趣的 5 X 5 方阵一笔画问题
  19. ebs 供应商地点信息_EBS R12使用接口表往已存在的供应商地址下创建新的地点
  20. 采购申请、采购订单、供应商

热门文章

  1. 90个面试问题(带答案)
  2. 分数阶傅立叶变换 matlab,【综述】分数阶傅里叶变换(FRFT)
  3. 伤我最深,记得最真的句子:QQ伤感日志
  4. 豪杰DVD播放器 3.0.8 URL重新定向栈溢出漏洞
  5. 休问情怀谁得似——冰雪小五台苦旅记(十完结篇)
  6. 微信小程序 阻止事件冒泡
  7. pytest与coverage联合使用
  8. 编码中关于二义性的解释
  9. Ubuntu的安装、更新、下载软件命令
  10. 用LoopBack接口配置EBGP邻居