博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.5 通过修改UV值来滑动纹理...
阅读量:5748 次
发布时间:2019-06-18

本文共 1243 字,大约阅读时间需要 4 分钟。

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

2.5 通过修改UV值来滑动纹理

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

2.5.1 准备工作

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

2.5.2 操作步骤

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

  1. 着色器需要两个新的属性来控制纹理的滑动速度,因此我们首先给X方向和Y方向各创建一个速度属性。代码如下:
    image
  2. 修改CGPROGRAM部分的Cg属性,创建一些新变量来访问新添加的属性:
    image
  3. 修改表面函数来修改提供给tex2D()函数的UV值。然后使用内建的_Time变量来在按下Play按钮的时候动态变更UV值:
    image

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

image

2.5.3 工作原理

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

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

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

image

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

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

image

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

image

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

image

转载地址:http://ykrzx.baihongyu.com/

你可能感兴趣的文章
陌陌和请吃饭之类的应用,你要是能玩转,那就厉害了
查看>>
第一篇。
查看>>
递归的运行机制简单理解
查看>>
oracle表连接
查看>>
汉字转阿斯克马值
查看>>
Java 栈与堆简介
查看>>
c#.net利用RNGCryptoServiceProvider产生任意范围强随机数的办法
查看>>
转换成数值的三种方法
查看>>
【supervisord】部署单进程服务的利器
查看>>
django 不同版本 url 及path区别
查看>>
字节序问题
查看>>
zabbix oracle监控插件orabbix部署安装
查看>>
mysql基础命令
查看>>
IIS网站本机可以访问但局域网其他机器无法访问 解决方法
查看>>
hdu1024 dp+滚动数组
查看>>
python3 通过qq 服务器 发送邮件
查看>>
java 多线程踩过的坑
查看>>
性能优化
查看>>
ggplot2 geom相关设置—点重合处理(jitter)
查看>>
部署Replica Sets及查看相关配置
查看>>