Koo叔说Shader—UV旋转

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/java3182/article/details/80813801

前言

本次依然是在顶点Shader中做一些操作,效果是旋转UV

最终效果如下:

这里写图片描述

原理分析,主要解决两个问题

  • 如何旋转:通过构造旋转矩阵
  • 旋转的中心点,如何定位:可以先将中心点移到中间,旋转完再移回去

旋转矩阵:

M(a) = [cosa -sina]
[sina cosa]

具体实现

Shader "Unlit/UV rotation"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}//Texture2D,旋转UV需要一张贴图
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        Blend SrcAlpha OneMinusSrcAlpha //开启混合
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };
            sampler2D _MainTex;
            float _Angle;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                //Pivot
                float2 pivot = float2(0.5,0.5);//定义旋转中心
                //Rotation Matrix
                float cosAngle = cos(_Time.w);//取时间当角度
                float sinAngle = sin(_Time.w);
                float2x2 rot = float2x2(cosAngle,-sinAngle,sinAngle,cosAngle);//构造2维旋转矩阵
                //Rotation consedering pivot
                float2 uv = v.texcoord.xy - pivot;//先移到中心旋转
                o.uv = mul(rot,uv);
                o.uv += pivot;//再移回来
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return tex2D(_MainTex, i.uv);
            }
            ENDCG
        }
    }
}
  • sin(_Time.w),cos(_Time.w):_Time是Unity传进来的Uniform变量,_Time是一个float4类型的,值为t 是自该场景加载开始所经过的时间,4个分量分别是 (t/20, t, t*2, t*3)

总结分析

本次的Shader效果比较简单,主要用到了二维旋转矩阵及锚点移动技巧如需配套代码,可以从作者github获取

猜你喜欢

转载自blog.csdn.net/java3182/article/details/80813801