一.雨水水坑着色器
要用到这样一个噪声贴图,我们要做的就是,做出水坑并让水坑在这种浑浊的噪点中产生,因此水坑将从最暗的斑点生长,然后随着它继续占据越来越亮的像素而生长

现在水坑将从上到下投射到世界空间中,所以我需要引入WorldPosition(世界位置)节点,使用RG通道,也就是XY分量,因为z分量是向上的,乘上一个较小的数得到一个正确的大小单位。

接着调整UV让我们呢只会在最暗的地方得到水坑,首先创建一个常量表示水坑的大小,接着创建两个二维向量表示水坑最大和最小的时候的大小,黑色的就是水坑

然后用1-x让白色的成为水坑,同时我们不想让侧面和不平坦的地方出现水坑,通过顶点法线的z值与之前的颜色蒙版相乘,现在只有上面有水坑了

然后还要把结果乘1.1,这样做是为了确保水坑自始至终是从黑色变成白色

接下来要做的是加入法线,这里创建了一个新的材质函数
主要思路就是用了两组不同的UV采样同一个法线贴图之后进行混合。
首先获取绝对世界位置的RG通道然后用AppendMany节点附加在一起,这样就可以获取两组UV坐标,然后乘一个值缩放世界位置,这样波纹就会是我想要的大小,然后引入时间变量控制速度和方向

然后将采样两张法线贴图的结果的RG通道相加,B通道相乘,加入一个风的强度的影响用来控制法线的高度。


然后将Ripples和Winds的法线合并一下,将两个法线相加以后取R,G通道,然后Append一个1创建法线,也可以分别取B通道相乘当作z分量,这里只是减少计算量

然后可以根据一开始计算的水坑作为mask进行插值,但是在这之前要修改一下水坑的大小,因为目前水坑太小了。将世界位置再乘个0.3就可以放大水坑。


现在我们成功创建了一个生成水坑的着色器,而且可以通过常量控制水坑的大小,或者通过值控制雨水涟漪和风的强度,现在要做的就是将所有这些整合到一个材质函数中,只需要移植过来即可,并且把水坑的mask也作为一个输出

然后应用这个函数到其它材质上看看效果,效果还不错


二.完整雨水着色器
现在要把之前做的东西都合并起来。
首先是Wetness函数,直接赋予输入参数然后连接到根节点就可以了。,然后是Drops和Drips,需要将它们的法线根据Drips的mask进行插值,然后需要把它和从外面,(即表面)进来的法线结合起来,这将混合外部材质的基础法线和水滴与雨水流淌的法线。然后我们要在组合的法线与外部法线之间混合起来,所以还需要一个插值,不下雨的地方使用表面法线,下雨的地方使用混合法线。
然后将法线赋予puddles函数,并且赋予puddles函数的其它输入。
对于porousness这个输入参数,代表了材质的吸水性,理想的情况下是通过一张纹理表示材质的某个部分是否吸水,在这里我们通过粗糙度和金属度获得吸水性。
然后还要制作一个Wetmask,取puddles和Drops和Drips的mask的最大值,但是此时潮湿度只来自我的Puddles(水坑)、Dropss(雨滴)和Drips(雨水流淌),我门真正想做到的是让物体作为一个可以变潮湿的整体,所以可以根据下雨的时间赋予整个物体一个潮湿度

OK然后我们将这些转换成一个材质函数,但是这是我们创建的最耗能的一个版本,因为有的材质函数在一些材质上完全用不到。比如一个地板材质完全用不到Drips函数。所以我们可以创建这个函数的不同版本,

然后应用到一个其它的材质看看效果

我们还可以通过蓝图控制材质的参数,比如让Rain的值从0到1逐渐变大,随着雨的增加逐渐增大水坑和风的大小等等 ,下面有一些用蓝图控制材质的教程
UE4 Tutorial 101 --- Control Materials ... https://www.youtube.com/watch?v=I8s-Bt-YOUg&t=0s UE4 Tutorial: Changing Material Color...
https://www.youtube.com/watch?v=PipNG7P7jYc&t=0s UE4 - Tutorial - Dynamic Materials in...
https://www.youtube.com/watch?v=6OTaEHfRyH8&t=0s