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.如果是单面模型,看不到任何东西,检查是不是查看的不是正面

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

  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/kingBook/p/12714659.html
Copyright © 2011-2022 走看看