Unity VFX -- (5)VFX Graph基础

news2024/10/3 2:14:30

        在Unity中,还有一种完全不同的创建VFX的工作流,VFX Graph。VFX Graph能够生成出和粒子系统相同或更好的效果。

        相比于粒子系统,VFX Graph的一个最大的好处是它能够在保持应用良好性能的情况下,模拟出多得多的粒子。对于VFX艺术家来说,他们的主要职责之一是确保他们制作的特效不会影响应用整体的可用性和帧率,因此性能优化是非常重要的。

VFX Graph和粒子系统不同之处

        VFX Graph是基于节点的(node-based) 编辑器。相比于基于组件的(component)粒子系统来说,它看起来更加复杂。

VFX Graph的优点

        VFX Graph能够同时处理百万级别的粒子,而粒子系统同时能处理的粒子数要小于VFX Graph。

        VFX Graph产生处更加复杂的效果,比如开头的那个精灵,对于粒子系统来说几乎是不可能实现的。

VFX Graph的缺点

        VFX Graph对于初学者来说,上手难度相比于粒子系统来说更大。

        VFX Graph有更严格的硬件需求(具体的硬件需求和相关文档,可以参考这个链接Requirements and compatibility | Visual Effect Graph | 12.0.0),在部分设备上可能无法使用。

        VFX Graph运行在GPU上,Unity的物理计算被放到了CPU上,因此VFX Graph的粒子不能和应用的其它物理效果进行交互(比如和地面产生碰撞)。粒子系统是跑在CPU上的,因此它们能够和基于物理的(physics-based)组件进行交互。

VFX Graph和粒子系统该如何选

        如果我们的经验很丰富并且需要创建出非常复杂的效果,或者效果需要百万级别的粒子支撑,可以选择VFX Graph。

        如果我们并非专家,并且只想创建出一些简单的效果,这些效果能跑在所有设备上,或者效果需要和场景中其它基于物理的物体进行交互,则使用粒子系统。

        下面两张图是一个天气效果的对比,这个效果需要模拟的粒子数量是100万个,分别用粒子系统和VFX Graph来实现。

        粒子系统只有可怜的5.6FPS。

        VFX Graph在模拟出百万粒子的情况下,仍然有100 FPS的表现。

摆放一个VFX Graph特效到场景中

         1. 将前面笔记中所制作的环境粒子关闭掉(Inspector中设置为inactive即可)。

        2. 在Assets ->  CreativeCore_VFX -> VFX -> Samples中,拖动天气VFX Graph预制体中的一个(案例选的是Snow_VFXGraph_Prefab.prefab)到Heirarchy中。

        3. 将这个新添加的物体位置移动到空中,让场景看起来像是在下雨或下雪。

打开VFX Graph编辑器窗口

        1. 选中VFX Graph物体的情况下,定位到它的Visual Effect组件,这个组件的图标是一个小灯。

        2. 选择Edit按钮打开VFX Graph窗口

        3. 重新安排一下窗口布局,能够同时看到VFX Graph和场景。

VFX Graph编辑器移动导览

         在开始编辑VFX Graph之前,我们可以先尝试着在编辑器区域进行移动导览,熟悉一下。和Shader Graph或者动画状态机编辑器类似,VFX Graph中主要的导览方式有:

        平移(Pan): 按住鼠标中间并拖动,或者按住Alt(Windows)或Option(MAC),点击鼠标并拖动。

        缩放(Zoom): 滚动鼠标滚轮。

        聚焦和放大(Focus and zoom in):选中一个元素按F键。

        适应窗口(Fit to window):按A键。

         我们先来整体看看VFX Graph,它有四个主要的节点,从上到下垂直分布。这四个默认的节点被称为上下文节点(Context Nodes,或简称Context)。

浏览VFX Graph上下文

Spawn Context

        第一个上下文,控制粒子的生成,和粒子系统的Emission模块功能类似。

        默认情况下,一个新的VFX Graph使用常数的粒子产生速度(spawn rate),但我们可以改为变量方式、周期方式或bursts方式,正如之前烟雾特效所做的类似。

        1. 调整Rate属性,让VFX Graph版本的特效和之前用粒子系统做的天气特效的Rate一致。

                这里的spawn rate可以设置到一个很大的值,同时对FPS影响较小。

Initialize Particle Context

        初始化粒子上下文控制粒子最初在哪里出现,以及如何出现。这个上下文包含了许多粒子系统主模块中的相同的属性,包括粒子的初始大小,形状,速度,生命周期和最大数量等。它也包含了粒子系统中Shape的等价属性,定义了粒子产生的容器的形状。

        2. 配置初始化粒子上下文,让VFX Graph版本的效果和原来粒子系统所做的天气效果看起来差不多。

