Unity学习笔记 Vol.75 在URP中模拟风的效果(Shader Graph 教程)
摘要
这节内容是介绍如何在通用渲染管线(URP)中用ShaderGraph制作风与植被交互的效果。 有关 Boat Attack Repository,请查阅官方视频。

教程

这节我们将学习如何使用Shader Graph模拟能作用于场景植被的风,在Boat Attack通用渲染管线游戏Demo中,我们用Shader Graph为树木和树丛制作了一个着色器,让网格随时间前后移动,呈现一种被风吹动的效果,那来看看使用Shader Graph制作此类着色器的基本方法。让树木看起来就像在风中摆动一样。

选择Shader > PBR Graph新建着色器,称之为Vegetation。

再创建个材质,指定到树木上。

先创建Albedo和Normal纹理,Smoothness纹理和 Normal纹理是打包在一起的。

因此需要用Remap节点将Normal纹理标准的0到1范围,转化为-1到0取值范围。

Smoothness储存在Alpha通道中,那么将输出连接到主节点的Smoothness通道上,接着将Albedo连接到主节点,而Alpha值也储存在该纹理的Alpha通道中,也需要将Alpha通道连接起来。

一棵树完成了,不过它看起来是静态的,接下来看看如何使用主节点的 Vertex数据和Vertex位置属性来操纵网格的顶点。

我们将构建一系列的节点,来储存、修改对象的位置,新建Position节点,将Space设为Object,再创建个Split节点。

为了从顶部开始修改网格,我们要用到绿色通道,将绿色通道连接到一个新的Multiply节点,接着在黑板上,新建个Vector1属性作为Bend Strength(变化强度),属性效果不能太明显,那在接入Multiply节点前,先将数值除以100,这样在检视器中调整数值会更方便。

我们不能直接偏移顶点的位置,而要用一个函数来实现弯曲,让顶点能相对于网格中心来偏移,且距离越远、变化越大。因此我们需要重新映射这些数值。新建Add节点,让数值加上1,然后使其乘上自身两次,再将两个Multiply节点连接到一个Substract节点,该函数会将网格的位移限定在一个球体内,适合于制作弯曲动作。

要想进一步了解这种函数及其它类似的几何形弯曲、偏移函数,请访问官方文档。

接着,在黑板上新建一个Vector2属性,称为Direction,用于设定弯曲的方向。新建Multiply节点,接入Vector2和Subtract的值。

然后拆分节点的输出,将其链接到一个新的Vector3节点上,因为对象不会在y轴上移动,需要将Split节点的绿色通道连接到Combine节点的蓝色通道。这样一来只有x和z轴方向会受到影响。

我们还需为Bend值添加WorldPostion,新建Position节点,将Space设为World,将其与弯曲值一起连接到一个新的Add节点上,用另一个Transform节点将输出转回Object空间。

再将输出连接到主节点的Vertex Position上。

这下我们就能在Unity中用Bend和Direction设定,来让树木弯曲、变形,注意树木高处的弯曲、变形要比低处的幅度要大,这归功于先前的弯曲函数。我们可以在此修改材质的变形属性,如果想手动控制移动的效果。不过,也能使用着色器中的偏移属性来动态地让树移动、变形。

在Shader中,新建一个Time节点,将Cosine.Time乘上Bend的相关属性。现在,树木和树丛会前后移动、变形了。挺不错的。但是我还想进一步控制效果,并且只让树叶变形,不让整棵树变形,幸好网格带有已上色顶点,可用作过滤条件。


如果观察顶点颜色,能看到树干大部分为蓝色。如果我们仅在绿色和红色通道上应用变形,树干应该就不会动了。

在Shader中,拆分顶点颜色,仅混合红色和绿色通道。

再新建个Lerp节点,利用该节点,根据顶点颜色来混合对象位置和输出结果。

这时再看回树木,只有叶子在移动。这里看起来很不错了,但动作过于统一。如果能让单个叶子独立地移动、变形就更好了。我们能通过在最终顶点位置上传入噪声纹理来实现效果。


在Shader中,新建个Lerp节点,将先前的Lerp连接到这。

接着,在时间输入点上,用Gradient Noise节点创建一个噪声纹理。
这下再看到树木,Bend函数现在能让每片叶子向不同方向变形、移动,通过给噪声纹理添加动画,我们就能模拟风吹过叶子的效果。

在Graph中新建Tiling And Offset节点,将其连接到Gradient Noise节点的uv上,接着用Time节点乘上Offset节点。在黑板上,新建一个Vector1属性称为Speed,把它连接到Multiply节点,来控制噪声的移动速度。

再新建一个Vector1,连接到噪声的Scale属性上,用以确定效果密度。
现在再看树木,叶子的移动更加独立了。根据风的效果不同,你也能移除Bend属性中的Cosine.Time值来形成持续性的运动,我们能调整尺寸、噪声、弯曲和方向参数来制作出想要的场景效果,可以看到,顶点变形、顶点绘制和噪声纹理能很好地用于创建材质的动画,无须再依赖其它外部组件,若想更多地了解高级着色器和其它用Shader Graph搭建场景的着色器,请下载官方Boat Attack Demo项目。