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序列帧动画学习笔记的更多相关文章

  1. unity shader序列帧动画代码,顺便吐槽一下unity shader系统

    一.看到UNITY论坛里有些人求unity shader序列帧动画,写shader我擅长啊,就顺势写了个CG的shader.代码很简单,就是变换UV采样序列帧贴图,美术配置行数列数以及变换速度. Sh ...

  2. Unity Shader 序列帧动画

    shader中的序列帧动画属于纹理动画中的一种,主要原理是将给定的纹理进行等分,再根据时间的变化循环播放等分中的一部分. Unity Shader 内置时间变量 名称 类型 描述 _Time floa ...

  3. Unity Shader入门精要学习笔记 - 第11章 让画面动起来

    转自 冯乐乐的 <Unity Shader入门精要> Unity Shader 中的内置变量 动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化时画面也可以随之变化.Unity ...

  4. Android动画学习笔记-Android Animation

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  5. Unity(IOC)学习笔记

    原文:Unity(IOC)学习笔记 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/79432 ...

  6. Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅

    一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubSha ...

  7. Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础

    摘录自 冯乐乐的<Unity Shader入门精要> 笛卡尔坐标系 1)二维笛卡尔坐标系 在游戏制作中,我们使用的数学绝大部分都是计算位置.距离.角度等变量.而这些计算大部分都是在笛卡尔坐 ...

  8. Unity Shader入门精要学习笔记 - 第14章非真实感渲染

    转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...

  9. Unity Shader入门精要学习笔记 - 第10章 高级纹理

    转载自 冯乐乐的 <Unity Shader入门精要> 立方体纹理 在图形学中,立方体纹理是环境映射的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层 ...

随机推荐

  1. 二叉树中的最大路径和 · Binary Tree Maximum Path Sum

    [抄题]: 给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和) [思维问题]: 不会写分合法 [一句话思路]: 用两次分治:ro ...

  2. 【原创】Junit4详解二:Junit4 Runner以及test case执行顺序和源代码理解

    概要: 前一篇文章我们总体介绍了Junit4的用法以及一些简单的测试.之前我有个疑惑,Junit4怎么把一个test case跑起来的,在test case之前和之后我们能做些什么? Junit4执行 ...

  3. OC 和 swift 冒泡排序

    swift 版 var numbers = [17, 28, 36, 15, 39] print("排序前\(numbers)") for i in 0..<numbers. ...

  4. Loadrunner12.5-同一个网址通过vugen不能打开,但是直接在ie11中就可以打开

    一:录制选项修改成“WinINet级别数据”,重新录制就可以成功打开网页了. 注:运行时设置--首选项--高级--“使用WinINet回放而非套接字(仅限Windows)”需要勾选上:否则录制脚本结束 ...

  5. 在原型设计上,UI和UX设计师有哪三个区别?

    原型设计在日常的软件开发过程中是必不可少的,不管是UI还是UX设计师,很多工作都会涉及到原型设计.那么这两类设计师在设计原型的时候表现出了哪些的不同点呢?今天就让我们来讨论一下,先说说我发现的3个不同 ...

  6. 在cygwin中执行bat文件

    在cygwin中执行bat文件 #!/bin/bash dir_gen_image_bat=C:/MinGW/msys/1.0/home/Administrator/feitian_audio/FOT ...

  7. Sublime Text webstorm等编译器快速编写HTML/CSS代码的技巧

    <!DOCTYPE html> Sublime Text webstorm等编译器快速编写HTML/CSS代码的技巧--summer-rain博客园 xiayuhao 东风夜放花千树. 博 ...

  8. Android系统root破解原理分析

    http://dengzhangtao.iteye.com/blog/1543494 root破解过程的终极目标是替换掉系统中的su程序.但是要想替换掉系统中su程序本身就是需要root权限的,怎样在 ...

  9. KBMMW 4.6 正式版发布

    喜大普奔迎新年! Merry Christmas! We are happy to announce the release of kbmMW v. 4.60.00 Professional and ...

  10. 2018.09.08 poj1185 炮兵阵地(状压dp)

    传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: ...