使用Shader Graph着色器视图制作动画材质

Unity 2018.2中,我们给Shader Graph着色器视图加入了“Vertex Position”输入,允许你调整网格并设置网格动画。

本文将演示如何创建顶点动画着色器,并提供一些常见示例,例如:风和水着色器。如果你对Shader Graph着色器视图还比较陌生,可以阅读下面的文章:

下图是Desert Island Scene项目的场景,没使用任何纹理或动画资源,所有内容都通过使用Shader Graph着色器视图来着色和制作动画。110757k6gl01s0gel706l6

着色器是渲染管线中非常强大的一部分,它可以很好控制场景资源的展示效果。通过使用一系列输入和操作,我们可以创建着色器,修改资源上的各种渲染属性,例如:表面颜色和纹理,甚至是网格的顶点颜色。你还可以将这些内容组合成复杂而丰富的动画。

本文将演示如何制作顶点动画,介绍使用遮罩和属性的概念,最后讲解我们如何为Desert Island Scene项目制作着色器。

下载示例项目
下载Desert Island Scene示例项目:
https://github.com/UnityTechnologies/Test_ShaderGraphBlog

下载完毕后,请使用Unity 2018.2或更高版本启动该项目。你可以尝试使用和修改项目中的着色器。该项目包含学习使用Shader Graph着色器视图所需的所有内容。

110801w7c84eb69to667zc
Desert Island Scene场景中的每个着色器都是自定义构建的,请随意修改检视窗口中的着色器数值。每个对象都有预设文件,可以恢复默认数值。

安装Shader Graph着色器视图
使用Shader Graph着色器视图,你的项目必须满足以下要求:
1、在Unity 2018.2或更高版本上运行。
2、使用轻量级渲染管线或高清晰渲染管线,由于LWRP的编译速度更快,建议使用LWRP来进行尝试。
3、资源包管理器中已安装Shader Graph资源包。

为了安装Shader Graph着色器视图,需要创建Unity 2018.2或更高版本的项目,或是将项目更新至该版本,然后打开Window > Package Manager > All,在列表中找到Shader Graph,点击install。

如果材质没有在场景视图中播放动画,请勾选Animated Materials。

顶点位置(Vertex Position)的基础功能
在通过数学运算移动内容之前,我们需要理解要移动的内容是什么。

如下图所示,场景中的网格拥有四类空间(Space):
1、对象(Object):相对于网格轴心的顶点位置。
2、视图(View):相对于摄像机的顶点位置。
3、世界(World):相对于世界原点的顶点位置。
4、切线(Tangent):用于解决一些特殊用例,例如:根据像素形成的光照。

110801v0b4026kkg46bzko.png.thumb
你可以在Position节点的下拉列表中选择要修改的Space类型。

通过使用Split节点,我们可以选择要处理的通道。

image13Split节点输出四个通道,前三个通道对应Transform轴(R=X, G=Y, B=Z)。上面的示例中,我们分离对象的Y轴并加了1,使对象在该轴向上移动1个单位。

有时你可能希望在世界空间移动对象。请先在Position节点中选择World,然后使用Transform节点将输出结果转换回对象空间。

使用遮罩
现在我们已经确定了移动网格的方法,接下来了解如何限制效果。

通过使用Lerp这样的节点,我们可以混合二个数值。T输入是Lerp节点的控制值,当T输入为0时(显示为黑色),使用A通道。当T输入为1时(显示为白色),使用B通道。

下面的示例中,滑块用于在二个输入之间进行混合,以下示例可以用来代替滑块。

110802snnwqlnu11l0jf23
纹理遮罩
通过黑色和白色纹理,我们可以使用细节形状来推动网格。

下图示例中,白色表示范围的最大高度,黑色表示不对网格位置产生任何影响。这是因为黑色的数值为0,所以给网格位置加0不会使它移动。

110808kmiwlilsabnibunh
如果需要带有独特形状或具有特定衰减程度的遮罩,纹理会特别有用。

