Unity 水、流体、波纹基础系列(一)——纹理变形(Texture Distortion )

这篇教程介绍了如何在Unity中通过纹理变形模拟流体表面,如水波纹,使用纹理坐标动画和流体向量实现流动效果。通过创建一个标准表面着色器,利用流体向量和时间调整UV坐标,实现流体的循环动画。文章还探讨了如何控制流体速度、方向、强度和循环周期,以及如何利用导数贴图和法线贴图提升水纹的真实感。最后,展示了不同纹理在流动动画下的效果。
摘要由CSDN通过智能技术生成

目录

1 UV动画

1.1 滑动表面着色器

1.2 让UV流动

1.3 流动方向

1.4 定向滑动

2 无缝循环

2.1 混合权重

2.2 跷跷板

2.3 时间偏移

2.4 结合两个不同的扭曲

2.5 UV跳跃

2.6 分析跳跃

3 动画调整

3.1 平铺

3.2 动画速度

3.3 流动强度

3.4 流偏移

4 纹理化

4.1 抽象水纹

4.2 法线贴图

4.3 导数贴图

4.4 高度缩放

4.5 流量速度+

收起

本文重点:

用一张流图纹理来调整UV坐标

创建一个无缝的动画循环

控制流体产生

使用导数纹理展示凹凸

1 UV动画

如果液体不动时,在视觉上是无法与固体区分开的。你看的到底是水,果冻还是玻璃杯呢?水池是结冰的吗?但可以肯定的是,如果干扰它并观察它是否会变形,以及变形多少就可以区分。仅从创建上看起来像流体的材质是远远不够的,实际上它必须要能动起来。否则,它就是看起来像是水的玻璃雕塑或已经结冰的水。当然,这对于一张照片来说已经足够了,但对于电影或游戏来说远远足够。

在大多数情况下,我们只希望表面由水,泥,熔岩或某种看起来像液体的神奇效果制成。它不需要是交互式的,只是在随意观察时看起来很像。因此,我们不需要进行复杂的水物理模拟。需要做的只是在常规材质中添加一些动画。这可以通过对用于纹理化的UV坐标进行动画处理来完成。

Valve的Alex Vlachos首先在SIGGRAPH2010演示文稿《 Portal 2中的水流》中公开详细描述了本教程中使用的技术。

1.1 滑动表面着色器

对于本教程而言,你可以重新建一个新项目,设置为使用线性色彩空间渲染。如果你使用的是Unity 2018,请选择默认的3D管道,而不是轻量级或HD。然后创建一个新的标准表面着色器。我们要通过扭曲纹理贴图来模拟流体的表面,因此将其命名为DistortionFlow。下面是新的着色器,其中删除了所有注释和不需要的部分。

为了易于查看UV坐标如何变形,可以使用如下测试纹理。

(UV测试纹理)

创建我们的着色器的材质,并将测试纹理作为其albedo贴图。将其tiling设置为4,以便我们可以看到纹理是如何重复的。然后使用此材质将四边形添加到场景中。为了获得最佳观看效果,请将其绕其X轴旋转90°,以使其在XZ平面中平放。这样可以轻松地从任何角度查看它。

(Distortion Flow材质在四边形上)

1.2 让UV流动

流体UV坐标的代码是通用的,因此我们将其放在单独的Flow.cginc包含文件中。它需要包含的只是一个具有UV和时间参数的FlowUV函数。它应该返回新的流体UV坐标。我们从最简单的位移开始,这只是将时间添加到两个坐标。

将此文件包含在我们的着色器中,并使用主要的纹理坐标和当前时间调用FlowUV,Unity通过_Time.y使其可用。然后使用新的UV坐标来采样我们的纹理。

(对角线滑动的UV)

当我们将两个坐标增加相同的数量时,纹理将沿对角线滑动。加上了时间之后,所以它从右上方滑动到左下方。并且由于我们为纹理使用默认的环绕模式,因此动画每秒循环一次。

仅当时间值增加时,动画才可见。当编辑器处于播放模式时就是这种情况,但是你也可以通过“场景”窗口工具栏启用“Animated Materials”来在编辑模式下启用时间进度。

(启用Animated Materials)

实际上,每次编辑者重新绘制场景时,素材使用的时间值都会增加。因此,当禁用“Animated Materials”时,每次你编辑某些内容时,纹理滑动都会有产生一点点。动画材质只会强制编辑器始终重绘场景。因此,仅在需要时才打开它吧。

1.3 流动方向

你可以使用速度矢量来控制流动的方向和速度,而不必总是沿相同的方向流动。因此可以将此矢量作为属性添加到材质。但是,我们仍然仅限于对整个材质使用相同的矢量,但这看起来像是的硬的物体表面在滑动。为了使某种东西看起来像流动的液体,除了一般移动之外,它还必须随时间局部变化。

通过添加另一个速度矢量来消除静态外观,使用该速度矢量第二次对纹理进行采样,然后将两个采样组合在一起。当使用两个略有不同的矢量时,我们最终得到一个变形纹理。但是,我们仍然仅限于以相同方式流动整个表面。对于开阔水域或直流而言,这通常就足够了,但在更复杂的情况下则不足。

为了支持更多有趣的流体效果,我们必须以某种方式改变整个材质表面的流体向量。最简单的方法是通过Flow 贴图。这是包含2D向量的纹理。这是一种纹理,在R通道中具有向量的U分量,在G通道中具有向量的V分量。它不需要很大,因为我们并不需要展示急剧的突然变化,依靠双线性滤波来来保持平滑。

(Flow 贴图)

该纹理是使用卷曲噪声创建的,在“噪波导数”教程(尚未翻译)中对此进行了说明,但是创建纹理的细节并不重要。它包含多个顺时针和逆时针旋转流,没有任何源或汇。确保将其导入为不是sRGB的常规2D纹理,因为它不包含颜色数据。

将流体 贴图的属性添加到我们的材质中。它不需要单独的UV平铺和偏移,因此为其指定NoScaleOffset属性。默认值为没有flow,默认对应于黑色纹理。

(带有流体 贴图的材质)

为流体贴图添加一个变量,并对其进行采样以获得流向量。然后通过将其用作于albedo进行临时可视化。

(平铺流体向量)

纹理是线性数据,因此在场景中显得更亮。很好,因为无论如何我们都不应该将其用作颜色。由于表面着色器的主要UV坐标使用了主要纹理的平铺和偏移,因此我们的流图也会平铺。我们不需要映射流体贴图,因此将材质的Tileing设置回1。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值