目录 |
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)。