Unity Shader序列帧动画学习笔记
Unity Shader序列帧动画学习笔记
关于无限播放序列帧动画的一点问题
在学shader的序列帧动画时,书上写了这样一段代码:
fixed4 frag(v2f i){
// 获得整数时间
float time = floor(_Time.y * _Speed) % 64;
// 根据时间计算当前行数和列数
float row = floor(time/_HorizontalAmount);
// 对uv坐标进行偏移
half2 uv = float2(i.uv.x/_HorizontalAmount,i.uv.y/_VerticallAmount);
uv.x += column / _HorizontalAmount;
uv.y -= row / _VerticallAmount;
fixed4 c = tex2D(_MainTex,uv);
c.rgb *= _Color; float column = time - row * _HorizontalAmount;
return c;
}
就是依据时间变量_Time来获得当前要播放的序列帧动画在整个Texture里是第几行第几列,然后在后面根据列数行数绘制当前序列帧动画,在上面的代码中,用time/_HorizontalAmount来获得当前行数,用time % _HorizontalAmount来获得当前列数,其中_HorizontalAmount表示在Texture中一行中有多少个序列帧动画。
一开始我看到上面的代码的时候是蒙蔽的!_Time.y表示从游戏开始到现在经过的时间,而行数和列数跟time变量是成正比例的,我就想。
难道row和column变量不会迅速膨胀吗??!
但是,使用上述代码表现出来的shader是不断的重复播放该动画,这是为什么呢?
Answer
首先给出肯定,row和column是肯定会随着time的变大而不停的变大的,那么为什么表现出来的效果不是动画播放一次之后就结束呢?(因为当row和column变大后,后面根据行数和列数绘制序列帧的代码就会失效,因为row和column已经超过了整个Texture最大的行数和列数了)
答案是
Texture(贴图)的Wrap Mode属性被设置为了Repeat!
当行数和列数急剧增加的时候,在后面的代码中计算他们的偏移也会急速的增长,见下面的代码:
// 对uv坐标进行偏移
half2 uv = float2(i.uv.x/_HorizontalAmount,i.uv.y/_VerticallAmount);
uv.x += column / _HorizontalAmount;
uv.y -= row / _VerticallAmount;
其中column/_HorizontalAmount和row/_VerticalAmount会不停的变大,当前uv的偏移坐标大于(1,1)的时候,Repeat属性就起到了作用!Repeat属性规定当uv坐标超过(1,1)时,就会不停的重复本身的图形。

所以上述代码才会不停的进行播放动画。
但是,个人认为直接这样写还是不妥,实际测试中,当speed超过10^6,图像就会变得失真,变成一团马赛克,如下图所示。

所以,最好的方法是,将题目中的row和column限制在一定范围,下面是我改动的代码。
// 获得整数时间
float time = floor(_Time.y * _Speed) % (_HorizontalAmount*_VerticallAmount);
// 根据时间计算当前行数和列数
float row = floor(time/_HorizontalAmount);
float column = time - row * _HorizontalAmount;
Unity Shader序列帧动画学习笔记的更多相关文章
- unity shader序列帧动画代码,顺便吐槽一下unity shader系统
一.看到UNITY论坛里有些人求unity shader序列帧动画,写shader我擅长啊,就顺势写了个CG的shader.代码很简单,就是变换UV采样序列帧贴图,美术配置行数列数以及变换速度. Sh ...
- Unity Shader 序列帧动画
shader中的序列帧动画属于纹理动画中的一种,主要原理是将给定的纹理进行等分,再根据时间的变化循环播放等分中的一部分. Unity Shader 内置时间变量 名称 类型 描述 _Time floa ...
- Unity Shader入门精要学习笔记 - 第11章 让画面动起来
转自 冯乐乐的 <Unity Shader入门精要> Unity Shader 中的内置变量 动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化时画面也可以随之变化.Unity ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Unity(IOC)学习笔记
原文:Unity(IOC)学习笔记 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/79432 ...
- Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅
一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubSha ...
- Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础
摘录自 冯乐乐的<Unity Shader入门精要> 笛卡尔坐标系 1)二维笛卡尔坐标系 在游戏制作中,我们使用的数学绝大部分都是计算位置.距离.角度等变量.而这些计算大部分都是在笛卡尔坐 ...
- Unity Shader入门精要学习笔记 - 第14章非真实感渲染
转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...
- Unity Shader入门精要学习笔记 - 第10章 高级纹理
转载自 冯乐乐的 <Unity Shader入门精要> 立方体纹理 在图形学中,立方体纹理是环境映射的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层 ...
随机推荐
- cin中函数的作用
cin是istream类的对象,它是从标准输入设备(键盘)获取数据,程序中的变量通过流提取符">>"从流中提取数据.流提取符">>"从流 ...
- UVa 11988 Broken Keyboard (a.k.a. Beiju Text)(链表)
You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem wi ...
- sqlserver2008debug存储过程
新建一个查询窗口,exec proc_name params…… 然后启动调试 右侧可以选择“逐过程”“逐语句”“跳出”,下方展示变量的值 参考文章:https://www.cnblogs.com/s ...
- Centos7下安装apache2.4 php5.6 pdo_oci oci8
一.下载必须的安装源码包 http://httpd.apache.org/download.cgi#apache24 httpd-2.4.23.tar.gz http://apr.apache.org ...
- apache配置防盗链
1.确保apache已开启rewrite. 2.在.htaccess文件中添加如下: RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://X ...
- win 下 apache 虚拟主机配置方式
虚拟主机的配置在apache安装目录下/conf/extra/httpd-vhosts.conf文件中,需要在/conf/httpd.conf中开启. LoadModule vhost_alias_m ...
- 让php支持多线程,win下安装pthreads
1.检查PHP版本是否支持线程安全 在phpinfo()的显示页中,搜索Thread Safety,如果是enabled,则PHP版本是线程安全的. 2.在http://windows.php.net ...
- Nginx+Keepalived实现站点高可用[z]
http://segmentfault.com/a/1190000002881132
- PAT 1084 外观数列(20)(代码+思路+推荐测试用例)
1084 外观数列(20 分) 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d 开始,序列的第 ...
- Codeforces 611C. New Year and Domino 动态规划
C. New Year and Domino time limit per test 3 seconds memory limit per test 256 megabytes input stand ...