效果:

序列帧图片网上随便找的,质量不是很好,重点不是它,不要在意。

思路:
1.之前都是在一张面片上直接映射一张纹理,IN.uv的范围是0~1
现在要映射一张纹理上的一小块区域,就要用这块区域的uv去采样后映射到面片。
所以:x方向,IN.uv.x/列数,范围变化到0~(1/列数)
同理:y方向,IN.uv.y/行数,范围变化到0~(1/行数)

2.根据时间驱动,加上当前sprite的偏移量
uv.x = cellX + SpriteColumnIndex*1.0 / _Column;
uv.y = cellY + SpriteRowIndx*1.0 / _Row;

3.用变换后的uv去采样图片
half4 c = tex2D(_MainTex,uv);

代码有注释:

  1. Shader "Custom/SpriteAnimation"
  2. {
  3. Properties
  4. {
  5. _MainTex("main tex" ,2D) = ""{}
  6. _Row("行",Int) =
  7. _Column("列",Int) =
  8. _Speed("speed",Range(,)) =
  9. }
  10.  
  11. SubShader
  12. {
  13. Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" }
  14.  
  15. Pass
  16. {
  17. Blend One OneMinusSrcAlpha
  18. CGPROGRAM
  19. #pragma vertex vert
  20. #pragma fragment frag
  21. #include "UnityCG.cginc"
  22.  
  23. struct v2f
  24. {
  25. float4 pos:POSITION;
  26. float2 uv:TEXCOORD0;
  27. };
  28.  
  29. sampler2D _MainTex;
  30. float4 _MainTex_ST;
  31.  
  32. int _Row;
  33. int _Column;
  34. float _Speed;
  35.  
  36. v2f vert(appdata_base v)
  37. {
  38. v2f o;
  39. o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
  40. o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
  41. return o;
  42. }
  43.  
  44. half4 frag(v2f IN) :COLOR
  45. {
  46. float2 uv = IN.uv;
  47.  
  48. float cellX = uv.x / _Column;
  49. float cellY = uv.y / _Row;
  50.  
  51. //Sprite总数
  52. int count = _Row * _Column;
  53.  
  54. //在0到count-1 范围内循环
  55. int SpriteIndex = fmod(_Time.w*_Speed,count);
  56.  
  57. //当前Sprite所在行的下标
  58. int SpriteRowIndx = (SpriteIndex / _Column);
  59.  
  60. //当前Sprite所在列的下标
  61. int SpriteColumnIndex = fmod(SpriteIndex,_Column);
  62.  
  63. //因uv坐标左下角为(0,0),第一行为最底下一行,为了合乎我们常理,我们转换到最上面一行为第一行,eg:0,1,2-->2,1,0
  64. SpriteRowIndx = (_Row - ) - fmod(SpriteRowIndx,_Row);
  65.  
  66. //乘以1.0转为浮点数,不然加号右边,整数除以整数,还是整数(有误)
  67. uv.x = cellX + SpriteColumnIndex*1.0 / _Column;
  68. uv.y = cellY + SpriteRowIndx*1.0 / _Row;
  69.  
  70. half4 c = tex2D(_MainTex,uv);
  71. return c;
  72. }
  73. ENDCG
  74. }
  75. }
  76. FallBack "Diffuse"
  77. }

Shader实例:序列帧动画的更多相关文章

  1. Unity Shader播放序列帧动画

    Shader "LordShader/AnimateSprite" { Properties { _MainTint (,,,) //颜色属性,可以在u3d inspector面板 ...

  2. Unity Shader序列帧动画学习笔记

    Unity Shader序列帧动画学习笔记 关于无限播放序列帧动画的一点问题 在学shader的序列帧动画时,书上写了这样一段代码: fixed4 frag(v2f i){ // 获得整数时间 flo ...

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

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

  4. Unity Shader 序列帧动画

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

  5. cocos2d-x 2.0 序列帧动画 深入分析

    转自:http://blog.csdn.net/honghaier/article/details/8222401 序列帧动画主要有几个类: CCSpriteFrame:精灵帧信息,序列帧动画是依靠多 ...

  6. [Cocos2d-x v3.x]序列帧动画

      简单介绍 Cocos2d-x中.动画的详细内容是依靠精灵显示出来的,为了显示动态图片,我们须要不停切换精灵显示的内容.通过把静态的精灵变为动画播放器从而实现动画效果. 动画由帧组成,每一帧都是一个 ...

  7. iOS开发基础-序列帧动画之Tom猫

    新建一个Single View Application,向该工程中导入Tom猫的图片资源,本示例演示Tom猫喝牛奶的动作.图片的名字为 drink_00.jpg.drink_01.jpg.....dr ...

  8. UnityShader 序列帧动画效果

    实现原理:主要思想是设置显示uv纹理的大小,并逐帧修改图片的uv坐标. 实现步骤 1.我们首先用_Time.y和速度属性_Speed相乘得到模拟的时间. 2.然后我们用time除以_Horizonta ...

  9. Unity Shader 之 uv动画

    Unity 动画 Unity Shader 内置时间变量 引入时间变量 名称 类型 描述 _Time float4 t是自该场景加载开始所经过的时间,4个分量分别是(t/20, t, 2t, 3t) ...

随机推荐

  1. php关于ob_start('ob_gzhandler')启用GZIP压缩的bug

    如果使用ob_start("ob_gzhandler"); 则ob_clean()后面的输出将不显示,这是个bug,可以用ob_end_clean();ob_start(" ...

  2. appium for iOS config

    appium-doctor: Running iOS Checks ✔ Xcode is installed at /Applications/Xcode.app/Contents/Developer ...

  3. 解决自定义Shiro.Realm扩展类不能用注解(@Resource或@Autowire)自动装配的问题

    问题产生原因:加载Realm时其他Spring配置文件(xml)尚未加载,导致注入失败. 解决方法:编写一个设置类把注入工作提前完成. package com.xkt.shiro import org ...

  4. POJ 2352 Stars 线段树

    题目链接 题意:在一个二维平面上有n个星星,每个星星的等级为x,x为该星星左方和下方所包含的星星的数量(包含正左和正下的),输出每个等级各有多少星星,星星坐标按照y序递增给出,y值相同按照x递增给出. ...

  5. javaSE基础06

    javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...

  6. Android-LinearLayout(线性布局)

    布局:Android为我们提供了一个View和ViewGroup子类的集合.ViewGroup类是View的子类,也被称为Layout布局,它提供了流式布局.线性布局等多种布局方式.View是绘制在屏 ...

  7. PHPCMS v9 安全防范教程

    一.目录权限设置很重要:可以有效防范黑客上传木马文件.如果通过 chmod 644 * -R 的话,php文件就没有权限访问了.如果通过chmod 755 * -R 的话,php文件的权限就高了. 所 ...

  8. java中的集合/容器的数据结构

    最近双11在网上买了本 数据结构和算法--java语言实现,正在啃,同时在慕课网上的学习进度来到了集合框架这一类,对于这一块算是刚刚了解,本科的时候数据结构学习的是严蔚敏老师的那本数据结构,代码的实现 ...

  9. 查看openssl的版本

    [root@ha01 tengine]# openssl version -a OpenSSL Feb built on: Thu Jul :: UTC platform: linux-x86_64 ...

  10. git push 报错!!!!

    [root@NB sh]# git push To git@x0.xx.xxx.x1:yanjing_chenl/IT-DOC.git ! [rejected] master -> master ...