UV遮罩
和纹理遮罩类似,你可以通过UV遮罩选择要处理网格的哪个部分,具体根据UV展开而定。

下图中,我们使用UV的U轴创建从左到右的渐变效果。如果要偏移渐变,使用Add节点;如果要提高强度,使用Multiply节点;如果要提高衰减程度,使用Power节点。image8顶点颜色遮罩
每个顶点存储一个Vector3信息单元,我们称它为顶点颜色(Vertex Colour)。通过使用Poly Brush插件,我们可以直接在编辑器中绘制顶点颜色。或者,我们也可以使用3D建模软件,例如:3ds Max、Maya、Blender、3D Coat或Modo等来指定顶点颜色。

请注意:默认情况下,多数3D建模软件会导出带有RGB最大值的模型,这些RGB最大值会指定到各个顶点上。

下图中,Vertex Colour节点被分离为红色(R)通道,然后连接Lerp节点的T通道,用作遮罩。当输入为0时,使用Lerp节点的A通道,当输入为1时,使用B通道。实际使用中,如果顶点已指定了红色顶点颜色的话,上述设置只会给Y轴加1。

image2世界方向遮罩
通过使用Normal Vector节点,我们可以通过网格表面方向来遮蔽输入。Split节点允许我们选择需要作用的通道(R=X, G=Y, B=Z)。

下图中,我们使用Y轴来遮罩,所以只有方向朝上的表面为正值。重要的是,使用Clamp节点来去掉不在0~1范围的内的数值。

image20世界位置遮罩
如果对象的位置处于世界空间Y轴为0的位置之上,这一系列节点会遮蔽输入。
image9属性
在制作着色器时,可能很难为理想效果获取正确输入值。出于这个原因,同时也为了之后使用预制件和预设置进行自定义,我们需要使用属性。

属性允许我们编译着色器后修改着色器的数值。创建属性,请点击图中的 + 图标。属性共有六种类型:
1、Vectors (1-4):数值的字符串,带有Vector1的滑块选项。
2、Color:带有颜色选择器的RGB值和可选的HDR版本。
3、Texture2D(和Texture2D Array):2D纹理示例
4、Texture 3D:3D纹理示例
5、Cubemap:生成的Cubemap示例
6、Boolean:控制关或开的选项。等同于0或1。

111512hknn4upk9cjvj5jg.png.thumb

Desert Island Scene示例
下面讲解为Desert Island Scene项目制作着色器的示例。

1、飘舞的旗帜
旗帜的着色器会在旗帜上使用正弦波平移对象空间,并使用UV遮罩来保持左侧的静止状态。

111613zz2c65bpci6jp6zv
首先反转UV遮罩,将其与自身相乘,实现Y轴上平滑的渐变效果。这一步用于将旗帜的中心向远离船桨的方向弯曲。

然后生成对象空间的正弦波,它带有属性用于控制正弦波的振幅、频率和波速。正弦波被X轴上的UV遮罩遮蔽,以保持旗帜左侧的静止状态。

通过将Gradient Noise输出至Step函数,然后传入Alpha Clip Threshold,我们可以去掉一些像素来实现旗帜的残破效果。

Graph_Flag-12、风中的草和棕榈树叶
风着色器使用世界空间位置的Gradient Noise,沿着单个轴平移,实现轻轻吹动树叶和草丛的效果。
111620qqqqmlk2bsff23yb
我们将Gradient Noise放在基于世界坐标的Y轴和X轴上。通过使用Vector2,我们可以控制偏移的速度和方向。

属性用于控制偏移的密度和强度。从Gradient Noise减去0.5可以确保网格被均等地推拉。

UV遮罩用于保持树叶和草丛根部的静止状态。最后,使用Transform节点来将世界位置转换为对象位置。

Graph_PalmLeaves3、腼腆的蚌
通过使用该着色器,我们可以计算摄像机和蚌之间的距离,然后将距离作为遮罩,用来旋转蚌的上半部分。
111626rzsfees6zsn6gzfn
通过将游戏对象的位置和摄像机位置输入到Distance节点,我们可以创建遮罩。One Minus节点会反转距离,使我们在接近蚌的时候得到正值。Clamp节点会去掉大于1或小于0的值。

