Shader "Unlit/贴图的平移缩放"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
_UA("旋转中心x",Float) = 0.5
_UB("旋转中心y",Float) = 0.5
_CenterX("平移x",float) = 0
_CenterY("平移y",float) = 0
_Scale("缩放",Float) = 10
_RotateNum("旋转角度",Range(-360,360)) = 0
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
float _UA;
float _UB;
float _RA;
float _Scale;
float _RotateNum;
float _CenterX;
float _CenterY;
struct v2f
{
float2 uv : TEXCOORD0;
float4 pos : SV_POSITION;
};
v2f vert(appdata_full v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
//将角度转化为弧度
float Rote = (_RotateNum * 3.1415926) / 180;
float sinNum = sin(Rote);
float cosNum = cos(Rote);
float2 di = float2(_UA,_UB);
//计算平移之后的坐标,需要乘平移矩阵
float2 uv = mul(float3(i.uv - di,1),float3x3(1,0,0,0,1,0,_CenterX,_CenterY,1)).xy;
//计算缩放之后的坐标,需要乘缩放矩阵
uv = mul(uv,float2x2(_Scale,0,0,_Scale));
//计算旋转之后的坐标,需要乘旋转矩阵
uv = mul(uv,float2x2(cosNum,-sinNum,sinNum,cosNum)) + di;
fixed4 col;
//用最终的坐标来采样当前的纹理,就ok了
col = tex2D(_MainTex,TRANSFORM_TEX(uv,_MainTex));;
return col;
}
ENDCG
}
}
}