1.前面的心情

上班看shader我也是醉了。写完这篇看代码去了,不过看着看着恐怕就会困....

还有就是上天,我该怎么做,下一步,大懒;

2.参考源头

http://blog.csdn.net/candycat1992/article/details/18662601

http://www.cppblog.com/lai3d/archive/2008/10/23/64889.html

群里问大神

3.实现效果和代码

实现效果:猴子的animation动画;16张小图顺序变化;但由于此图并未对齐,结果不理想,没有人行走的那张效果好

                 

代码:两部分,1.cs部分,实现时间time,获取每张小图的x、y的index下标,并传入shader值,   2.shader中根据index下标,偏移值,来计算一种映射关系,使(0,0)-(1,1,)映射到每个小块上;

(1).cs部分:

  1. public class AnimationTest : MonoBehaviour {
  2.  
  3. public float speed = 5.0f;
  4. public int _CellAmountX = 8;
  5.  
  6. float timeValue = 0.0f;
  7. float timeOffsetY = 0.0f;
  8.  
  9. private bool bIsUp_Bottom = true;
  10. void Start ()
  11. {
  12. transform.renderer.material.SetFloat("_CellAmountX", _CellAmountX);
  13. }
  14.  
  15. // Update is called once per frame
  16. void FixedUpdate ()
  17. {
  18. timeValue = Mathf.Ceil(Time.time * speed % _CellAmountX);
  19.  
  20. Debug.Log("timeValue:" + timeValue);//上log图,显示x的index
  21.  
  22. if (timeValue==_CellAmountX)
  23. {
  24. if (bIsUp_Bottom)
  25. {
  26. timeOffsetY = Mathf.Abs(timeOffsetY - 1.0f);//当达到x最右侧,进行上下Y的index切换
  27. }
  28. bIsUp_Bottom = false;
  29. }
  30. else
  31. {
  32. bIsUp_Bottom = true;
  33. }
  34.  
  35. transform.renderer.material.SetFloat("_TimeValue", timeValue);
  36. transform.renderer.material.SetFloat("_TimeOffsetY", timeOffsetY);
  37. }
  38. }

  (2).shader部分,进行纹理坐标的映射关系;

  1. Shader "Custom/AnimateSprites" {
  2. Properties {
  3. _MainTex ("Base (RGB)", 2D) = "white" {}
  4.  
  5. // Create the properties below
  6. _CellAmountX ("Cell Amount", float) = 8
  7. _TimeValue ("Time Value", float) = 0.0
  8. _TimeOffsetY("_TimeOffsetY",float ) = 0.0
  9. }
  10. SubShader {
  11. Tags { "RenderType"="Opaque" }
  12. LOD 200
  13.  
  14. CGPROGRAM
  15. #pragma surface surf Lambert
  16.  
  17. sampler2D _MainTex;
  18.  
  19. //Create the connection to the properties inside of the
  20. //CG program
  21. float _CellAmountX;
  22. float _TimeValue;
  23. float _TimeOffsetY;
  24.  
  25. struct Input {
  26. float2 uv_MainTex;
  27. };
  28.  
  29. void surf (Input IN, inout SurfaceOutput o) {
  30. //Lets store our UVs in a seperate variable
  31. float2 spriteUV = IN.uv_MainTex;
  32.  
  33. //Lets calculate the width of a singe cell in our
  34. //sprite sheet and get a uv percentage that each cel takes up.
  35. float cellUVPercentage = 1.0/_CellAmountX;
  36.  
  37. //Animate the uv's forward by the width precentage of
  38. //each cell
  39. float xValue = spriteUV.x;
  40. xValue += _TimeValue;
  41. xValue *= cellUVPercentage;
  42.  
  43. float cellUVPercentage_Y = 1.0/2.0f;
  44. float yValue = spriteUV.y;
  45. yValue += _TimeOffsetY;
  46. yValue*=cellUVPercentage_Y;
  47.  
  48. spriteUV = float2(xValue, yValue);
  49.  
  50. half4 c = tex2D (_MainTex, spriteUV);
  51. o.Albedo = c.rgb;
  52. o.Alpha = c.a;
  53. }
  54. ENDCG
  55. }
  56. FallBack "Diffuse"
  57. }

  

4.学到什么:

(1). shader内置函数

float timeVal = fmod(_Time.y * _Speed, _CellAmount);

fmod : 带小数的余数

fmod  fmod(x, y)Returns the floating point remainder of x/y.   remainder余数

ceil(x)  Returns the smallest integer which is greater than or equal to x.

其实从字面意思也好理解:  ceil天花板   floor地板

(2)、纹理映射关系;

首先:考虑书中第一个图例子,小人的走动:9个小人,纹理0-1根据时间映射到(0-1/9);(1/9-2/9);............(8/9,1);

(0+index)/9---->   index分别为0,1,2到9,到9的话,其实是(0-1/9);而从前面log图看出,当index为0是非常少的次数,这是因为ceil的原因导致的;也就是说,其实第一张图片的显示时间要多几帧。

     (1+index)/9---->

其次:猴子那张图

x还是那个x;y和x类似,判断的时候,在cs文件里,进行y的一个跳变;

(3)cs和shader的数据关联

transform.renderer.material.SetFloat("_CellAmount", cellAmount);

(4)心得;

昨天在shader群里被蓝色大神教会一番:

把内置函数都看看;

主要是第一个教诲,路好长好远;

u3d_Shader_effects笔记6 第二章 animating sprite的更多相关文章

  1. u3d_Shader_effects笔记5 第二章 通过UV,进行纹理移动

    1.前面心情 公司最近打包,像我等小弟闲着,看代码容易困,没事偷着学shader,不过还是要多交流才行. 2.本文参考 这次参考比较多:由texture uv延伸问题多,主要是不明白变量定义: htt ...

  2. Stealth视频教程学习笔记(第二章)

    Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  3. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数 学习目标: 理解矩阵和与它相关的运算: 理解矩阵的乘 ...

  4. Java编程思想_笔记_第二章_一切都是对象

    第二章对于知识只是点到,会在以后章节会详细展开. 笔记的侧重会偏向记录自己知识模糊的地方.比如 xxx 很重要很难很实用,但是已经熟练使用就没有记录,而 “使用对象.成员名称来使用成员变量”,较简单而 ...

  5. 【vue.js权威指南】读书笔记(第二章)

    [第2章:数据绑定] 何为数据绑定?答曰:数据绑定就是将数据和视图相关联,当数据发生变化的时候,可以自动的来更新视图. 数据绑定的语法主要分为以下几个部分: 文本插值:文本插值可以说是最基本的形式了. ...

  6. Javascript高级程序设计读书笔记(第二章)

    第二章  在HTML中使用Javascript 2.1<script>元素 延迟脚本(defer = "defer")表明脚本在执行时不会影响页面的构造,脚本会被延迟到 ...

  7. win32多线程程序设计笔记(第二章)

    第二章线程的第一次接触,主要讲了如何创建线程以及需要注意的几点. 一.创建线程 与调用函数的过程类似;线程只不过用CreateThread的API将函数封装起来,并产生一个与主程序同时执行的程序来调用 ...

  8. 流畅的python学习笔记:第二章

    第二章开始介绍了列表这种数据结构,这个在python是经常用到的结构 列表的推导,将一个字符串编程一个列表,有下面的2种方法.其中第二种方法更简洁.可读性也比第一种要好 str='abc' strin ...

  9. java并发编程实战笔记---(第二章)线程安全:正确性

    ThreadA__________     同步 ______________ 异步 ___________     异步 ThreadB__________         ____________ ...

随机推荐

  1. 解决使用Skia图形库时遇到的几个问题

    Skia是一个开源的2D图形库,提供通用的API,适用于工作中遇到的各种硬件和软件平台.这是谷歌浏览器Chrome OS,Android的图形引擎,Mozilla Firefox浏览器和Firefox ...

  2. 【JAVA并发编程实战】7、日志服务

    这里是一个应用项目使用生产消费模型的日志类 package cn.study.concurrency; import java.util.concurrent.BlockingQueue; impor ...

  3. 【工业串口和网络软件通讯平台(SuperIO)教程】四.开发设备驱动

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    开发准备 把“开发包”内的所有文件复制到项目的“bin”目录下,或项目下的专用生成目录.开发包 ...

  4. Tomcat下使用c3p0配置jndi数据源

    下载c3p0包: 下载地址:https://sourceforge.net/projects/c3p0/files/?source=navbar 解压后得到包:c3p0-0.9.2.jar,mchan ...

  5. Thinkcmf 二次开发

    一.   创建模板 demo 1 Tpl下创建demo文件-----后台启用新的模板 (网站信息--模板方案) 2 在模板在tpl/demo目录下创建Portal目录,然后在Portal目录下创建in ...

  6. js 模块化的一些理解和es6模块化学习

    模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理  5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...

  7. 获得appstore里面app的最新的版本信息,进行版本更新

    版本更新有两种方式 一种是从服务器获得最新的版本信息和当前app的版本进行比较 另外一种是获得appStore上最新的版本信息和当前的app的版本进行比较 现在我来说一下如何通过appStore获得最 ...

  8. android 多线程

    本章讲述在android开发中,多线程的应用.多线程能够处理耗时的操作并优化程序的性能.本章主要介绍知识点,AsyncTask,Java线程池,ThreadPoolExecutor线程池类.本章案例只 ...

  9. JavaScript的个人学习随手记(二)

    JS HTML DOM 改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Sat Sep 24 2016 15:06:50 GMT+0800 (中国标准时 ...

  10. python之import子目录文件

    问题:   在pre_tab.py文件下: print("AA") from test.te import login1 login1() from test.te import ...