游戏开发中经常会使用到加载动画,加载动画可以通过序列帧的方式实现,也可以采用UV纹理旋转使用一张图片实现。
旋转矩阵:
- 绕x-轴的主动旋转定义为:
- 绕y-轴的主动旋转定义为:
- 绕z-轴的主动旋转定义为:
旋转注意事项
- 物体平移到原点
- 实现旋转
- 物体平移到原来的位置
代码示例:
Shader "Hidden/Loading"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Speed("Speed",float)=2
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
float _Speed;
fixed4 frag (v2f i) : SV_Target
{
float2 tmpUV=i.uv;
tmpUV -=float2(0.5,0.5);
if(length(tmpUV)>0.5)
{
return fixed4(0,0,0,0); //去掉对角线上的像素
}
float2 finalUV=0;
float angle=_Time.x*_Speed;
finalUV.x=tmpUV.x*cos(angle)-tmpUV.y*sin(angle);
finalUV.y=tmpUV.x*sin(angle)+tmpUV.y*cos(angle); //绕Z轴旋转,详情查看旋转矩阵
finalUV+=float2(0.5,0.5);
fixed4 col = tex2D(_MainTex, finalUV);
// just invert the colors
//col.rgb = 1 - col.rgb;
return col;
}
ENDCG
}
}
}