如果代码中有什么不清楚请查看以下基础知识
Shader基础知识
unity3d 中 七种坐标知识详解
可调节角度和速度的旋转效果
基本原理就是:先获得当前uv的xy夹角角度,再根据中心点到边缘的距离增加扭曲力度,然后再逆运算取得uv的xy值。
笑狗图
代码
Shader "Custom/旋转"
{
Properties
{
_MainTex("贴图", 2D) = "white" {}
_Angle("旋转角度", Range(-360, 360)) = 0
_RotateSpeed("旋转速度", Range(-10, 10)) = 0
}
SubShader
{
tags{"
Queue" = "Transparent"
"RenderType" = "Transparent"
// 忽略光照
"IgnoreProjector" = "True"
}
//正常透明混合
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
//变量声明
sampler2D _MainTex;
float _RotateSpeed;
float _Angle;
struct v2f
{
float4 position:POSITION;
float4 uv:TEXCOORD0;
};
//顶点着色器
v2f vert(appdata_base v)
{
v2f o;
//物体坐标改为裁剪坐标
o.position = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
}
//片段着色器
half4 frag(v2f o):COLOR
{
//uv值的区间是(0,1),所以中心点就是(0.5,0.5)
float center = float2(0.5, 0.5);
//将uv坐标移到中心
float2 uv = o.uv.xy - center;
//输入的_Angle值为了方便理解设定为-360-360. 经过转换后的angle值为(-pi * 2) - (pi*2)区间
float angle = _Angle * (3.14 * 2 / 360);
angle = _RotateSpeed != 0?_RotateSpeed * _Time.y : angle;
//矩阵旋转
uv = float2(uv.x * cos(angle) - uv.y * sin(angle),
uv.x * sin(angle) + uv.y * cos(angle));
//还原uv坐标
uv += float2(0.5, 0.5);
//输出像素值
return tex2D(_MainTex , uv);
}
ENDCG
}
}
}