天天看点

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.5 通过修改UV值来滑动纹理

本节书摘来自华章计算机《unity着色器和屏幕特效开发秘笈(原书第2版)》一书中的第2章,第2.5节,作者 [英]艾伦朱科尼(alan zucconi)[美]肯尼斯拉默斯(kenneth lammers),译 占红来,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

在物体表面滑动纹理是现代游戏行业中一种非常常用的纹理技术。通过滑动纹理可以创建出诸如瀑布、河流、熔岩等诸多生动的特效。这种技术也是制作精灵特效的基础,关于这部分内容会放在本章另外一小节中。首先让我们看一下如何在表面着色器中创建一个简单的滑动特效。

开始这一节之前,需要创建一个新的着色器文件和材质文件。需要一个干净的着色器来开始我们对滑动特效的学习。

首先,需要导入新创建的着色器文件,然后按照下面的步骤输入代码:

着色器需要两个新的属性来控制纹理的滑动速度,因此我们首先给x方向和y方向各创建一个速度属性。代码如下:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.5 通过修改UV值来滑动纹理

修改cgprogram部分的cg属性,创建一些新变量来访问新添加的属性:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.5 通过修改UV值来滑动纹理

修改表面函数来修改提供给tex2d()函数的uv值。然后使用内建的_time变量来在按下play按钮的时候动态变更uv值:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.5 通过修改UV值来滑动纹理

下图便是使用滑动uv系统创建的一条简单的河流的样子。你可以从本书附带的代码文件中查看到scrollinguvs的值。

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.5 通过修改UV值来滑动纹理

滑动系统首先声明一些属性,通过这些属性着色器可以增加或者减小特效的滑动速度。在底层,这些浮点数会从材质的inspector标签页传递到着色器的表面函数。关于着色器属性的更多内容请查阅第1章。

一旦我们得到了这些从材质inspector标签页中传递过来的浮点值,就可以根据这些值来偏移着色器中的uv值。

开始之前我们首先将uv值保存在另外一个名为scrolleduv的变量中。这个变量必须是float2或者fixed2类型的,因为传给我们的uv值在input结构中声明为了float2类型:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.5 通过修改UV值来滑动纹理

一旦得到了网格的uv值,我们就可以用滑动速度变量和内建的递归时间变量_time来对纹理进行偏移了。这个内建的时间变量返回一个float4类型的变量,意味着该变量的每一个组件包含一个不同的时间值作为系统的游戏时间。

关于这个递归时间的完整描述可以查看下面这个链接:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.5 通过修改UV值来滑动纹理

这个_time变量会随着游戏时间的推移给我们提供一个递增的浮点数值,所以可以使用这个值来移动我们的uv值,具体的移动量是时间和滑动速度的乘积:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.5 通过修改UV值来滑动纹理

正确地计算了不同时刻的偏移之后,我们可以将新计算出来的偏移量添加到原始的uv位置。这就是为什么在下一行代码中使用了+=运算符,因为我们想以原始的uv位置作为基础来添加一些偏移量,然后将添加了偏移量的uv值传递给tex2d()函数作为纹理的新uv值。通过这些代码就可以让纹理在表面移动了。我们其实完全是在人为操作这些uv值,所以实际上是通过操作uv值来伪造出一种纹理在移动的假象:

《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.5 通过修改UV值来滑动纹理

继续阅读