Unity ShaderLab特效教程 旋转特效 适用于贴图、sprite和ugui的2d着色器实例 代码+详解注释 【可调节角度和速度的旋转效果】

如果代码中有什么不清楚请查看以下基础知识

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
		}
	}
}
发布了134 篇原创文章 · 获赞 37 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/lengyoumo/article/details/104185161
今日推荐