zoukankan      html  css  js  c++  java
  • Unity Shader 序列帧动画

    Shader "Custom/SpriteAnim"{
        Properties {
            _Color ("Color Tint", Color) = (1, 1, 1, 1)
            //关键帧纹理
            _MainTex ("Image Sequence", 2D) = "white" {}
            //图像在水平方向上的关键帧个数
            _HorizontalAmount ("Horizontal Amount", Float) = 4
            //图像在垂直方向上的关键帧个数
            _VerticalAmount ("Vertical Amount", Float) = 4
            //控制序列帧的播放速度
            _Speed ("Speed", Range(1, 100)) = 30
        }
        SubShader {
            //由于序列帧图像通常都是透明纹理,我们需要设置Pass的相关状态,以渲染透明效果
            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 _Speed;
                  
                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);  
                    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  
                    return o;
                }  
                
                fixed4 frag (v2f i) : SV_Target {
                    //_Time.y 是自该场景后所经过的时间,与速度相乘来得到模拟的时间,再用floor函数取整
                    float time = floor(_Time.y * _Speed);  
                    //获得行索引
                    float row = floor(time / _HorizontalAmount);
                    //获得列索引
                    float column = time - row * _HorizontalAmount;
                    
                    //half2 uv = float2(i.uv.x /_HorizontalAmount, i.uv.y / _VerticalAmount);
                    //uv.x += column / _HorizontalAmount;
                    //uv.y -= row / _VerticalAmount;
                    //进行位置偏移
                    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"
    }
    

    如果场景视图看不到动画:
    1.场景视图上方的"Toggle Skybox,fog....."按钮必须打开,并在下列表中勾选"Animated Materials"。
    2.如果是单面模型,看不到任何东西,检查是不是查看的不是正面

    游戏视图看不到动画:
    游戏视图中必须在播放模式下才能看到效果

  • 相关阅读:
    搞不明白,乱七八糟一团浆糊
    不能让外界打乱你的生活节奏
    被人的认知刷新了
    C#识别图片上的数字
    C# @字符用法
    SQL语句优化(转摘)
    C# 根据年月获得此月第一天和最后一天,并计算工作日
    jQuery渐隐渐出的文字提示
    JQuery 拖动层
    Windows SQL Server 2012 R2 安装Intel I217-V/I218-V网卡驱动(转)
  • 原文地址:https://www.cnblogs.com/kingBook/p/12714659.html
Copyright © 2011-2022 走看看