当前位置: 首页 > article >正文

Unity Shader Graph 2D - 跳动的火焰

在游戏中,火焰是一种常见的特效。通常来讲火焰特效通过粒子系统的方式实现的相对较多,本文将通过Shader Graph的方式来实现一种不同的火焰效果。


那么怎么实现呢

首先创建一个名为Fire的Shader Graph文件,然后创建一个名为M_Fire的材质球。

基础的贴图显示

老规矩,还是参考UV滚动动画的基础资源显示部分的节点,建立最基本的Texture 2D类型的参数命名为MainTex。这里需要用到一个制作好的图片资源用来做遮挡,节点如下。

火焰的制作

遮罩的实现

制作火焰时,我们需要对中心处进行遮罩的实现,首先可以对我们预先准备的图片资源进行一个One Minus的操作,来获取中心部位是遮罩的效果,然后通过一个Power节点用一个名为Radius的变量来控制中心部分遮罩的范围,再用Saturate节点进行一个0-1的Clamp取值。

火焰的实现

火焰我们需要用到两种噪声节点,一个是Voronoi噪声(细胞状的),另一个是Gradient Noise(模拟随机性)。

Voronoi噪声部分

首先使用Voronoi噪声节点对其进行One Minus的操作获取像细胞球一样的效果,节点如下。

然后需要给这个Voronoi噪声增加一个Y轴向上的移动,需要用到Time时间节点、控制Y轴移动速度的Speed变量、以及控制UV移动的Tilling And Offset节点,组合之后如下。

然后将这个Y轴向上的移动输出的UV给到Voronoi节点的UV输入节点,让细胞噪声有向上的移动,如下。

Gradient Noise部分

同样创建一个Float类型的Scale变量,用来控制Gradient Noise的噪声范围。然后用Voronois的同一个Time时间节点的输出来做一个Y轴向上的动画,创建一个单独的Float类型的GradientNoiseSpeed来控制移动的速度,同样需要用到Vector2节点和Tilling And Offset节点,组合连接如下。

最后将两部分的结果用乘法Multiply节点进行组合获得一个类似玻璃网格的效果,如下所示。

底部遮罩

将两部分融合后,需要做一个底部的遮罩来模拟火焰从下到上的一个渐变效果。既然是由下到上,那么就会用到Y轴的数据,因此需要一个UV节点加上一个Split节点来获取Y轴的数据,然后用一个Power节点来控制Y轴遮罩的基础范围(如果有需要也可以将这个参数开放出来进行可控),最后用一个乘法节点乘以一个Float型的Mask变量来控制遮罩的强弱,节点如下。

将遮罩的结果输出与之前两个噪声节点的输出进行相乘,来获得底部有遮罩的数据,节点如下。

最终的火焰效果

将之前准备的圆形遮罩范围与Y轴噪声节点的动画节点进行叠加,然后对其结果进行0-1的Clamp操作(Saturate,因为叠加会使结果大于1)。最后关键的一部就是对其进行One Minus的操作,这样中心的黑色部分会变成白色圆球,圆球周边的白色部分就会变黑色,节点如下。

给火焰加上颜色

然后用一个Lerp节点来给火焰加上颜色,从外焰到内焰,创建两个Color颜色变量,一个为外焰OutsideColor,一个为内焰InsideColor,颜色也可以设为HDR。最后将颜色的输出结果给到Base Color,Alpha则为One Minus黑白部分的输出。

那么最终的火焰效果预览如下所示,在Unity场景里赋予材质球和对应的贴图,调整参数可以做多个不同颜色的火焰,如文章开头所示,大家可以尽情尝试下。


http://www.kler.cn/a/530712.html

相关文章:

  • 从零开始部署Dify:后端与前端服务完整指南
  • 建表注意事项(2):表约束,主键自增,序列[oracle]
  • 【Elasticsearch】_all 查询
  • 梯度提升用于高效的分类与回归
  • 使用 DeepSeek-R1 等推理模型将 RAG 转换为 RAT,以实现更智能的 AI
  • 【ArcGIS遇上Python】批量提取多波段影像至单个波段
  • 大语言模型深度研究功能:人类认知与创新的新范式
  • Pyside6异步通信测试
  • Java设计模式:行为型模式→状态模式
  • 【R语言】R语言安装包的相关操作
  • Linux第105步_基于SiI9022A芯片的RGB转HDMI实验
  • 体系自适应的物联网漏洞挖掘系统研究背景及意义:物联网漏洞挖掘概述之物联网漏洞现状及问题
  • Python网络自动化运维---批量登录设备
  • 自然语言生成(NLG)算法模型评估方案的硬件配置、系统架构设计、软件技术栈、实现流程和关键代码
  • 【router路由的配置】
  • FPGA学习篇——开篇之作
  • Linux系统之whereis命令的基本使用
  • IM 即时通讯系统-47-beardlessCat IM 使用netty开发分布式Im,提供分布netty集群解决方案
  • 【Excel笔记_5】 LET 函数中数据范围不连续的处理方法
  • [漏洞篇]SQL注入漏洞详解
  • 开屏广告-跳过神器
  • Linux中基于RPM安装YUM的另一种方式
  • 自定义数据集 使用scikit-learn中svm的包实现svm分类
  • 冰蝎v3.0 beta7来啦
  • 【C++】B2115 密码翻译
  • Java知识速记:Lambda表达式