该UV遮罩只会选择蚌的上半部分,但多数情况下,使用顶点颜色遮罩更简单也更灵活。

Lerp节点用于混合蚌的关闭和打开状态。Rotation会应用于游戏对象的Y轴和Z轴。使其绕着X轴旋转。

Graph_Clam4、游动的鱼
此着色器中,我们使用了正弦波,它沿着对象的轴生成,实现鱼的摆动效果。我们会遮蔽了鱼的头部,使鱼头保持静止。
111632zr6rp36d3hqtyr7l
首先,该着色器会沿着对象空间的Y轴和Z轴生成正弦波,通过属性控制频率和波速。因为我们使用X轴和Y轴,鱼会沿着它的宽度和高度摆动。

然后乘以正弦波的输出结果,控制摆动的振幅、距离和强度,并将其添加到对象的X轴。

使用Lerp节点来遮蔽鱼的前面部分,同时还要使用X轴和UV通道。通过使用带有属性的Power节点,我们可以将摆动效果移动到鱼的后面部分。

Graph_FishWobble5、海浪
最后是海浪着色器。该着色器会偏移网格顶部,使用三个不同大小和角度的正弦波,这三个正弦波也用于生成波谷和波峰。
111637um65osn42a94ddbi
首先在世界空间生成三个独立的正弦波,每个正弦波使用属性来控制波的振幅、频率、速度、收敛和旋转。

将三个正弦波和二个Add节点结合,然后乘以世界比例渐变,从而分解波峰的高度。结合后,正弦波会被添加到对象位置。

使用二个顶点遮罩来将正弦波限制在圆顶的顶部,然后在绘制泡沫时,将正弦波向下推回。

 

sine-wave6生成正弦波
通过分离X轴和Z轴,我们在二个方向生成了正弦波。然后使用二个倍数来设置每个正弦波的效果。例如:将Z通道乘以0,只会在X轴输出一个正弦波。

分离World Position节点到X轴和Z轴,然后将它们结合到Vector2,会得到世界空间中的UV空间。这会确定Gradient Noise在世界空间中的方向。通过将该输出添加到时间,我们偏移了正弦波,分解了原本的直线。

Sine节点使用世界空间和时间来生成简单的正弦波,从而使波峰成为绝对节点,用于翻转负值。One Minus节点会反转这些数值,使波峰处于顶部。

特殊说明
本文所有着色器视图均提供高清版图片,如果无法清晰阅读,请访问下面地址获取:
https://blogs.unity3d.com/cn/201 … -with-shader-graph/

如果需要关于Shader Graph着色器视图的详细文档,包括每个节点的说明,请查看GitHub上Shader Graph开发者Wiki。
https://github.com/Unity-Technologies/ShaderGraph/wiki

使用Unity创作《塞尔达传说:旷野之息》风格的视觉特效

《塞尔达传说:旷野之息》是任天堂游戏公司出版发行的开放世界动作冒险游戏。 发售以来获得业界极高评价,2017年获金摇杆奖年度最佳游戏奖 ,TGA 2017年度最佳游戏。

今天将由来自巴西的视觉特效师Gregory Silva,分享使用Unity创作类似《塞尔达传说:旷野之息》风格令人惊艳的视觉特效。

