如何通过Shader实现UV旋转动画

发表于2018-03-27
评论0 1.12w浏览
本篇文章主要是教大家如何通过Shader实现UV旋转动画,实现一个旋转效果。方法就是将整个Texture改变Rotate进行旋转,不过在在编写Shader之前需要先给大家科普一个图形学知识。

一、矩阵乘法

前提:只有第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。
定义:

二、旋转矩阵

旋转矩阵的公式如下图:
其中这个x,y是纹理坐标。

Shader效果图如下:

Shader代码
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'  
Shader "Custom/Simple"  
{  
    Properties  
    {  
        _Color("Main Color", Color) = (1,1,1,1)  
        _MainTex("Main Texture", 2D) = "white" {}  
        _RotateSpeed("Rotate Speed", Range(1, 100)) = 20  
    }  
    SubShader  
    {  
        tags{"Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True"}  
        Blend SrcAlpha OneMinusSrcAlpha  
        Pass  
        {  
            Name "Simple"  
            Cull off  
            CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
            #include "UnityCG.cginc"  
            float4 _Color;  
            sampler2D _MainTex;  
            float _RotateSpeed;  
            struct v2f  
            {  
                float4 pos:POSITION;  
                float4 uv:TEXCOORD0;  
            };  
            v2f vert(appdata_base v)  
            {  
                v2f o;  
                //将物体坐标转化为剪裁坐标(顶点坐标转换:物体坐标->世界坐标->观察坐标->剪裁左边)  
                o.pos = UnityObjectToClipPos(v.vertex);  
                o.uv = v.texcoord;  
                return o;  
            }  
            half4 frag(v2f i):COLOR  
            {  
                //以纹理中心为旋转中心  
                float2 uv = i.uv.xy - float2(0.5, 0.5);  
                //旋转矩阵公式  
                uv = float2(uv.x * cos(_RotateSpeed * _Time.x) - uv.y * sin(_RotateSpeed * _Time.x),  
                            uv.x * sin(_RotateSpeed * _Time.x) + uv.y * cos(_RotateSpeed * _Time.x));  
                //恢复纹理位置  
                uv += float2(0.5, 0.5);  
                half4 c = tex2D(_MainTex , uv) * _Color;  
                return c;  
            }  
            ENDCG  
        }  
    }  
} 

最终效果会发现周围出现其他纹理
这时将Wrap Model切换为Clamp模式


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引