u3d_Shader_effects笔记6 第二章 animating sprite
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部分:
- public class AnimationTest : MonoBehaviour {
- public float speed = 5.0f;
- public int _CellAmountX = 8;
- float timeValue = 0.0f;
- float timeOffsetY = 0.0f;
- private bool bIsUp_Bottom = true;
- void Start ()
- {
- transform.renderer.material.SetFloat("_CellAmountX", _CellAmountX);
- }
- // Update is called once per frame
- void FixedUpdate ()
- {
- timeValue = Mathf.Ceil(Time.time * speed % _CellAmountX);
- Debug.Log("timeValue:" + timeValue);//上log图,显示x的index
- if (timeValue==_CellAmountX)
- {
- if (bIsUp_Bottom)
- {
- timeOffsetY = Mathf.Abs(timeOffsetY - 1.0f);//当达到x最右侧,进行上下Y的index切换
- }
- bIsUp_Bottom = false;
- }
- else
- {
- bIsUp_Bottom = true;
- }
- transform.renderer.material.SetFloat("_TimeValue", timeValue);
- transform.renderer.material.SetFloat("_TimeOffsetY", timeOffsetY);
- }
- }
(2).shader部分,进行纹理坐标的映射关系;
- Shader "Custom/AnimateSprites" {
- Properties {
- _MainTex ("Base (RGB)", 2D) = "white" {}
- // Create the properties below
- _CellAmountX ("Cell Amount", float) = 8
- _TimeValue ("Time Value", float) = 0.0
- _TimeOffsetY("_TimeOffsetY",float ) = 0.0
- }
- SubShader {
- Tags { "RenderType"="Opaque" }
- LOD 200
- CGPROGRAM
- #pragma surface surf Lambert
- sampler2D _MainTex;
- //Create the connection to the properties inside of the
- //CG program
- float _CellAmountX;
- float _TimeValue;
- float _TimeOffsetY;
- struct Input {
- float2 uv_MainTex;
- };
- void surf (Input IN, inout SurfaceOutput o) {
- //Lets store our UVs in a seperate variable
- float2 spriteUV = IN.uv_MainTex;
- //Lets calculate the width of a singe cell in our
- //sprite sheet and get a uv percentage that each cel takes up.
- float cellUVPercentage = 1.0/_CellAmountX;
- //Animate the uv's forward by the width precentage of
- //each cell
- float xValue = spriteUV.x;
- xValue += _TimeValue;
- xValue *= cellUVPercentage;
- float cellUVPercentage_Y = 1.0/2.0f;
- float yValue = spriteUV.y;
- yValue += _TimeOffsetY;
- yValue*=cellUVPercentage_Y;
- spriteUV = float2(xValue, yValue);
- half4 c = tex2D (_MainTex, spriteUV);
- o.Albedo = c.rgb;
- o.Alpha = c.a;
- }
- ENDCG
- }
- FallBack "Diffuse"
- }
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的更多相关文章
- u3d_Shader_effects笔记5 第二章 通过UV,进行纹理移动
1.前面心情 公司最近打包,像我等小弟闲着,看代码容易困,没事偷着学shader,不过还是要多交流才行. 2.本文参考 这次参考比较多:由texture uv延伸问题多,主要是不明白变量定义: htt ...
- Stealth视频教程学习笔记(第二章)
Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数 学习目标: 理解矩阵和与它相关的运算: 理解矩阵的乘 ...
- Java编程思想_笔记_第二章_一切都是对象
第二章对于知识只是点到,会在以后章节会详细展开. 笔记的侧重会偏向记录自己知识模糊的地方.比如 xxx 很重要很难很实用,但是已经熟练使用就没有记录,而 “使用对象.成员名称来使用成员变量”,较简单而 ...
- 【vue.js权威指南】读书笔记(第二章)
[第2章:数据绑定] 何为数据绑定?答曰:数据绑定就是将数据和视图相关联,当数据发生变化的时候,可以自动的来更新视图. 数据绑定的语法主要分为以下几个部分: 文本插值:文本插值可以说是最基本的形式了. ...
- Javascript高级程序设计读书笔记(第二章)
第二章 在HTML中使用Javascript 2.1<script>元素 延迟脚本(defer = "defer")表明脚本在执行时不会影响页面的构造,脚本会被延迟到 ...
- win32多线程程序设计笔记(第二章)
第二章线程的第一次接触,主要讲了如何创建线程以及需要注意的几点. 一.创建线程 与调用函数的过程类似;线程只不过用CreateThread的API将函数封装起来,并产生一个与主程序同时执行的程序来调用 ...
- 流畅的python学习笔记:第二章
第二章开始介绍了列表这种数据结构,这个在python是经常用到的结构 列表的推导,将一个字符串编程一个列表,有下面的2种方法.其中第二种方法更简洁.可读性也比第一种要好 str='abc' strin ...
- java并发编程实战笔记---(第二章)线程安全:正确性
ThreadA__________ 同步 ______________ 异步 ___________ 异步 ThreadB__________ ____________ ...
随机推荐
- 解决使用Skia图形库时遇到的几个问题
Skia是一个开源的2D图形库,提供通用的API,适用于工作中遇到的各种硬件和软件平台.这是谷歌浏览器Chrome OS,Android的图形引擎,Mozilla Firefox浏览器和Firefox ...
- 【JAVA并发编程实战】7、日志服务
这里是一个应用项目使用生产消费模型的日志类 package cn.study.concurrency; import java.util.concurrent.BlockingQueue; impor ...
- 【工业串口和网络软件通讯平台(SuperIO)教程】四.开发设备驱动
SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1 开发准备 把“开发包”内的所有文件复制到项目的“bin”目录下,或项目下的专用生成目录.开发包 ...
- Tomcat下使用c3p0配置jndi数据源
下载c3p0包: 下载地址:https://sourceforge.net/projects/c3p0/files/?source=navbar 解压后得到包:c3p0-0.9.2.jar,mchan ...
- Thinkcmf 二次开发
一. 创建模板 demo 1 Tpl下创建demo文件-----后台启用新的模板 (网站信息--模板方案) 2 在模板在tpl/demo目录下创建Portal目录,然后在Portal目录下创建in ...
- js 模块化的一些理解和es6模块化学习
模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理 5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...
- 获得appstore里面app的最新的版本信息,进行版本更新
版本更新有两种方式 一种是从服务器获得最新的版本信息和当前app的版本进行比较 另外一种是获得appStore上最新的版本信息和当前的app的版本进行比较 现在我来说一下如何通过appStore获得最 ...
- android 多线程
本章讲述在android开发中,多线程的应用.多线程能够处理耗时的操作并优化程序的性能.本章主要介绍知识点,AsyncTask,Java线程池,ThreadPoolExecutor线程池类.本章案例只 ...
- JavaScript的个人学习随手记(二)
JS HTML DOM 改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Sat Sep 24 2016 15:06:50 GMT+0800 (中国标准时 ...
- python之import子目录文件
问题: 在pre_tab.py文件下: print("AA") from test.te import login1 login1() from test.te import ...