制作过程视频观看:[anyplayer:url=http://super007fbi.kmdns.net:444/wp-content/uploads/video/saierda_fx.flv width=640 height=360 title=制作过程视频 open=no]

《塞尔达传说》的视觉特效
新版《塞尔达传说:旷野之息》游戏比以往更为出色。在E3游戏展上它的首个游戏视频发布时,我记得视频里的爆炸效果是多么引人眼球。

当我对处理粒子和着色器拥有足够的经验后,观看这些爆炸效果,我开始思考总体时间设置,怎样使其从一个核心点展开,然后像面向摄像机的公告牌一样操作。我把仿制这样特效作为对自己的挑战。

着色器工具
从头编写着色器需要大量的时间,如果使用可视化着色器工具来编译并即时测试着色器,会给开发过程带来很大帮助。

本文中项目中使用的是Shader Forge,但其已停止更新并开源。开发者可以使用Unity 2018.1版本提供支持可编程渲染管线SRP的可视化着色器编程工具Shader Graph

Shader Graph下载:
你可以直接通过Unity编辑器中的资源包管理器Package Manager进行下载使用。

Shader Forge源码:
https://github.com/FreyaHolmer/ShaderForge

光束
在多次观看游戏视频后,我分析了原始效果上纹理所用的形状,然后尝试在Photoshop中仿制这些形状。这些形状基本上是圆形、星形或十字形。

下面原始效果和我制作的粒子效果对比图:144421yulbuv62i7zli28l

 

虽然这些粒子大多是简单的Alpha混合纹理,但需要对带有明亮线条的能量弧进行一些特别处理。为此,我在处理纹理Alpha时使用了二个平滑插值,其中一个插值的最小值比另一个稍微大一些,另一个插值则带有较大的衰减值,然后将这二个值相减,与此同时,使用来自粒子系统的顶点颜色信息来替换最小值。最后将这些线条添加到纹理颜色上。

得到的结果如下图所示

144428vfbwzfqa7tcwt77m

能量的条纹使用了另一个自定义着色器。这些条纹使用了带有曲线形状的简单几何,我在不同的轴上变换缩放大小和旋转角度,创造出多样化效果。

对于着色器,我使用其自带UV制作的遮罩来抹除边框,然后使用滚动噪声值来削减粒子,这一步再次使用了平滑插值和顶点颜色。

 

144435yv2x3ex26753e6ey
光束形状的解决方案非常简单。我使用具有缩放动画的球体,通过粒子系统进行处理,并特别设置其位置使它看起来在向目标移动。对于定位过程,由于这仅用于视频部分,不会在实际游戏中使用,所以可以手动进行定位。

在该特效的实现过程中,可以将粒子位置和目标位置相减来得到方向,然后使用二者之间的距离作为给定轴上的比例大小来进行正确定位。粒子旋转也可以使用之前计算出的方向来设置。

下图是光束的缩放动画:

144441pip5dzrbgcjzlz5h
为了在光束上制作出最后的消逝特效,我使用了效果类似能量条纹的着色器,但是由于球体的UV布局和平面不同,我必须使用与噪声纹理相乘的Fresnel参数来削减不透明度。

下面是效果截图:

144442qrio1yl3tkj31ovv

144442gt55c5t4ttvygqvu
在光束偏转动画上,我也使用了同样的方法,但在比例大小上使用了稍微不同的曲线。我将球体保持在较小的比例,使其面向目标,再增大球体,从而营造一种光束被护盾压缩的感觉,然后快速快速增大光束大小,并使光束变细来产生光束速度加快的效果。

 

144450qj0jane7wqw0ya7z
镜头光晕带有一个复杂的着色器。由于它是《塞尔达传说:旷野之息》中古代之箭特效的主要部分,我花了不少时间制作这个着色器。这个着色器会生成由四边形的UV布局制作的遮罩,添加带有滚动效果并被UV遮罩的焦散纹理,但它带有不同的不透明值。让纹理出现在不透明网格前的技巧是,使用反面视图方向在摄像机方向偏移顶点。

虽然它看起来像在原地不动,但其实它正朝你接近。下图是与其它效果分离的镜头光晕特效:

 144456tbbpu3e57c3b7y31

下图是守护者机器人光束特效的图集:

 144456wzs4tktkchtpghi9

炸效果
大多数爆炸粒子是使用带有Alpha削减的简单纹理,缩放动画来实现。

爆炸效果分为五个阶段,前三个阶段发生速度很快,后二个阶段则比较慢,使得效果较为简洁。这五个阶段是:
1、出现带尖刺的球体;
2、产生冲击波,冲击波是面朝摄像机的圆形网格的一部分,然后快速缩放大小;
3、飞出碎片或残渣,产生猛烈的撞击感,就像开始时从明亮球体飞出的快速粒子;
4、产生高温烟雾;
5、烟雾消散。

下图是原始爆炸效果和仿制爆炸效果分阶段对比图。

 144457z1vh2phv4vxlxvhk

处理烟雾的技巧是使用自发光或使用着色器。在原始特效上烟雾会远离中心点,然后表现得像公告牌一样。

我仿制这个效果的方法是结合使用拉伸公告牌和常规公告牌。拉伸公告牌不会朝摄像机方向发射,这样避免它们看上去像纸张一样薄。我使用了二个半圆环作为发射器,通过脚本使圆环的方向总是朝着摄像机:

144533lt8up8h830v8z6pj
烟雾图都是手工绘制,包括削减的噪声。烟雾的纹理使用了四个通道以及一个自定义着色器,包括:
1、红色通道上的颜色渐变,用来设置烟雾的着色,并为二个颜色做插值,然后乘以顶点颜色;
2、绿色通道上的手绘噪声,用来制作火焰效果,噪声值会与颜色和亮度值相乘,然后添加到粒子颜色上;
3、蓝色通道上是削减动画制作的手绘噪声;
4、带有Alpha上烟雾的形状,用来处理不透明度的遮罩。 144533zfr270tio7k9htr2

另一个纹理用于创建在烟雾消散时龙卷风特效。我使用了一个Photoshop制作的旋转流图,用来在蓝色通道上扭曲噪声的UV。为了只旋转噪声,我给纹理使用二个采样器。

火焰、消散和扭曲的效果都是用自定义数据和顶点流来控制的。Unity的粒子效果有选项用来创建自定义的数据流,通过将粒子数据传入使用UV数据的着色器来实现。

此项目中,我使用了TEXCOORD1.xyzw来控制特效的每个部分:
1、X控制火焰消散效果。我用它来将粒子作为火球启动,然后在火焰消逝时制作冷却效果;
2、Y控制着色的抠出值。这意味着我会控制在烟雾颜色上所带有的阴影数;
3、Z控制Alpha消散;
4、W控制消散噪声的旋转角度。

144534cfftunl7c7sc31t1

古老之箭特效
在多次观看游戏画面后,我将古老之箭特效分离为四个阶段:
1、弓箭蓄力状态;
2、带有焦散的巨大镜头画面;
3、出现一个突然打开然后缓慢关闭的传送门;
4、命中目标被传送门吞噬。

 144535vb36s3auyggo9rug

对于镜头光晕,我使用了制作守护者光束镜头光晕时用到的相同着色器。为了使它带有明亮的核心效果,我使用了二个镜头光晕,一个光晕在另一个之前;一个在Y轴上较小,另一个则几乎覆盖整个屏幕。

传送门的打开过程和爆炸效果类似。我给传送门使用了大量爆炸效果的粒子。当传送门打开时,我使用了相同的冲击波和碎片,换成不同的颜色,从而创造出冲击特效和镜头光晕。

144541giiw3ci5ji5rx36d
然后,我使用了来自守护者机器人光束特效的能量条纹,以及爆炸效果修改了颜色的琥珀,这次琥珀会向特效中心移动,而不是被弹出。

和传送门开启过程相反,吞噬特效的过程较慢。慢速粒子在传送门着色器的作用下会移动到中心,这个着色器拥有向中心滚动的纹理。我还制作了旋涡形状的模型,上面也有纹理向中心滚动。

下图是用于传送门和旋涡的几何体。

144541ibbbv9q44z0pq9pr
开启过程的高潮部分是在旋涡完成后,这个准备过程由弓箭蓄力特效产生。它取决于向守护者机器人发射前的蓄力过程。

大小和动态效果
对于特效的大小,我使用了一个球体作为林克大小的参考对象。这个球体的直径为1个单位,我根据这一点设置场景中守护者机器人的大小。我尝试使特效的大小尽可能接近原始特效,所以我通过观看光束偏转的视频来了解守护者机器人身上的爆炸效果。这让我对仿造的特效大小拥有更好的了解。

对于动画,我尝试为准备状态的每个特效创建顶点曲线,该曲线就在最高顶点之后,它会以较慢的速度结束。除了偏转特效,它还拥有二个顶点。

我还在某些时间点给时间刻度设置了动画,从而让观众注意到特定事件。例如:当守护者光束被偏转后,光束击中护盾时会有短暂的慢动作效果。这个过程会突出护盾被击中的过程,产生击中时的冲击感。守护者机器人的动作也帮助表现了序列的整体动画流。当守护者机器人被击中时,它会被击退,花一些时间来恢复,然后再走回初始位置。

 144543smqui8ko26u8uwov

心得体会
介绍一下我制作这个项目一些心得体会。

首先是时间。像爆炸和古代之箭这样复杂特效的制作大概需要3~5天时间,但这取决于调整时间点和纹理所花费的时间,以及根据艺术总监的反馈做出的调整次数有关。

本项目中,我花了大量时间来制作爆炸效果,因为我正研究原始的爆炸效果,试图通过学习发射技术来模仿出它的行为,并且从烟雾中绘制不同的纹理等。制作古代之箭特效所花的时间就少多了,因为我已经有一些可以使用的纹理和着色器。我花了一个晚上来制作守护者机器人的死亡动画。

学习曲线是个很大的挑战,因为很难找到关于实时VFX制作的较好学习材料。需要观看大量关于特效制作的视频,并不断尝试不同的方法来仿制特效,直到制作出满意的作品。

Unity2018 利用ShaderGraph着色器视图实现炫酷的物体消融特效

伴随着Unity2018.1的正式发布,许多重要的功能也正式跟开发者见面了,我们今天要介绍的Shader Graph着色器视图就是其中之一。Shader Graph着色器视图为开发者提供了一套可视化的着色器开发环境,它通过连接节点图的方式来实现Shader逻辑,既省去了编码调试的繁琐,也不用在代码编辑窗口和Unity之间来回切换查看效果。

在Unity官方技术直播课程中,我们为大家介绍了Shader Graph着色器视图的安装和使用,也介绍了一些实例来帮助大家熟悉Shader Graph的功能。今天我们将通过本文为大家介绍如何用Shader Graph着色器视图来实现消融特效。消融特效是一种在游戏中非常常见的特效,我们常常在物体消失的时候使用这样的特效,当然也可以用在物体出现的时候。

下面二张图分别表示了二种不同的消融效果,左图是表面不规则的消融,右图是按照特定的方向消融。我们将会介绍如何实现这二种不同的效果。

114943z9tadd26623ej3sd
不规则消融
不规则消融效果的实现主要包括二个步骤,首先就是让物体的表面无规则的消失,就像冰块消融在地上一样。然后就是绘制边缘,有的消融效果会有明显的边缘,例如:被火点燃的报纸,燃烧和未燃烧部分有一个明显的边界。

1、实现表面消融
实现表面消融功能的实现很容易,主要是利用一张噪音贴图来映射表面的Alpha值,然后通过控制AlphaTest的值来控制表面区域的显示。由于噪音贴图的不规则性,当AphaTest的值从0到1变化的时候,物体就会逐步无规则的消失掉。ShaderGraph着色器视图的节点图如下图所示。

114943dnnnikkqrrl2ri2r
其中噪音贴图我们使用了ShaderGraph着色器视图内置的SimpleNoise节点,这是一种程序化生成的噪音贴图。同时,我们通过属性节点DissolveAmount作为AlphaClipTreshhold的输入,这样就可以在游戏中使用脚本控制物体消融的动画。

2、绘制消融边缘
首先我们需要找到这个边缘区域,从上面的步骤中可以看到,噪音贴图中小于DissolveAmount的区域即是被剪裁的区域,如果稍微增加一点DissolveAmount,我们就可以得到和显示部分重叠的区域,如下图所示。

114943vkktui1korqjxiiu
上图中圆形部分可以看作被剪裁区域,橙色圆圈外部的扩展部分可视为边缘区域。下面我们就来看下ShaderGraph着色器视图中的具体实现步骤。
114945ijot9je8toegwlw1
首先我们增加了一个EdgeSize的属性节点,并设定值为0.05,大小可以根据实际效果进行调整。然后我们用DissolveAmount 加上 EdgeSize 后再减去噪音值,得到扩展后的剪裁区域。之后利用Step函数把这部分区域的值都变为1,最后再乘以边缘颜色。经过以上步骤我们就初步实现了带边缘的消融效果。
114947h0nnbbib0bibnb5c
以上效果在场景中添加了Unity Postprocessing Stack的Bloom效果,所以颜色显得更加光亮。
114948rngeai35ia235sqa
对于一些燃烧的效果,边缘可能需要渐变色。我们可以利用一张渐变色贴图来进行颜色采样。
114948fs9qeblbefoko3hs
实现上和之前稍有不同,对于扩展后的剪裁区域,我们不再是直接利用Step把值都变为1,因为我们需要利用这部分的渐变数值进行贴图采样。由于这部分的数值偏小,不能直接对应到渐变色贴图的uv坐标,所以在采样之前对数值进行了倍数放大,实际节点图如下所示。
114951hiee04dz9hvmxvsd运行效果如下图所示。
114953qf2k1nbe1v6fjbz6
沿固定方向的消融效果
除了不规则的消融,沿固定方向的消融效果也比较常见。和之前利用噪音贴图来映射Alpha值不同的是,我们需要根据位置来映射Alpha值。例如:我们溶解的方向是自上而下溶解,那么我们需要表面像素的Alpha值从低往上映射到[0,1]区间。

如下图所示,我们主要通过二步来实现了这个映射。首先利用点积把坐标映射到溶解的方向,当前所取方向为(0,1,0)。通过这一步,坐标被映射到[-1,1]这个区间。然后再利用remap把坐标映射到[0,1]区间。

114955zuuaxui4hau0i45t
接下来是添加边缘色。首先需要确定边缘区域,我们还是通过扩展一点剪裁区域作为边缘。表示为公式为:
step(MappedAlpha – EdgeSize,  DissolveAmount)

其中MappedAlpha是上一步计算的Alpha映射值,EdgeSize表示边缘的大小。通过上述公式,我们可以找到扩展的剪裁区域。确定好边缘区域,我们需要进行上色。在本例中,我们使用了像素风格的边缘效果。为了实现像素风格的边缘,我们需要把uv映射到一张像素风格的贴图上。

这个例子中,我们直接使用了计算的方式。公式如下:
FinalColor = step( 0.5, randomRange( floor( uv * k ) ) ) * InColor

通过把uv乘以一个倍数k,再进行floor运算,可以把uv映射到[0,1,……,k-1]的整数数列上,这样就可以把连续值进行离散化。从而实现像素风格的边缘效果。具体实现如下图所示。

114959zic9diimppqxz9vi
运行效果如下图所示。
115000hvuu1tz4jqgrslrv
小结
通过本文介绍,我们可以看到消融效果主要是通过AlphaTest技术来控制表面区域的显示,因此我们需要针对不同的效果实现不同的Alpha映射,对于不规则消融,我们使用噪音贴图来映射;对于方向性的消融,我们使用坐标转换的方式进行映射。

另外,使用Shader Graph着色器视图来实现,整个中间过程都暴露在你面前,因此可以很方便的对于效果进行调整,比如边缘的宽度,颜色,以及像素方块的大小等等。后续我们还会继续介绍基于ShaderGraph着色器视图开发的效果,帮助大家更多的了解这个新的功能。更多精彩技术教程尽在Unity中文官方技术社区(UnityChina.cn) !