纹理动画&顶点动画及其阴影
1.纹理动画
序列帧动画
更改纹理坐标实现动画
需要使用到的内置时间变量
其中_Time.y 就是开始加载所经过的时间
效果
代码
①需要将渲染模式设置为透明
②关闭深度写入和开启混合,就是透明度混合那一套
③floor函数表示向下取整
④在片元着色器中进行纹理动画坐标变化
Shader "Unlit/Image_seq"
{
Properties
{
_Color ("Color Tint",Color)= (1,1,1,1)
_MainTex("Image Sequence", 2D) ="white"{
}
_HorizontalAmount("Horizonton Amount", Float) = 4
_VerticalAmount("Vertical Amount",Float) =4
//这两项分别代表了水平和竖直方向上包含的的关键帧图像的个数,在是窗口设置成8x8
_Speed("Speed",Range(1,100))= 30
//控制动画播放速度
}
SubShader
{
Tags {
"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
//因为帧序列是png透明纹理因此用透明队列
Pass
{
Tags {
"LightMode"="ForwardBase"}
ZWrite off //关闭深度写入
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 pos : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color;
float _VerticalAmount;
float _HorizontalAmount;
float _Speed;
v2f vert (appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float time = floor(_Time.y * _Speed);
float row = floor(time / _HorizontalAmount);
//floor 函数向下取整
float column = time - row * _HorizontalAmount;
//原书上写的是乘以_VerticalAmount
//应该是乘以_HorizontalAmount;
//之所以没出错是因为两个值相同
//_Time.y是场景加载的时间,_Time是内置变量
//使用经过时间除以_HorizontalAmount 的商所谓对应的行索引,其余数作为列索引
half2 uv = i.uv + half2 (column, -row);
uv.x /= _HorizontalAmount;
uv.y /= _VerticalAmount;
//上下两种计算方法都可
//half2 uv = float2(i.uv.x /_HorizontalAmount, i.uv.y /_VerticalAmount);
//uv.x += column / _HorizontalAmount;
//uv.y -= row /_VerticalAmount;
//我们已经知道帧序列是8*8的图,下面需要通过行列索引值来找到真正的采样坐标
//首先把i.uv除以帧序列行列数,进行等分,得到每个子图像的坐标范围
//然后用当前的行列数对上面的坐标进行偏移,行坐标用加法进行偏移
//列坐标按照从下到上逐渐增加与帧序列图由下到上递减相反,因此使用 -=
fixed4 c = tex2D (_MainTex,uv);
c.rgb *= _Color;
return c;
}
ENDCG
}
}
Fallback "Transparent/VertexLit"
}
背景纹理动画
代码
①不同的是有两层贴图
②在顶点着色器中变换纹理坐标
③用lerp对背景进行混合
Shader "Unlit/back-seq"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {
}
_DetailTex ("2nd Layer(RGB)", 2D) = "white"{
}