unity shader加载序列帧图片

先设置序列帧图WarpMode 为Repeat;

在这里插入图片描述

Shader部分

Shader "My/Sequence" {
    Properties {
        _Opacity    ("透明度", range(0, 1)) = 0.5
        _Sequence   ("序列帧", 2d) = "gray"{}
        _RowCount   ("行数", int) = 1
        _ColCount   ("列数", int) = 1
        _Speed      ("速度", range(0.0, 15.0)) = 1
    }
    SubShader {
         Tags {
            "Queue"="Transparent"               // 调整渲染顺序
            "RenderType"="Transparent"          // 对应改为Cutout
            "ForceNoShadowCasting"="True"       // 关闭阴影投射
            "IgnoreProjector"="True"            // 不响应投射器
         }
         Pass {
            Name "FORWARD_AD"
            Tags {
                "LightMode"="ForwardBase"
            }
            Blend One One                       // 修改混合方式
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0
            // 输入参数
            uniform sampler2D _Sequence; uniform float4 _Sequence_ST;
            uniform half _Opacity;
            uniform half _RowCount;
            uniform half _ColCount;
            uniform half _Speed;

            // 输入结构
            struct VertexInput {
                float4 vertex : POSITION;       // 顶点位置 总是必要
                float2 uv : TEXCOORD0;          // UV信息 采样贴图用
                float3 normal:NORMAL; //法线
            };
            // 输出结构
            struct VertexOutput {
                float4 pos : SV_POSITION;       // 顶点位置 总是必要
                float2 uv : TEXCOORD0;          // UV信息 采样贴图用
            };
            // 输入结构>>>顶点Shader>>>输出结构
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                    // 顶点位置 OS>CS 
                    o.pos = UnityObjectToClipPos( v.vertex);    
                    // UV信息 支持TilingOffset
                    o.uv = TRANSFORM_TEX(v.uv, _Sequence);  
                    //计算序列id       
                    float id=floor(_Time.z*_Speed);  
                    //所在行=当前值/列数   floor 取整
                    float idV=floor(id/_ColCount);  
                    //计算当前id所在列  求余   余数=当前值-所在行*总列数
                    float idU= id - idV * _ColCount; 
                    //计算横向U轴长度(步幅) 1/列数
                    float stepU=1.0/_ColCount;
                    //计算纵向V轴长度(步幅) 1/行数
                    float stepV=1.0/_RowCount;
                    //计算初始uv uv是左下角为原点 序列一般以左上为远点,所用所在列需要倒过来
                    float2 initUV=o.uv*float2(stepU,stepV)+float2(0.0,stepV*(_RowCount-1+idV));
                    o.uv=initUV+float2(idU*stepU,idV*stepV);
                return o;
            }
            // 输出结构>>>像素
            half4 frag(VertexOutput i) : COLOR {
                // 采样贴图 RGB颜色 A透贴不必须
                half4 var_Sequence = tex2D(_Sequence, i.uv);     
                half3 finalRGB = var_Sequence.rgb;
                half opacity = var_Sequence.a * _Opacity;
                // 返回值
                return half4(finalRGB * opacity, opacity);             
            }
            ENDCG
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值