Unity Shader 序列帧动画

Wesley13
• 阅读 933

shader中的序列帧动画属于纹理动画中的一种,主要原理是将给定的纹理进行等分,再根据时间的变化循环播放等分中的一部分。

Unity Shader 内置时间变量

名称

类型

描述

_Time

float4

(t/20,t,2t,3t)   其中t为自该场景加载所经过时间

_SinTime

float4

(t/8,t/4,t/2,t)  其中t为自该场景加载所经过时间的正弦值

_CosTime

float4

(t/8,t/4,t/2,t)  其中t为自该场景加载所经过时间的余弦值

unity_DeltaTime

float4

(dt,1/dt,sdt,1/sdt)  其中dt为时间增量,sdt为时间增量的平滑值

脚本如下:

 1 Shader "MyUnlit/FrameAnimation"
 2 {
 3     Properties
 4     {
 5         _Color("Color Tint",color)=(1,1,1,1)
 6         _MainTex ("Texture", 2D) = "white" {}
 7         _CutX("CutX Amount",float)=4
 8         _CutY("CutY Amount",float)=4
 9         _Speed("Speed",range(1,100))=30
10     }
11     SubShader
12     {
13         //一般序列帧动画的纹理会带有Alpha通道,因此要按透明效果渲染,需要设置标签,关闭深度写入,使用并设置混合
14         Tags { "RenderType"="transparent" "queue"="transparent" "ignoreprojector"="true" }
15         ZWrite off
16         blend srcalpha oneminussrcalpha
17 
18         Pass
19         {
20             Tags{"lightmode"="forwardbase"}
21 
22             CGPROGRAM
23             #pragma vertex vert
24             #pragma fragment frag
25             #pragma multi_compile_fog
26 
27             #include "UnityCG.cginc"
28 
29             struct appdata
30             {
31                 float4 vertex : POSITION;
32                 float2 uv : TEXCOORD0;
33             };
34 
35             struct v2f
36             {
37                 float2 uv : TEXCOORD0;
38                 UNITY_FOG_COORDS(1)
39                 float4 vertex : SV_POSITION;
40             };
41 
42             sampler2D _MainTex;
43             float4 _MainTex_ST;
44             fixed4 _Color;
45             float _CutX;
46             float _CutY;
47             float _Speed;
48 
49             v2f vert (appdata v)
50             {
51                 v2f o;
52                 o.vertex = UnityObjectToClipPos(v.vertex);
53                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
54                 UNITY_TRANSFER_FOG(o,o.vertex);
55                 return o;
56             }
57 
58             fixed4 frag (v2f i) : SV_Target
59             {
60                 //取得整数的时间
61                 float time = floor(_Time.y*_Speed);
62                 //整除部分为行(因为播放顺序是从左到右,先行后列)
63                 float row = floor(time / _CutX);
64                 //余数部分为列
65                 float column = time - row * _CutX;
66 
67                 //计算偏移值,其中u向为列索引值,v向为行索引的相反数(播放原点是左上角,而uv采样原点是左下角,所以v向偏移应该取反)
68                 half2 uv = i.uv + half2(column,-row);
69                 //除以行列得到最终的采样值
70                 uv.x /= _CutX;
71                 uv.y /= _CutY;
72 
73                 fixed4 col = tex2D(_MainTex,uv);
74                 col.rgb *= _Color;
75                 UNITY_APPLY_FOG(i.fogCoord, col);
76                 return col;
77             }
78             ENDCG
79         }
80     }
81     FallBack "Transparent/VertexLit"
82 }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
国庆假期玩不停双重好礼放肆领
自2021年10月1日00:00起至2021年10月7日24:00,新注册并激活(需全部完成账号注册的五个步骤,否则账号状态并未激活)AWS海外区域账户,填写页面下方表单,即可申领价值$200美元的AWS海外区域账户服务抵扣券直充到您的账户,用以抵扣服务消费,助您轻松体验多个云迁移应用场景。同时,您还可获赠AWS精美祥云纪念T恤一件。AWS国庆T恤
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这