介绍
这将是两部分中的其中之一,将介绍我如何创建 雨水在斜坡上的表现 在UE4中用材质函数 这一部分将介绍如何在直接受雨撞击的表面上创建雨涟漪/图案,无需多说,让我们开始吧!
Textures
有两个主要的纹理贴图,我们需要用它来创建所需功能, 第一个是水滴的RGB通道压缩MSK纹理,条纹和条纹渐变. 使用适当的渐变值编写此纹理对于shader准确的工作很重要。.
在这部分, 我们只会用带液滴遮罩的红色通道, 在第2部分中,将利用其他两个通道来创建条纹效果。
另一个纹理将是水滴的正常贴图
基本概念
基本思想是使用 Alpha 侵蚀 在红色通道的图案上我们的通道填充纹理, 用一些额外的数学计算来创造波纹
所以我们开始吧, 在UE4中创建一个新的Material函数,并根据需要命名它。, 我称他为“mf_ripples”(这是一个临时函数,在本文的第2部分中,我们将结合本文中创建的内容)并设置节点,如下所示
上面的网络创建了一个基本的Alpha侵蚀设置, 从我们制作材质函数开始, 我还设置了两个函数输入来控制 涟漪大小 和雨速
上面的方程给出了一个简单的周期 0-1, 0-1, 我们可以从 红通道 的贴图, 看到的APLHA侵蚀效应
现在我们可以使用一些数学方法来创建一个简单的边缘遮罩,使扩展点看起来像波纹。从“减法”节点中获取结果,然后执行以下操作:
这将导致点的边缘被遮掩,给我们一些看起来像的东西,并扩大波纹
不错,但是波纹出现和消失得太突然,我们需要让它们随着时间的推移逐渐消失和消失,以使它看起来更自然。我们可以通过一点数学来达到这个目的:
时间乘以 RainSpeed 我们之前做的变量.
我们要做的是将结果乘以 边缘遮罩 绝对值 sine-波纹 i.e 没有负部分, 有一段时间 [1,0,1] 而不是[1,0,-1,0,1]. 我们重新调整时间sine-波纹 所以它去 [0,1,0] 同时我们的Aphla侵蚀时间函数 [0-1]. 这在下图中可见.
我们乘的方程是
当波纹达到其最大尺寸时,这一结果会很好地从波纹中消失,如下所示
隐藏时间循环
这看起来不错,但目前的一个大问题是,波纹不是连续的。我们需要找到隐藏这种效果的方法,这可以通过创建当前设置的时间偏移并将两者结合在一起来实现:
因此,复制并通过当前节点网络并将其放在上面,以便当前节点网络在图像中标记这些小更改
所以我们做了两件事,首先我们将UV偏移0.1,这样第二组涟漪与第一组涟漪不在同一个位置.
接下来,我们添加0.5的时间偏移,以便这些波纹以与第一个网络相比0.5s的频率偏移开始和结束。
您可以在下图中看到两个时间频率可视化
现在我们可以在这两组涟漪之间进行混合,时间函数的频率完全相同,以隐藏突然的开始和无缝的涟漪。
现在我们使用这个插值时间函数作为两组涟漪之间的α到Lerp,无缝的涟漪。
纹波法线
涟漪的法线是starightforwad来设置,我们只使用两组涟漪中的纹理坐标并将它们提供给两个单独的TextureSamples,它们与之前链接的相同的Normal纹理,然后我们在这两个法线之间进行混合,相同的时间插值函数。
湿表面,基本材质输入
涟漪的所有基本设置都已完成,现在我们需要设置从基础材质(BaseColor,普通,金属,粗糙度)获取输入的方法,以便我们可以混合涟漪和水面效果。以下部分将介绍如何要做到这一点。
基本颜色
对于BaseColor,我们需要添加一个函数输入来从基础材料中接收基色,以便我们可以覆盖水的颜色。然后我们覆盖水彩并使用我们刚刚创建的ripplemask混合它。
首先添加4个函数输入WaterBrightness(标量),BaseColor(Vector3),WaterColor(Vector3),Metallic(Scalar)</B>
我们采用BaseColor输入并将其与水彩相乘,然后与水亮度相乘,这为涟漪创造了基色。
我们也采用基色并将其乘以0.5以使其颜色更深,我们这样做是因为大多数表面在潮湿时颜色变深,有一些例外,主要是金属/非多孔材料。这就是为什么我们使用金属输入来常规基色和倍增的基色之间的lerp。
我们在这些结果之间进行ninterpolate与teh Ripple创建最终的baseColor输出。
创建一个名为Basecolor的函数输出并将其插入其中
法线混合
在本节中,我们创建一个函数输入来读取基础材质法线信息,然后在其上叠加纹波法线。
我们采用我们之前创建的纹波法线,并使用方便的Blend Angle Corrected Normals函数将其与基础材料法线信息相结合,然后使用ripplemask在基础材质法线和叠加法线之间进行变换。
然后,我们创建一个名为Normal的函数输出并将结果插入其中。如果您预览结果,您将看到涟漪被覆盖::
金属,粗糙度
金属和粗糙度设置非常简单::
对于Metallic,我们设置了一个函数Input来读取Base Material Metallic值,我们用0.0的值对它进行线性插值(我不确定用于水的正确金属值是多少但是我喜欢0.0,因为..水不是金属)再次使用ripplemask作为alpha,然后将其插入名为Metallic的函数输出中。
对于粗糙度,我们设置一个输入函数来读取基础材质的值,将其乘以0.5的值(因为一旦表面湿润,它往往更光亮),然后将其值为Lerp 0.0使用ripplemask作为alpha。然后我们创建粗糙度的函数输出并将其插入其中。
这就是我们现在所需要的所有功能,我们可以创建更多的波纹以添加更多变化,但是现在这已经足够了,我们可以做的另一件事就是添加折射选项,以便水可以折射和弯曲表面上的光线,当我们看到条纹和斜坡时,将在第2部分中介绍的内容。
第二部分将是斜坡的水流