Update Particle Context

        更新粒子上下文控制着粒子从产生到消失期间粒子的变化。这个更新操作每一帧都会运行。包含了和粒子系统里类似的属性:Color over Lifetime, Size over Lifetime,Noise(VFX Graph里叫做Trubulence)以及Texture Sheet Animation(VFX Graph里叫做Flipbook Player)。

        每种行为能够在上下文中作为一个新的Block被添加进来。比如上图的Turbulence就是一个Block。

        3. 尝试通过在Context中点击右键并选择Create Block来使用创建新的Block。我们可以通过子菜单里的搜索框来搜索要添加的Block。

Output Particle Context

        输出粒子上下文控制每个粒子的外观,和粒子系统里的Renderer模块功能类似。在这里我们可以为粒子指定材质。

        4. 配置输出粒子上下文,让VFX Graph版本的效果和原来粒子系统所做的天气效果看起来差不多。

创建一个全新的VFX Graph

        1. 在Project窗口(注意不是Heirarchy)中,点击右键,选择Create -> Visual Effects -> Visual Effect Graph,然后将这个新建的VFX Graph放到Heirarchy中。然后再场景中将其移动到你想要放置的位置。

        2. 在Project窗口中双击VFX Graph打开VFX Graph编辑器窗口。

        3. 尝试修改一些Block,看看能不能达到你想要的效果,比如爆炸的礼花效果。

查看一个复杂的VFX Graph

        接下来我们来看一个专业级的VFX Graph例子,来感受一下复杂的VFX Graph长什么样。

        1. 在主菜单中,选择Window -> Package Manager,然后选择Visual Effect Graph。在右边的面板中,展开Samples,然后选择Import导入VisualEffectGraph Additions。

        2. 样例会自动导入到我们在Project窗口中打开的目录中。找到Bonfire(可以直接在Project window的搜索框中搜索),将其拖入到Hierarchy中。

         3. 在Project窗口中,双击Bonfire打开VFX Graph编辑器,来看看graph。

        和粒子系统的子系统的概念类似,bonfire也是由几个子图构成:Smoke,Flames 和Sparks。每个子图通过一个节点分组(node group)连接到了一起,中间还增加了随机的风向。

        我们还注意到,这些VFX Graphs使用了Operators,Operators是连接到main context的更小的节点。

        Operators允许我们使用数学计算和逻辑表达式来自定义行为,对于更加复杂效果的模拟来说至关重要。 

        VFX Graph能够很轻易地和快速地变得复杂。随着复杂度的增加,效果也会变得更加复杂丰富。

挑战:用VFX Graph制作出前面用粒子系统制作出的火堆和烟雾效果

        关于VFX Graph更详细的说明,可以参考官方文档:

 Visual Effect Graph | Visual Effect Graph | 6.9.2-preview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人生是一个长期的均值回归

到了现在这个阶段,总想说点什么。 我一直觉得记录并收藏每个阶段的状态是一件很有意义且奇妙的事,尤其是多少年后还能清晰地回忆其当初的心境,联想到曾经所设立的一些目标以及为之做出的努力,这些人生经历的脉纹清晰而完整&#x…

机器学习算法 KNN

文章目录 一、概述二、代码实现三、K值的选择四、距离计算五、总结1. K-近邻算法2. 优缺点 一、概述 k-近邻算法(k-Nearest Neighbour algorithm),又称为KNN算法,是数据挖掘技术中原理最简单的算法。 KNN的工作原理:…

QT学习笔记6

一.QLable控件使用&#xff1a; 创建控件&#xff1a; 方式一&#xff1a;代码 文本&#xff1a; QLabel *labelnew QLabel(this);//建立标签 label->setText("这是代码创建标签"); 超链接&#xff1a; label->setText("<h1><a href\"h…

面向对象三大特性之一:封装

目录 什么是封装&#xff1f; 封装的优点 封装的实现 总结 在C中&#xff0c;类和对象是面向对象编程的基础&#xff0c;而封装是面向对象编程的三大特性之一。封装的作用是将数据和行为组合在一起&#xff0c;形成一个类&#xff0c;对外部隐藏实现细节&#xff0c;从而提高…

【C++】位图模拟实现

