Unity 使用Shader实现序列帧动画

这篇具有很好参考价值的文章主要介绍了Unity 使用Shader实现序列帧动画。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

序列帧动画图片使用shader逐帧播放
可以直接使用,拿走不谢。
可以挂到材质上放入Image组件的材质中使用。
文章来源地址https://www.toymoban.com/news/detail-637268.html

Shader "Custom/FrameAnim"
{
    Properties
    {
        _Color("Color", Color) = (1, 1, 1, 1)//颜色
        [PerRendererData]_MainTex("Image Sequence", 2D) = "white" {}//图片
        _HorizontalAmount("Horizontal Amount", Float) = 2//水平列数
        _VerticalAmount("VerticalAmount", Float) = 2//垂直行数
        _Speed("Speed", Range(1, 10)) = 30//播放速度
    }
    SubShader
    {
        LOD 200
        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"
            #include "Lighting.cginc"
   
            fixed4 _Color;
            float _Speed;
            float _HorizontalAmount;
            float _VerticalAmount;
            sampler2D _MainTex;

            float4 _MainTex_ST;
            struct _2vert
            {
                float4 vertex: POSITION;
                float4 texcoord: TEXCOORD0;
            };
            struct vert2frag
            {
                float4 pos: SV_POSITION;
                float2 uv: TEXCOORD0;
            };
   
            vert2frag vert(_2vert v)
            {
                vert2frag o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
            }
            fixed4 frag(vert2frag i) : SV_Target
            {
            	//floor返回小于等于的最大整数
            	//获得虚拟时间,并进行拉伸取整,缩短图片间播放间隔,方便取模
                float time = floor(_Time.y * _Speed);
                //获得总图片数量 _HorizontalAmount * _VerticalAmount
                //对总数取模,得到当前时间点要播放的图片索引号,即整体的第几张图片
                float row = time % (_HorizontalAmount * _VerticalAmount);
				
				//水平方向取模,获取行的索引号
                float posx = floor(row % _HorizontalAmount);
                //floor(row / _HorizontalAmount)能获得纹理坐标竖直方向的序列数
                //Unity的纹理坐标竖直方向的顺序和序列帧纹理中竖直方向上的顺序是相反的。
                //用总体-1-纹理坐标序列数得到序列帧纹理中竖直方向索引号
                float posy = _VerticalAmount - floor(row / _HorizontalAmount) - 1;
				
				//添加到uv坐标上
                half2 uv = i.uv + half2(posx, posy);
                //缩小范围
                uv.x /= _HorizontalAmount;
                uv.y /= _VerticalAmount;
                fixed4 color = tex2D(_MainTex, uv);
                //添加颜色
                color.rgb *= _Color;
                return color;

            }
            ENDCG
        }
    }
    FallBack "Transparent/VertexLit"
}

到了这里,关于Unity 使用Shader实现序列帧动画的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity数列帧播放特效Shader怎么能放有光晕的特效能光晕清晰点

    怎么能放有光晕的特效能光晕清晰点 Shader \\\"Series/CRLuo_Teaching_Tex_Amin_G\\\" {     Properties     {         [NoScaleOffset]         _MainTex (\\\"Texture\\\", 2D) = \\\"white\\\" {}         _X_Sum(\\\"across\\\",float) = 3         _Y_Sum(\\\"vertical\\\",float) = 3         _ShowID(\\\"ID\\\",float) = 0          [Toggle(_AutoPlay_Key)] _Auto

    2024年01月16日
    浏览(59)
  • Unity极坐标Shader特效,以及使用Instanced Property实现相同材质不同参数

    先看看效果 Unity极坐标Shader特效 有时候我们需要在场景中摆放一些热点,用户点击之后出现互动,当然实现这个功能的方法有很多,作为一名程序员,当然是要用最简单的实现。用shader程序化实现它。 啥是极坐标 极坐标,又称极座标系。它是一种表示平面直角坐标系中点的

    2024年02月09日
    浏览(42)
  • unity shader 实现通用描边shader -文字描边-字体描边

    在制作游戏时,可以遇到要对字体添加描边的需求,unity 的UGUI自带的OutLine组件,描边效果不好,宽度过大会出现穿帮,顶点数量也会增加,性能不好,如果对于有几百字,顶点数量会很多,而且无法扩展功能 可以看出Outline创建了4个方向的文字 Unity5.2以前的版本要求,每一个Canvas下至多

    2024年02月03日
    浏览(106)
  • unity GI Shader 实现

    之前分享了一篇对unity全局光照的解析,里面提到了一些东西,需要在Shader内实现,在这一篇补上。 要实现对全局GI的shader实现,我们可以通过对unity内置的Lit进行解析查看。 烘焙的方式有很多种,选择合适的方式烘焙和使用合适类型的光源尤为重要。 首先,我们先实现一下

    2024年02月10日
    浏览(43)
  • Unity通过偏移UV播放序列帧动画

      大家好,我是阿赵。   在Unity引擎里面用shader播放序列图,估计很多人都有用到了,我自己而已写过好几个版本。这里大概介绍一下。   先说目的,我现在有一张这样的图片:   这张图片上面,有9个格子,可以理解成是一个动画的9个序列帧,接下来,通过写一个

    2024年02月10日
    浏览(44)
  • unity Shader实现半透明阴影

    在shader中,要对移动端的兼容,还不想实现两套分开兼容的话, 这两句话一定要改掉,第一行代码直接剔除了gles的渲染,而恰恰大部分移动端都是用的gles(安卓平台)所以,第一行要去掉。第二行是针对于ShaderMod,也就是一些shader新特性,可以调低,内置的lit里面是实现了

    2024年02月01日
    浏览(38)
  • Threejs实现数字人绿幕视频背景透明播放,Shader绿幕视频抠像

    个人主页: 左本Web3D,更多案例预览请点击==》 在线案例 个人简介:专注Web3D使用ThreeJS实现3D效果技巧和学习案例 💕 💕积跬步以至千里,致敬每个爱学习的你。喜欢的话请三连,有问题请私信或者加微信         在数字人应用中,绿幕技术是一种常见的技术,也是实

    2024年02月10日
    浏览(157)
  • Unity用Shader实现边缘光效果

    《自学记录》 1、先创建一个Cube,再创建两个材质球Cube、Unilt 2、再创建一个shader代码UniltShader【Project右键Create-Shader-NewSurfaceShader】把里面原来的代码删除,写入下面的代码 3、把shader UniltShader拖给材质球Unilt 4、把Cube的Mesh Renderer中Materials的Size改为2,然后把材质球Cube、Unilt分

    2024年02月08日
    浏览(46)
  • Unity Shader学习(九)物体边缘实现

    根据前面的学习,我们了解到除了可以对点的颜色进行处理,还可以对点本身进行操作,例如我们可以改变点的位置,这样就可以实现对模型渲染的操控。物体边缘效果是我们常用的一种效果,要实现物体边缘,原理也很简单。 首先我们要了解到,模型在渲染时,有正面和背

    2024年02月16日
    浏览(49)
  • 实现窗户特效的Unity Shader解析

            本文将详细介绍一种使用Unity Shader实现窗户特效的方法。通过分析代码,我们将解释每个关键部分的作用,以及如何将其组合在一起以实现逼真的窗户效果。希望本文能为Shader编程初学者和Unity开发者提供一些有用的指导。   引言:         在游戏和虚拟现实

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包