Unity 水、流体、波纹基础系列(三)——波浪(Waves)

目录

1 正弦波

1.1 调整顶点

1.2 调整Y

1.3 振幅

1.4 波长

1.5 速度

1.6 法线向量

1.7 Mesh分辨率

1.8 阴影

2 格斯特纳波(Gerstner)

2.1 来回移动

2.2 法线向量

2.3 防止循环

2.4 相速度

3 波方向

3.1 方向向量

3.2 法线向量

4 多重波

4.1 单参数向量

4.2 两个波

4.3 循环动画

4.4 循环波

4.5 三个波

收起

本文重点:

1、顶点动画

2、创建格斯特纳波浪(Gerstner )

3、控制波浪方向

4、合并多波浪

这是有关流体材质的第三篇教程。前两篇的内容都是如何处理纹理动画,这个章节我们讲如何通过顶点位置动画来产生波浪。

本教程是CatLikeCoding系列的一部分,原文地址见文章底部。“原创”标识意为原创翻译而非原创教程。

教程使用Unity2017.4.4f1创建。

(让我们一起来浪吧)

1 正弦波

设置纹理动画可以创建运动表面的错觉,但网格表面本身保持静止。这对于较小的波纹很好,但不能代表较大的波浪。在大片水域(如大湖海洋)上,风会产生大波浪,并能持续很长时间。为了表示这些风浪,我们将使用正弦波函数制作新的着色器,在垂直方向移动网格顶点。

1.1 调整顶点

创建一个名为Waves的新表面着色器。让片段表面功能保持不变。添加另一个函数vert来调整顶点数据。此函数具有单个顶点参数,用于输入和输出。我们将使用Unity的默认顶点数据结构appdata_full。

若要指示表面着色器应使用vertex函数,请将vertex:vert添加到surface pragma指令。

创建一个使用此着色器的新Waves材质。我给它提供了与其他两种材质相同的albedo和smoothness。

(Wave材质)

因为我们要置换顶点,所以这次不能使用四边形。而是通过GameObject 3D Object Plane创建一个默认平面,并使用Waves材质。这使我们可以使用10×10的四边形网格。

(Waves 平面, wireframe视角下)

1.2 调整Y

忽略Z维度,将每个顶点的位置定义为 P = [x,y],其中P是其最终位置,x是原始X坐标,而y是原始Y坐标,两者 都是在对象空间中。要创建波,我们必须调整P 的Y分量。生成波的最简单方法是使用基于x 的正弦波,因此 y = sinx。那么最后,该点是P = [x,sinx]。

(单个波)

结果是沿X方向的正弦波,沿Z方向恒定。平面的四边形具有单位大小,因此整个平面覆盖以其本地原点为中心的10×10区域。因此,我们最终看到正弦波的10/2π≈1.59周期。

1.3 振幅

正弦波的默认振幅为1,但我们不能局限于此。向着色器添加一个属性,以便我们可以使用 Py = asinx代替,其中a是振幅。

(振幅设置为2)

1.4 波长

这个例子中是sinx,正弦波的总长度为 2 π ≈ 6.28 2π≈6.28。这是波长,我们也可以对其进行配置。

为了轻松控制波长,我们首先用2π乘以X然后除以所需的波长。所以我们最后得到 ( 2 π X /λ ) sin(2πx/λ),其中 λ (λ)是波长。

2π除以λ被称为波数k =2π/λ。我们可以将其用作shader属性,因此不需要在shader中执行除法。这是一个有用的优化,但是在本教程中,我们将坚持使用对开发者更加友好的波长。

(λ (从0到10线性)和 k)

在着色器中,我们将显式使用波数,因此最终得到 Py = asin(kx)。

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值