本文介绍风格化草材质的制作方法。
本文方法、素材来源于【UE5】从零开始做原神(5)风格化草全流程(上)_哔哩哔哩_bilibili
基础
首先,导入草的模型,在设置里将投射阴影关掉。找一个区域,开启植物模式,选择草的模型,进行刷草。

创建一个材质,创建一个三维向量,选择颜色,连接到基础颜色,然后将粗糙度设置为1。

你会发现在光照之下草的背部会是黑色,而正面才是正常颜色,所以我们需要调整法线来使草在不同的阳光之下显示正常。再创建一个三维向量,将z设为1,连接到法线上。点击空白位置或基础的材质节点,在左侧的细节面板关闭切线空间法线。

渐变

我们需要创建一个从上到下渐变的蒙版。Mask节点可以用来提取通道,但其本身又是一个带渐变的蒙版,点击节点右上方的箭头就可以展开。当选择G通道时,就是一个由上到下逐渐变化的蒙版。我们将他通过power节点改变其效果,当乘方的数为小数时会增加红色的区域,也就是更接近为1的区域,乘方的数大于1会增加黑色的区域,也就是接近0的区域。我们将原来的颜色乘以三维向量(2,2,2),这样可以使颜色变得更鲜亮,将乘后的材质与原材质用lerp混合,连接到基础颜色。
草根部与地面过度


使用DitherTemporalAA节点,再乘一个数,连接到像素深度偏移,乘的数值可以控制根部过度的长度。
风

风力的核心节点是SimpleGrassWind,连接到全局位置偏移就是一个风的效果。左边的前3个引脚分为代表风力强度、风阻力、风速度。如果直接连接到全局位置偏移会使整根草都有风动效果,所以我们需要一个蒙版只让风对草的上半部分有效。对uv进行mask提前G通道,用1-x将其反向,再进行乘方调节黑色与红色区域的分布。用这个当作Alpha让0与风力进行lerp,这样根部为黑色的部分就不会移动。
这样的风力效果是所有草都会有,如果我们想做风时有时无,吹过草地的效果,我们可以使用一张蒙版贴图,再对贴图进行移动就可以了。导入贴图,因为草铺在世界中,所以我们用WorldPosition绝对世界位置连接到图片的uv。绝对世界位置是一个较大的数,我们可以除以一个较大的数来使效果更明显。使用Panner移动节点就可以使图片移动了,speed引脚里的数值就是移动的方向与速度。最后将蒙版连接到附加权重里就可以了。
风吹过时草尖颜色改变

我们找到原来改变草尖颜色的部分。我们让另一个颜色与原来草尖颜色进行lerp混和,Alpha是我们风动的那张蒙版图。A连接无风时草尖的颜色,B连接有风时草尖的颜色。因为我们只想让草尖的颜色改变,所以在草根与草尖的lerp前进行lerp。
草倒塌

NormalizedRotationAxis:输入一个单位化的轴向,这个轴向就是所要围绕的轴
RotationAngle:旋转角度,很好理解。
PivotPoint:接收代表枢轴点的三通道矢量,对象将绕着该枢轴点旋转。
Position:接收代表对象位置的三通道矢量。
最简单的是Position,我们需要在世界坐标中旋转,所以此处连接绝对世界位置。
我们需要用到一张位置贴图,这张贴图记录了所有草的相对位置信息。所以我们用TransformPosition节点将位置信息转化为绝对世界位置,注意在更新的版本ue中需要把这个节点的源改为实例与粒子空间。然后连接到PivotPoint,当做枢纽点。
接下来我们创建一个材质参数集,添加一个向量,这个用于传递玩家位置。因为材质参数集的向量是四维向量,所以用mask取RGB三通道。我们想要让草向外倒去就需要绕着过草根部、在地面内与玩家位置垂直的那条线进行旋转。所以需要用玩家位置减去每根草的位置,得到一个向量,再让这个向量与(0,0,1)进行叉乘(cross),得到垂直前面两个向量的向量,最后归一化(Normalize)就是我们旋转需要绕的轴,把它连接到NormalizedRotationAxis。
我们想做出在玩家周围一定半径草倒塌的效果,所以球心为玩家位置,坐标系为绝对世界位置,在这里交换A、B引脚结果不变。为了让更靠近玩家的位置倒塌地更明显越远离玩家的位置倒塌地越不明显,所以边缘硬度应设为一个较低的值。最后乘旋转角度,连接到RotationAngle。这样在球形遮罩内的草才会有旋转角度而进行旋转,在遮罩外的草旋转角度为0就不会进行旋转。
如果这样直接连上全局位置偏移,那么会发整根草都会有旋转效果,而我们之前需要让草的上部旋转,所以需要一个遮罩乘以绕轴旋转。遮罩的思路参考风部分的遮罩思路。最后让乘后的值加上风,连接到全局位置偏移,就能实现风与倒塌的叠加。

要设置玩家位置,需要在对应物体的蓝图里使用set Vector Parameter Value。在Collection里选择创建好的材质参数集,这样Parameter Name就会出现你创建的参数名,选择那个参数。我们获取actor位置连接到Parameter Value就好了。


草倒塌的效果可以通过改变用遮罩来实现。想实现下图的效果,我能可以mask的G通道,我们给整体加上1,这样草根部的旋转就更明显,草上部的旋转更接近正常。

草随机颜色

PerInstanceRandom(按实例随机)表达式按材质所应用于的静态网格实例输出不同的随机浮点值。
空间中的一个点与每个草的位置求距离,距离近的接近0,距离远的接近1,以这个为蒙版连接到Alpha通道。将本来的颜色与一个颜色相乘从而改变颜色。然后将改变后的与为改变的相乘。
