美文网首页
Shader学习17——序列帧动画

Shader学习17——序列帧动画

作者: ShawnWeasley | 来源:发表于2021-03-09 08:48 被阅读0次

    序列帧动画实际就是动态地去改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

    相关文章

      网友评论

          本文标题:Shader学习17——序列帧动画

          本文链接:https://www.haomeiwen.com/subject/rsgrqltx.html