Shader学习17——序列帧动画

序列帧动画实际就是动态地去改UV点就行,实现的时候注意一下怎么取行列就可以

Mar-05-2021 15-16-55.gif

c#代码里控制_Process的赋值,从1-行*列总数循环即可。测试的时候创建一个UI的Image,然后把材质赋值上去,贴图记得给材质。我是mac系统的,不知道win上是否会出现顺序错误的问题,或者有需求从左下角往上,如果出现错误的话尝试修改这行代码:
float row = floor(_HorizontalAmount-_Process / _HorizontalAmount); // /运算获取当前行
float row = floor(_Process / _HorizontalAmount); // /运算获取当前行

代码如下:

Shader "Unlit/序列帧动画" {
    Properties {
        _Color ("Color Tint", Color) = (1, 1, 1, 1)
        _MainTex ("Image Sequence", 2D) = "white" {}
        [IntRange]_HorizontalAmount ("Horizontal Amount", Range(1, 8)) = 1
        [IntRange]_VerticalAmount ("Vertical Amount", Range(1, 8)) = 1
        [IntRange]_Process ("Process", Range(1, 64)) = 1
    }
    SubShader {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        
        Pass {
            Tags { "LightMode"="ForwardBase" }
            
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
            
            CGPROGRAM
            
            #pragma vertex vert  
            #pragma fragment frag
            
            #include "UnityCG.cginc"
            
            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _HorizontalAmount;
            float _VerticalAmount;
            float _Process;
            
            struct a2v {  
                float4 vertex : POSITION; 
                float2 texcoord : TEXCOORD0;
            };  
            
            struct v2f {  
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };  
            
            v2f vert (a2v v) {  
                v2f o;  
                //将顶点坐标转换到裁剪空间坐标系并且
                o.pos = UnityObjectToClipPos(v.vertex);  

                //将纹理坐标映射到顶点上以及zw偏移
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target {
                //从左下角开始float row = floor(_Process / _HorizontalAmount);
                float row = floor(_HorizontalAmount-_Process / _HorizontalAmount);    // /运算获取当前行
                float column = floor(fmod(_Process,_HorizontalAmount));  // %运算获取当前列
                
                //首先把原纹理坐标i.uv按行数和列数进行等分,然后使用当前的行列进行偏移
                half2 uv = i.uv + half2(column, row);
                uv.x /= _HorizontalAmount;
                uv.y /= _VerticalAmount;
                
                //纹理采样
                fixed4 c = tex2D(_MainTex, uv);
                c.rgb *= _Color;
                
                return c;
            }
            
            ENDCG
        }  
    }
    //FallBack "Transparent/VertexLit"
}

使用下面这张纹理可以很好的理解位置

0.png
Mar-05-2021 15-21-14.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值