Unity Shader 序列帧动画

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 1 Shader "MyUnlit/FrameAnimation" 2 2 { 3 3 Properties 4 4 { 5 5 _Color("Color Tint",color)=(1,1,1,1) 6 6 _MainTex ("Texture", 2D) = "white" {} 7 7 _CutX("CutX Amount",float)=4 8 8 _CutY("CutY Amount",float)=4 9 9 _Speed("Speed",range(1,100))=30 1010 } 1111 SubShader 1212 { 1313 //一般序列帧动画的纹理会带有Alpha通道,因此要按透明效果渲染,需要设置标签,关闭深度写入,使用并设置混合 1414 Tags { "RenderType"="transparent" "queue"="transparent" "ignoreprojector"="true" } 1515 ZWrite off 1616 blend srcalpha oneminussrcalpha 1717 1818 Pass 1919 { 2020 Tags{"lightmode"="forwardbase"} 2121 2222 CGPROGRAM 2323 #pragma vertex vert 2424 #pragma fragment frag 2525 #pragma multi_compile_fog 2626 2727 #include "UnityCG.cginc" 2828 2929 struct appdata 3030 { 3131 float4 vertex : POSITION; 3232 float2 uv : TEXCOORD0; 3333 }; 3434 3535 struct v2f 3636 { 3737 float2 uv : TEXCOORD0; 3838 UNITY_FOG_COORDS(1) 3939 float4 vertex : SV_POSITION; 4040 }; 4141 4242 sampler2D _MainTex; 4343 float4 _MainTex_ST; 4444 fixed4 _Color; 4545 float _CutX; 4646 float _CutY; 4747 float _Speed; 4848 4949 v2f vert (appdata v) 5050 { 5151 v2f o; 5252 o.vertex = UnityObjectToClipPos(v.vertex); 5353 o.uv = TRANSFORM_TEX(v.uv, _MainTex); 5454 UNITY_TRANSFER_FOG(o,o.vertex); 5555 return o; 5656 } 5757 5858 fixed4 frag (v2f i) : SV_Target 5959 { 6060 //取得整数的时间 6161 float time = floor(_Time.y*_Speed); 6262 //整除部分为行(因为播放顺序是从左到右,先行后列) 6363 float row = floor(time / _CutX); 6464 //余数部分为列 6565 float column = time - row * _CutX; 6666 6767 //计算偏移值,其中u向为列索引值,v向为行索引的相反数(播放原点是左上角,而uv采样原点是左下角,所以v向偏移应该取反) 6868 half2 uv = i.uv + half2(column,-row); 6969 //除以行列得到最终的采样值 7070 uv.x /= _CutX; 7171 uv.y /= _CutY; 7272 7373 fixed4 col = tex2D(_MainTex,uv); 7474 col.rgb *= _Color; 7575 UNITY_APPLY_FOG(i.fogCoord, col); 7676 return col; 7777 } 7878 ENDCG 7979 } 8080 } 8181 FallBack "Transparent/VertexLit" 8282 }
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

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

SpringBoot整合Redis乱码原因及解决方案

问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa