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的更多相关文章

  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. hibernate中表关系为多对多时,如何只删除中间表数据

    先说问题:我遇到的问题是,在用户和用户组对象关系中他们是多对多关系.所以中间是成在一张中间表的.经理要求当逻辑删除对象数据时,必须删除中间表中的数据. hibernate是面向对象操作sql语句的,如 ...

  2. No.008:String to Integer (atoi)

    问题: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ca ...

  3. python之初体验

    1. Python简介: Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明, ...

  4. 【http抓包】记录一次抓手机app的接口

    抓手机的接口地址,好用的工具很多,想 windows下的 Fiddler 和mac下的Charles 1. fiddler的设置教程是 http://jingyan.baidu.com/article ...

  5. Lind.DDD.IoC依赖注入与面向方面的实现

    回到目录 IoC是解耦的灵魂,很难想像一个框架中没有IoC会变成什么样子,Lind.DDD里的IoC是通过Unity实现的,由依赖注入(unity)和方法拦截组成(Interception),依赖注入 ...

  6. maven 间接依赖的jar自动引入

    很多时候,我们引用的第三方jar需要一些其他的第三方jar,这个时候默认情况下,间接需要依赖的第三方jar是不会自动被引入的,如果希望这些额外的三方jar被自动引入,则在Maven仓库中除了提交jar ...

  7. 1 为什么搭建.Net core下的云开发框架

    几年前我组织开发了综合业务管理系统,该系统包含系统门户.业务信息.联系处置.数据查询.指标报表等功能板块,其中涵盖了门户定制.工作流引擎.自定义表单.指标计算.通用数据展示.通用后台服务.用户授权认证 ...

  8. CSS实现弹出导航菜单

    查看实际效果:http://keleyi.com/a/bjac/vksd7321.htm 完整代码,保存在html文件打开也可看到效果: <!DOCTYPE html PUBLIC " ...

  9. [原][C#][winForm]分级基金折溢价WinForm网络计算器

    分级基金折溢价WinForm网络计算器 通过子/母基金代码,从 [ 东方财富网,天天基金网,新浪 ] 抓取分级基金的子母基金数据(代码,名称,净值,价格), 并计算出子基金(A基金,B基金)以及母基金 ...

  10. 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(四)地图导航控件模块

    config.xml文件的配置如下: <widget left="10" top="50" config="widgets/Navigation ...