(九)计算机图形学 之 UV 动画 Loading旋转

Loading 旋转 做法:


问题:
1.纹理旋转,UV旋转起来
2.UV 使用 矩阵旋转

矩阵旋转 注意事项:
1. 物体平移到原点
2.实现旋转
3.平移到原来位置

旋转公式:

举个栗子 :
围绕z轴旋转  上图 (1)的代码实现
float2 finalUV = 0;
float angle = _Time.x * _Speed;
finalUV.x = tmpUV.x * cos(angle) - tmpUV.y * sin(angle);
finalUV.y = tmpUV.x * sin(angle) + tmpUV.y * cos(angle);

angle : 旋转的角度   (时间 跟 速度决定)
finalUV: 旋转结果 存储
tmpUV : 是 当前要旋转的 物体 uv

整体旋转的 代码献上 :

Shader "Custom/Loading" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _Speed ("Speed" ,float) = 10.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        // 打开Alpha通道
        Blend SrcAlpha OneMinusSrcAlpha
            Pass {
                    CGPROGRAM
                    #pragma vertex vert
                    #pragma fragment frag
                    #include "UnityCG.cginc"
                    struct appdata {
                        float4 vertex : POSITION;
                        float2 uv : TEXCOORD0;
                    };


                    struct v2f {
                        float4 vertex : SV_POSITION;
                        float2 uv : TEXCOORD0;
                    };
                    v2f vert (appdata v)
                    {
                        v2f o;
                        o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                        o.uv = v.uv;
                        return o;
                    }
                    sampler2D _MainTex;

                    float _Speed;
                    fixed4 frag (v2f i) : SV_Target
                    {
                        float2 tmpUV = i.uv;
                        // 先平移到原点
                        tmpUV -= float2(0.5,0.5);
                        // 从原点 到边界的距离是0.5  如果大于的话 变成透明的
                        if(length(tmpUV)>0.5)
                        {
                            return fixed4(0,0,0,0);
                        }
                        float2 finalUV = 0;
                        // 执行旋转公式
                        float angle = _Time.x * _Speed;
                        finalUV.x = tmpUV.x * cos(angle) - tmpUV.y * sin(angle);
                        finalUV.y = tmpUV.x * sin(angle) + tmpUV.y * cos(angle);
                        // 在平移回来
                        finalUV += float2(0.5,0.5);
                        fixed4 col = tex2D(_MainTex,finalUV);
                        return col;
                    }
                ENDCG 
            }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GarFe-Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值