文章目录 需要实现的接口构造函数如何得知要设置的元素的位置setresetfliptestsizecountanynoneall打印位图的信息 bitset.h 需要实现的接口 namespace Mango {template<size_t N> //N表示开多少个比特位class bitset{public://构造函数bitset();//设置位,将某一个数对应…

Error:java: 程序包lombok不存在

Error&#xff1a;java: 程序包lombok不存在 有时候明明代码窗口里可以看到有这个类,但是启动就是报错说不存在(图1,图2),试过很多办法 1.查看工具中maven的设置,setting文件目录,maven目录,本地仓库目录 2.删除本地maven中的包,重新import, 3.jdk版本是否和pom里面的一致 4.重…

一文教你快速搭建数据驱动自动化测试框架

目录 1. 什么是数据驱动自动化测试框架 2. 搭建数据驱动自动化测试框架的步骤 步骤1&#xff1a;确定测试需求 步骤2&#xff1a;准备测试数据 步骤3&#xff1a;编写测试脚本 步骤4&#xff1a;选择测试工具 步骤5&#xff1a;搭建测试环境 步骤6&#xff1a;执行测试 …

二叉树相关基础选择填空题

目录 1、二叉树的( )遍历相当于广度优先遍历&#xff0c;( )遍历相当于深度优先遍历 2、已知某二叉树的前序遍历序列为5 7 4 9 6 2 1&#xff0c;中序遍历序列为4 7 5 6 9 1 2&#xff0c;则其后序遍历序列为&#xff08; &#xff09; 3、已知某二叉树的中序遍历序列为JGDHK…

信号平滑处理

信号平滑处理 此示例说明如何使用移动平均滤波器和重采样来隔离一天中时间的周期性分量对每小时温度读数的影响&#xff0c;以及如何去除开环电压测量中不需要的电线噪声。该示例还说明如何通过使用中位数滤波器对时钟信号的水平进行平滑处理&#xff0c;同时保留边沿。该示例…

c++算法初级8——递推

c算法初级8——递推 文章目录 c算法初级8——递推递推递推思想的运用错位排序杨辉三角&#xff08;二维递推&#xff09; 递推 递推思想&#xff1a; 根据已有的东西一点点地推出未知的东西。 使用递推解题三步骤&#xff1a; 数学建模找出递推式和初始条件写出代码。 张爽…

[STL]vector的使用+模拟实现

[STL]vector的使用模拟实现 文章目录 [STL]vector的使用模拟实现一、vector的使用1.构造函数2.迭代器3.容量操作4.vector的访问5.vector的修改 二、几个细节1.范围for2.扩容机制3.迭代器失效4.构造函数错误调用5.vector的深拷贝与浅拷贝6.vector的框架 三、vector模拟实现vecto…

hitcon_2017_ssrfme、[BJDCTF2020]Easy MD5、[极客大挑战 2019]BuyFlag

hitcon_2017_ssrfme 进入环境给出源码 <?php if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$http_x_headers explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]);$_SERVER[REMOTE_ADDR] $http_x_headers[0];}echo $_SERVER["REMOTE_ADDR"];$sandbox "sandbo…

Leetcode225. 用队列实现栈

文章目录 1.题目描述2.原题链接3.思路分析4.代码实现 1.题目描述 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int…

树上差分(点差分/边差分)

树上差分一般有两种类型的题目&#xff0c;一种是对边进行差分&#xff0c;另一种就是对点进行差分。 对应的操作也有两种&#xff0c;对边进行差分的对应操作就是给定一对节点(u,v)&#xff0c;让我们把u到v之间路径上的边权都加val&#xff0c;对点进行差分的对应操作就是给…

经验正交分解EOF的Matlab的实现示例

在地学中&#xff0c;PCA和EOF通常用于信号提取&#xff0c;从繁杂的时空数据中分离出地理要素的时空变化特征&#xff0c;是进行地学信号分析的前提。本质上PCA和EOF没有什么不同&#xff0c;只是&#xff1a;EOF为空间特征向量&#xff0c;也称为空间模态&#xff0c;在一定程…

信号完整性分析:关于传输线的三十个问题解答(一)

1.什么是真正的传输线&#xff1f;&#xff08;What is a real transmission line?&#xff09; 答&#xff1a;真正的传输线由任意两条延长一定长度的导体组成。将一根导线标记为信号路径&#xff0c;将另一根导线标记为返回路径。 A real transmission line is composed o…

2023最经典的Python接口自动化测试中的用例编写问题总结

本篇文章分享几个接口自动化用例编写过程遇到的问题总结&#xff0c;希望能对初次探索接口自动化测试的小伙伴们解决问题上提供一小部分思路。 B站讲的最详细的Python接口自动化测试实战教程全集&#xff08;实战最新版&#xff09;_哔哩哔哩_bilibiliB站讲的最详细的Python接…

4月,不要跳槽...

跳槽是每个人都可能面临的选择&#xff0c;但不同的时间点会对跳槽带来不同的影响。对于软件测试人员来说&#xff0c;4月份并不是最适合的跳槽时间。原因如下&#xff1a; 与企业目标和计划相关。一般情况下&#xff0c;公司在1月份会制定本年度的发展目标和计划&#xff0c;而…

力扣sql中等篇练习(五)

力扣sql中等篇练习(五) 1 股票的资本收益 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 每个用户的所有Sell的price值减去Buy的price值就可以了 SELECT stock_name,SUM(IF(operationBuy,price*-1,price)) capital_gain_loss FROM Stocks GROUP B…

IT知识百科:什么是SSID?

一、什么是SSID SSID&#xff08;Service Set Identifier&#xff09;是无线网络中的一个重要概念&#xff0c;它是一个用于标识无线局域网&#xff08;WLAN&#xff09;的名称。SSID可以看作是无线网络的名称&#xff0c;类似于有线网络中的网络名称或者路由器的名称。在无线…