达哥课堂|使用Shader Graph制作飘动的巨龙
Unity技术经理罗志达开辟了“达哥课堂” ,分享一系列Unity课程,本期他将分享使用Shader Graph着色器视图和轻量级渲染管线LWRP制作了一个飘动的巨龙效果。
我们将在本文中详细介绍特效的制作流程,并通过简单的方式介绍Shader Graph着色器视图的一些基础用法。
本文的项目文件请访问Unity Connect下载:
https://connect.unity.com/p/swimshader
项目准备
本项目,我们需要使用Shader Graph着色器视图和轻量级渲染管线LWRP。
请点击Unity编辑器的菜单Window > Package Manager,在Package Manager资源包管理器找到Lightweight RP资源包和Shader Graph资源包,单击Install按钮即可。
导入二个资源包后,我们要选取项目使用的渲染管线资源。
在项目窗口单击右键,选择Create > Rendering > Lightweight Render Pipeline Asset,创建LWRP设置文件。
在Unity编辑器菜单点击Edit > Project Settings,打开项目设置,单击Graphics部分,找到Scriptable Render Pipeline Settings并指定为刚刚创建的LWRP设置文件。
设置巨龙外观
在开始制作之前,请确保已经下载好前面提供的项目文件。
我们创建并打开新场景,将项目文件导入Unity,然后把龙的模型即EelDog文件拖到层级窗口。
通常,3D模型由艺术家在3ds Max或Maya中制作,导入时会附带纹理,本项目中巨龙的模型没有自带纹理,需要进行额外设置。
龙的模型使用的材质为项目文件的Fish材质,指定的着色器是轻量级渲染管线的Lit着色器,不带有任何纹理。
现在我们修改模型的着色器,在项目窗口单击右键,选择Create > Shader > PBR Graph,创建新的着色器并命名为Swim。
选中EelDog的模型,点开材质上Shader的选项,选择Shader Graphs > Swim,把该模型上材质使用的着色器改为新着色器。
我们使用Shader Graph着色器视图来修改龙的外形。单击材质部分最右侧的齿轮图标,单击Edit Shader…选项,打开着色器视图的编辑窗口。
我们可以把Shader Graph着色器视图窗口拖到正中央,和游戏视图并列,然后把场景视图拖到左下角。这样的布局可以方便我们观察效果的变化。
预览画面上方是着色器的属性,我们看到现在已经使用了新的着色器,它只带有默认的属性。
PBR Master节点是着色器的主节点,它可以设置Unity标准着色器的常见属性,例如:Albedo负责处理表面的纹理和颜色,把Albedo左侧的节点改为红色后,龙也会变成红色。
我们创建一个用来存放纹理的节点,在Shader Graph着色器视图空白处单击右键,选择Create Node,在搜索框输入“sample”,在搜索结果选择Sample Texture 2D节点。
Sample Texture 2D节点的作用是取样纹理,我们可以通过该节点上Texture左侧部分指定艺术家绘制好的表面纹理。节点右侧是不同的输出设置,我们可以全部输出RGBA四个通道,或者只输入其中的部分通道。
把Sample Texture 2D节点的RGBA输出连接到PBR Master节点的Albedo部分,然后在Sample Texture 2D节点指定纹理,单击Texture 左侧的齿轮图标,在打开Select Texture窗口选择EelDog_Green_Albedo纹理。
添加后,材质设置会出现纹理图片,但是Texture2D属性是灰色的。为了可以在材质设置直接修改纹理图片,我们要把该属性设置为全局变量。
在Shader Graph着色器视图左侧的变量窗口单击+按钮,选择Texture2D,把该属性命名为Skin_a,并确保勾选Exposed复选框。
然后拖动Skin_a到视图,这会自动创建一个Property节点,将输出部分连接到Sample Texture 2D节点的Texture输入。
Property节点能接收着色器之外的信息,因此我们可以在检视窗口直接修改纹理图片。
法线纹理也能通过相同的方法来指定,我们可以使用创建好的Sample Texture 2D节点快速实现法线纹理的指定。
右键单击Sample Texture 2D节点名称,选择Duplicate创建该节点的副本,这样可以复制该节点和上面的设置。
添加另一个Texture2D,在左侧变量窗口单击+按钮,选择Texture2D,把该属性命名为Skin_n。
把新属性拖到视图中,将Property节点连接到Sample Texture 2D节点副本的Texture输入,该节点的RGBA输出连接到PBR Master节点的Normal输入,Type改为Normal,Space设为Tangent。完成操作后,点击Save Asset进行保存。
现在我们单击检视窗口的Skin_n右侧属性框指定法线纹理,选择EelDog_Normal文件。
添加后,巨龙身上就有了凹凸的效果。 如下图所示,左图是添加法线纹理前的效果,右图为添加后的效果。
在Shader Graph着色器视图调整数值类型的变量时,必须在保存后才会看到变化,例如下图中的属性。
如果想从视图之外进行调整,并立即看到变化,我们可以在变量窗口添加Vector1类型变量,把它命名为着色器内相应属性的名称,例如Metallic,然后把它连接到该属性,单击Save Asset保存改动。
这样,检视窗口就出现了Metallic属性。
默认情况下要输入数值来调整该属性,我们也可以把Metallic属性的Mode改为Slider,并定义Max最大值和Min最小值。
这样,Metallic属性就可以在设定范围内通过滑块来调整。
设置飘动的动画
我们先整理视图,把设置好的节点拖到右侧,以便处理新的节点。
要让巨龙飘动起来,最重要的节点是Position坐标节点。
在视图空白位置单击右键,选择Create Node,搜索position并添加Position节点。Position节点提供四种空间:对象坐标,视图坐标,世界坐标和切线坐标,坐标输入的是XYZ值。
说明一下连接线的颜色,不同颜色表示了不同的输出数量:一个输出量的连接线为蓝色,二个为绿色,三个为黄色,四个为粉红色。
当数量大的部分连接数量小的部分时,会有部分数值被忽略。
如果将Position节点直接连接PBR Master节点的Position部分,由于此时Position节点的Space空间类型为World,它会用世界坐标取代原来的对象坐标,单击Save Asset保存后,就会产生偏移的效果,如下图所示。
如果把Position节点的空间类型改为Object,则不会发生变化。
Position节点的输出有XYZ三个数值,以一组数值整体的形式呈现,我们可以通过Split节点拆分该输出为三个值。虽然Split节点显示有四个值,但因为输入只有三个值,因此其实只会拆分出三个值。
有拆分的节点,就会有组合的节点,即Combine节点,该节点能把输入的数值组合成一组数值。
如果把Split节点拆分出来的三个值连接Combine节点的三个值,经过组合后连接PBR Master节点的Position部分,会把坐标原封不动地组合回来,因此不会发生任何变化。
了解了这些内容,我们就可以通过调整部分坐标的值实现扭动的效果。
现在添加Add加法节点,它负责将输入的二个值相加。把Split节点的R部分连接到Add节点的A部分,然后把Add节点的Out输出连接到Combine节点的R部分,我们就有多一个输入来影响最后的组合值。
如果想持续改变数值,Time时间节点是很好的选择。
添加Time节点,我们会看到该节点有很多时间格式可供选择。我们可以先尝试使用Sine Time来影响坐标,把Time节点的Sine Time连接到Add节点的B部分。
单击Save Asset保存后,虽然对象没有改变自身的坐标,但是龙的外形会在预览中发生左右平移。
下面我们针对不同的节点添加不同的值。
首先添加另一组Position节点,用Split节点拆分它的值。我们要把坐标和时间相加,因此添加Add节点,只取用Position节点的Z值和Time节点的Time部分做加法运算,把相加结果连接到之前Add节点的B部分,如下图所示。
在二个Add节点之间,添加一个三角函数Sine节点,用来把之前不同时间影响的顶点坐标做角度偏移的计算。
单击Save Asset保存后,我们会看到龙已经开始扭动。
Shader Graph着色器视图中Time节点,Position节点和Sine节点的影响分别表示摆动速度,摆动频率和摆动距离。
我们把速度,频率和距离这三个变量设为可以在检视窗口修改的变量。在变量窗口添加三个Vector1类型的变量,分别命名为Speed,Frequency和Distance。
把三个变量分别拖到视图中对应节点的下方,以便后续处理。
使二个值相加可以用Add节点,如果想大幅增大一个值,可以使用Multiply乘法节点。我们希望可以在检视窗口调整这些值,而且不想使数值变化过大才出现理想的效果,因此我们可以使用Multiply乘法节点,使数值能更轻松地进行调整。
我们添加三个Multiply节点,它们的A部分分别连接Time节点,Position节点和Sine节点的原来输出部分,Multiply节点的B部分连接各节点下的Property节点,连接结果如下图所示。
请注意:下方红框最左为Position节点,Split节点的B部分连接着Multiply节点的A部分。
单击Save Asset保存后,我们可以在检视窗口看到新增的三个数值。
我们可以调整这些数值并观看效果。
这样龙就有了扭动爬行的效果。
如果想把动画改为龙在天上飞行的效果,不必像骨骼动画那样重新制作动画,我们只要把原来的影响X轴坐标改为影响Y轴坐标即可。
我们让Split节点的R部分直接连接到Combine节点的R部分,而Split节点的G部分要先经过Add节点相加后,再把Add节点的结果连接到Combine节点的G部分。
经过调整后,龙就会上下扭动,得到在空中腾云驾雾的感觉。
其它调整
由于整条龙共用一个着色器,所以龙的头部也会进行扭动,发生变形。如果要解决这个问题,我们可以把头部改为使用其它着色器,或者把该着色器使用到数量较大而且离摄像头较远的对象。
你或许有一个疑问:使用着色器视图制作的着色器是否可以修改代码?
答案是肯定的。在PBR Master节点单击右键,选择Copy Shader,就能把着色器代码复制出来,这样我们就可以根据不同平台对着色器代码进行修改或优化。
小结
通过本文介绍,我们可以发现使用Shader Graph着色器视图制作着色器是多么简单,而且能够实现出想要的动画效果。整个处理过程通过视图的形式一目了然,让我们能在完成后轻松进行调整或制作变体效果。
更多Unity精彩技术经验分享和谈论,尽在Unity Connect平台(Connect.unity.com)。
推荐阅读
Unite Shanghai 2019
5月10日-12日上海,Unite大会强势回归。技术门票正在热销中,购票即获指定Asset Store资源商店精品21款资源的5折优惠券。
购票请访问:Unite2019.csdn.net
点击“阅读原文”访问Unity Connect