本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈》一 书中的第2章,第2.2节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.2 通过修改UV坐标实现纹理贴图的滚动
在当今的游戏行业中,最常见的一种纹理技术就是在物体的表面实现滚动纹理。使用这种技术我们可以实现如瀑布、河流、熔岩流等效果。它也是我们创建纹理动画的一种基础技术,在后面的章节中我们将对它进行详细介绍。让我们先来看看如何在一个表面着色器创建一个简单的滚动效果。
2.2.1 准备工作
在开始本节的学习之前,你需要创建一个新的着色器文件和一个新的材质。这样,我们就创建了一个简洁漂亮的着色器,我们可以使用它来研究滚动效果。
2.2.2 如何操作
首先,打开我们刚才创建的着色器文件,然后输入下面提到的代码:
- 该着色器需要两个新的属性,我们可以用来控制纹理滚动的速度。因此,我们将添加X方向的速度属性和Y方向的速度属性,如下代码所示:
- 修改surf()函数,通过tex2D()函数来改变UV坐标。然后使用内置的_Time变量来实现动态纹理,当我们点击Unity播放按钮时纹理会随时间运动起来。
下图展示了使用滚动UV系统为你的环境创建一个简单河流运动的效果图。在纸质的书本上是很难展示运动效果的,但是请相信它是可以运动的。
2.2.3 实现原理
这套纹理滚动系统首先需要声明两个属性,使着色器的使用者能够提高或降低纹理的滚动速度。它的作用在于我们可以从材质Inspector面板中获取浮点值,然后传递给着色器里的surf函数。有关着色器属性的详细信息,请查阅第1章。
一旦我们从材质Inspector面板中获取了浮点值,我们就可以使用它们实现着色器的UV偏移了。
在程序的开始,我们首先将UV值存储在scrolledUV变量中。这个变量必须是一个float2或fixed2类型的变量,因为UV值是通过Input结构体传入的:
这样,当访问网格的UV时,我们就可以使用滚动速度变量和内置的_Time变量对纹理进行偏移。该内置变量返回的是float4类型的值,这意味着当我们进入游戏时,变量的每个组成部分都包含不同的时间值。
_Time变量为我们提供一个基于Unity游戏时钟的递增型浮点值。因此,我们可以使用该时间值在UV方向上移动我们的UV值,也可以通过滚动速度变量来加快或减慢时间。
使用时间计算出正确的偏移量后,我们就可以添加新的偏移值到原有UV值上。这也是我们在下一行使用+=运算符的原因。我们要把原来的UV值,加上新的偏移量,然后传递给tex2D()函数作为新的UV纹理。这样我们就创建了一个物体表面的纹理运动效果。由于我们只对UV坐标进行修改,所以这些是模拟的纹理运动效果。