• Home
  • About
    • 黑脸包公 photo

      黑脸包公

      书山有路勤为径,学海无涯苦作舟.

    • Learn More
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

滑落的雨水以及涟漪效果(一)

13 Oct 2018

Reading time ~1 minute

介绍

这将是两部分中的其中之一,将介绍我如何创建 雨水在斜坡上的表现 在UE4中用材质函数 这一部分将介绍如何在直接受雨撞击的表面上创建雨涟漪/图案,无需多说,让我们开始吧!

Textures

有两个主要的纹理贴图,我们需要用它来创建所需功能, 第一个是水滴的RGB通道压缩MSK纹理,条纹和条纹渐变. 使用适当的渐变值编写此纹理对于shader准确的工作很重要。.

在这部分, 我们只会用带液滴遮罩的红色通道, 在第2部分中,将利用其他两个通道来创建条纹效果。

另一个纹理将是水滴的正常贴图

基本概念

基本思想是使用 Alpha 侵蚀 在红色通道的图案上我们的通道填充纹理, 用一些额外的数学计算来创造波纹

所以我们开始吧, 在UE4中创建一个新的Material函数,并根据需要命名它。, 我称他为“mf_ripples”(这是一个临时函数,在本文的第2部分中,我们将结合本文中创建的内容)并设置节点,如下所示

上面的网络创建了一个基本的Alpha侵蚀设置, 从我们制作材质函数开始, 我还设置了两个函数输入来控制 涟漪大小 和雨速

TextureSample2D.x - (1.0 - frac(time*RainSpeed));

上面的方程给出了一个简单的周期 0-1, 0-1, 我们可以从 红通道 的贴图, 看到的APLHA侵蚀效应

现在我们可以使用一些数学方法来创建一个简单的边缘遮罩,使扩展点看起来像波纹。从“减法”节点中获取结果,然后执行以下操作:

这将导致点的边缘被遮掩,给我们一些看起来像的东西,并扩大波纹

不错,但是波纹出现和消失得太突然,我们需要让它们随着时间的推移逐渐消失和消失,以使它看起来更自然。我们可以通过一点数学来达到这个目的:

时间乘以 RainSpeed 我们之前做的变量.

我们要做的是将结果乘以 边缘遮罩 绝对值 sine-波纹 i.e 没有负部分, 有一段时间 [1,0,1] 而不是[1,0,-1,0,1]. 我们重新调整时间sine-波纹 所以它去 [0,1,0] 同时我们的Aphla侵蚀时间函数 [0-1]. 这在下图中可见.

我们乘的方程是

abs(sin((Time*RainSpeed)*0.5));

当波纹达到其最大尺寸时,这一结果会很好地从波纹中消失,如下所示

隐藏时间循环

这看起来不错,但目前的一个大问题是,波纹不是连续的。我们需要找到隐藏这种效果的方法,这可以通过创建当前设置的时间偏移并将两者结合在一起来实现:

因此,复制并通过当前节点网络并将其放在上面,以便当前节点网络在图像中标记这些小更改

所以我们做了两件事,首先我们将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部分中介绍的内容。

第二部分将是斜坡的水流



shader Share Tweet +1