《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.5 通过修改UV值来滑动纹理
开发 修改 通过 Unity 屏幕 滑动 特效 2.5
2023-09-11 14:16:11 时间
本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈(原书第2版)》一书中的第2章,第2.5节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问云栖社区“华章计算机”公众号查看
2.5 通过修改UV值来滑动纹理
![7c9cc205a98ec1905b2f6e4d88428faf6ec8c025](https://yqfile.alicdn.com/7c9cc205a98ec1905b2f6e4d88428faf6ec8c025.png)
修改CGPROGRAM部分的Cg属性,创建一些新变量来访问新添加的属性:
![7b3769615ea06ad7184260fb0cf469cfac19b387](https://yqfile.alicdn.com/7b3769615ea06ad7184260fb0cf469cfac19b387.png)
修改表面函数来修改提供给tex2D()函数的UV值。然后使用内建的_Time变量来在按下Play按钮的时候动态变更UV值:
![fbf797f6c423395c7680764d85cedd5097a6cd6f](https://yqfile.alicdn.com/fbf797f6c423395c7680764d85cedd5097a6cd6f.png)
![98803771758bccbbe5149a3bcb7bbe7d4bac56cf](https://yqfile.alicdn.com/98803771758bccbbe5149a3bcb7bbe7d4bac56cf.png)
2.5.3 工作原理
![9feb467f7793add8d9824300c8570db5ce739843](https://yqfile.alicdn.com/9feb467f7793add8d9824300c8570db5ce739843.png)
一旦得到了网格的UV值,我们就可以用滑动速度变量和内建的递归时间变量_Time来对纹理进行偏移了。这个内建的时间变量返回一个float4类型的变量,意味着该变量的每一个组件包含一个不同的时间值作为系统的游戏时间。
关于这个递归时间的完整描述可以查看下面这个链接:
![9feb467f7793add8d9824300c8570db5ce739843](https://yqfile.alicdn.com/9feb467f7793add8d9824300c8570db5ce739843.png)
这个_Time变量会随着游戏时间的推移给我们提供一个递增的浮点数值,所以可以使用这个值来移动我们的UV值,具体的移动量是时间和滑动速度的乘积:
![2ef803d49e6505122f3b239a0a4b7e097c07a0b0](https://yqfile.alicdn.com/2ef803d49e6505122f3b239a0a4b7e097c07a0b0.png)
正确地计算了不同时刻的偏移之后,我们可以将新计算出来的偏移量添加到原始的UV位置。这就是为什么在下一行代码中使用了+=运算符,因为我们想以原始的UV位置作为基础来添加一些偏移量,然后将添加了偏移量的UV值传递给tex2D()函数作为纹理的新UV值。通过这些代码就可以让纹理在表面移动了。我们其实完全是在人为操作这些UV值,所以实际上是通过操作UV值来伪造出一种纹理在移动的假象:
![c2426fe3f8b328068f22a7163a6e953a4d50314b](https://yqfile.alicdn.com/c2426fe3f8b328068f22a7163a6e953a4d50314b.png)
在物体表面滑动纹理是现代游戏行业中一种非常常用的纹理技术。通过滑动纹理可以创建出诸如瀑布、河流、熔岩等诸多生动的特效。这种技术也是制作精灵特效的基础,关于这部分内容会放在本章另外一小节中。首先让我们看一下如何在表面着色器中创建一个简单的滑动特效。
2.5.1 准备工作开始这一节之前,需要创建一个新的着色器文件和材质文件。需要一个干净的着色器来开始我们对滑动特效的学习。
2.5.2 操作步骤首先,需要导入新创建的着色器文件,然后按照下面的步骤输入代码:
着色器需要两个新的属性来控制纹理的滑动速度,因此我们首先给X方向和Y方向各创建一个速度属性。代码如下:![7c9cc205a98ec1905b2f6e4d88428faf6ec8c025](https://yqfile.alicdn.com/7c9cc205a98ec1905b2f6e4d88428faf6ec8c025.png)
修改CGPROGRAM部分的Cg属性,创建一些新变量来访问新添加的属性:
![7b3769615ea06ad7184260fb0cf469cfac19b387](https://yqfile.alicdn.com/7b3769615ea06ad7184260fb0cf469cfac19b387.png)
修改表面函数来修改提供给tex2D()函数的UV值。然后使用内建的_Time变量来在按下Play按钮的时候动态变更UV值:
![fbf797f6c423395c7680764d85cedd5097a6cd6f](https://yqfile.alicdn.com/fbf797f6c423395c7680764d85cedd5097a6cd6f.png)
下图便是使用滑动UV系统创建的一条简单的河流的样子。你可以从本书附带的代码文件中查看到ScrollingUVs的值。
![98803771758bccbbe5149a3bcb7bbe7d4bac56cf](https://yqfile.alicdn.com/98803771758bccbbe5149a3bcb7bbe7d4bac56cf.png)
2.5.3 工作原理
滑动系统首先声明一些属性,通过这些属性着色器可以增加或者减小特效的滑动速度。在底层,这些浮点数会从材质的Inspector标签页传递到着色器的表面函数。关于着色器属性的更多内容请查阅第1章。
一旦我们得到了这些从材质Inspector标签页中传递过来的浮点值,就可以根据这些值来偏移着色器中的UV值。
开始之前我们首先将UV值保存在另外一个名为scrolledUV的变量中。这个变量必须是float2或者fixed2类型的,因为传给我们的UV值在Input结构中声明为了float2类型:
![9feb467f7793add8d9824300c8570db5ce739843](https://yqfile.alicdn.com/9feb467f7793add8d9824300c8570db5ce739843.png)
一旦得到了网格的UV值,我们就可以用滑动速度变量和内建的递归时间变量_Time来对纹理进行偏移了。这个内建的时间变量返回一个float4类型的变量,意味着该变量的每一个组件包含一个不同的时间值作为系统的游戏时间。
关于这个递归时间的完整描述可以查看下面这个链接:
![9feb467f7793add8d9824300c8570db5ce739843](https://yqfile.alicdn.com/9feb467f7793add8d9824300c8570db5ce739843.png)
这个_Time变量会随着游戏时间的推移给我们提供一个递增的浮点数值,所以可以使用这个值来移动我们的UV值,具体的移动量是时间和滑动速度的乘积:
![2ef803d49e6505122f3b239a0a4b7e097c07a0b0](https://yqfile.alicdn.com/2ef803d49e6505122f3b239a0a4b7e097c07a0b0.png)
正确地计算了不同时刻的偏移之后,我们可以将新计算出来的偏移量添加到原始的UV位置。这就是为什么在下一行代码中使用了+=运算符,因为我们想以原始的UV位置作为基础来添加一些偏移量,然后将添加了偏移量的UV值传递给tex2D()函数作为纹理的新UV值。通过这些代码就可以让纹理在表面移动了。我们其实完全是在人为操作这些UV值,所以实际上是通过操作UV值来伪造出一种纹理在移动的假象:
![c2426fe3f8b328068f22a7163a6e953a4d50314b](https://yqfile.alicdn.com/c2426fe3f8b328068f22a7163a6e953a4d50314b.png)
相关文章
- 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备 亡羊补牢,面试时如果发现回答不好,该怎么办? [UWP]在应用开发中安全使用文件资源 请教:WCF速度似乎比Remoting慢 WinForm的EXE破解(基于IL修改) WebApi实现单个文件的上传下载 Log4Net使用学习笔记 ASP.NET Core2基于RabbitMQ对Web前
- Python gevent开发http服务器与tcp服务器(WSGIServer、StreamServer)
- 嵌入式(驱动开发)(Input子系统)
- Android开发工程师文集-1 小时学会Widget小组件开发
- 【spring-boot-雷神】05、Web开发
- Windows10上搭建Kinect 2 开发环境
- 《PHP和MySQL Web开发从新手到高手(第5版)》一一2.8 修改存储的数据
- 《PHP和MySQL Web开发从新手到高手(第5版)》一2.8 修改存储的数据
- 《Android游戏开发详解》一2.13 调用对象的行为
- 《树莓派开发实战(第2版)》——1.11 修改密码
- 《Unity着色器和屏幕特效开发秘笈》—— 2.2 通过修改UV坐标实现纹理贴图的滚动
- Nowa Flutter开发教程之 03 界面布局
- android开发修改相机扫描二维码框的高宽
- DevEco Studio 如何对代码快速注释(HarmonyOS鸿蒙开发基础知识)
- iOS开发之 动画CoreAnimation
- 为何放弃 C++ 的工作(开发慢,难度高。完全不适应互联网的快速迭代的思想)
- 《Core Data应用开发实践指南》一3.1 修改托管对象模型
- Modbus库开发笔记之三:Modbus TCP Server开发
- 测试驱动开发 Test-driven development
- 【Unity3D日常开发】修改游戏对象的材质颜色
- 测试如何处理好和开发的合作关系
- 【正点原子FPGA连载】第三十九章OV7725摄像头RGB-LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
- 【正点原子MP157连载】第十三章 外部中断实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
- 利用ShardingSphere(sharding-proxy)实现分库分表,通过整合ZooKeeper,进行简单配置文件修改轻松实现跨库跨表相关操作,轻量级零侵入整合项目开发