Unity中Shader序列帧动画(U、V方向的走格)

文章目录

  • 前言
  • 一、U方向的走格
    • 1、 要实现移动的效果,我们就会想到使用_Time
    • 2、使用floor向下取整
    • 3、把x、y缩小为原函数的 Column倍
    • 4、使用_Sequence的z控制帧动画U方向上的速度
  • 二、U方向的走格
  • 三、最终效果
    • 1、亚丝娜
    • 2、小蓝帽
    • 3、火
    • 4、最终代码


前言

在上一篇文章中,我们定位了通用的Shader序列帧动画的通用起始点位置。

  • Unity中Shader序列图动画(UV流动的通用起始点)

在这篇文章中,我们实现一下在U方向上的走格。


一、U方向的走格

1、 要实现移动的效果,我们就会想到使用_Time

o.uv.x +=_Time.y;

  • 但是,直接相加使用的话,会实现如下效果,不是我们想要的走格子
    请添加图片描述
  • f ( t ) = t f(t) =t f(t)=t
    在这里插入图片描述

2、使用floor向下取整

o.uv.x += floor(_Time.y);

  • 这样实现了加格子的效果。但是,看不见Shader移动了
    在这里插入图片描述
  • f ( t ) = t f(t) = t f(t)=t
  • g ( t ) = ⌊ f ( t ) ⌋ = ⌊ t ⌋ g(t) = \lfloor f(t) \rfloor = \lfloor t \rfloor g(t)=f(t)⌋=t
  • 由图中可看出,u方向看不出移动的原因:因为每次加的值都是1的倍数。
  • 所以,当对应到[0,1]的uv值时,就看不出移动了
    在这里插入图片描述

3、把x、y缩小为原函数的 Column倍

o.uv.x += floor(_Time.z *_Sequence.y)/_Sequence.y;

  • 这样就可以实现 U 方向的走格效果了
    请添加图片描述
  • u ( t ) = g ( C o l u m n ⋅ t ) C o l u m n = ⌊ C o l u m n ⋅ t ⌋ C o l u m n u(t) = \frac{g(Column·t)}{Column} = \frac{\lfloor Column·t \rfloor}{Column} u(t)=Columng(Columnt)=ColumnColumnt
    在这里插入图片描述

4、使用_Sequence的z控制帧动画U方向上的速度

_Sequence(“Row(X) Column(Y) Speed(Z)”,Vector) = (1,1,1,1)

o.uv.x += floor(_Time.z * _Sequence.z *_Sequence.y )/_Sequence.y;

请添加图片描述


二、U方向的走格

  • 因为,我们需要实现走完一行再走下一行的效果。

  • 所以,就需要把 v 方向上的 x 扩大到原来的 Colum(列) 倍

  • v ( t ) = u ( t C o l u m n ) = ⌊ C o l u m n ⋅ t C o l u m n ⌋ C o l u m n v(t) = u(\frac{t}{Column}) = \frac{\lfloor \frac{Column·t}{Column} \rfloor}{Column} v(t)=u(Columnt)=ColumnColumnColumnt

  • 并且,因为 v 方向是从上到下移动

  • 所以,这里需要减去该函数值而不是加上
    在这里插入图片描述

o.uv.y -= floor(_Time.y *_Sequence.y * _Sequence.z / _Sequence.y)/_Sequence.x;

请添加图片描述


三、最终效果

1、亚丝娜

在这里插入图片描述
请添加图片描述

2、小蓝帽

在这里插入图片描述

请添加图片描述

3、火

在这里插入图片描述
请添加图片描述

4、最终代码

Shader "MyShader/URP/P3_9"
{Properties{_Color("Color",Color) = (1,1,1,1)_MainTex("MainTex",2D) = "white"{}_Sequence("Row(X) Column(Y) Speed(Z)",Vector) = (1,1,1,1)}SubShader{Tags{//告诉引擎,该Shader只用于 URP 渲染管线"RenderPipeline"="UniversalPipeline"//渲染类型"RenderType"="Transparent"//渲染队列"Queue"="Transparent"}Blend SrcAlpha OneMinusSrcAlpha Zwrite OnPass{HLSLPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fog#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"struct Attribute{float3 vertexOS : POSITION;float2 uv : TEXCOORD0;};struct Varying{float4 vertexCS : SV_POSITION;float2 uv : TEXCOORD1;float fogCoord : TEXCOORD2;};CBUFFER_START(UnityPerMaterial)float4 _Color;float4 _MainTex_ST;half4 _Sequence;CBUFFER_ENDTEXTURE2D(_MainTex);SAMPLER(sampler_MainTex);Varying vert(Attribute v){Varying o;o.vertexCS = TransformObjectToHClip(v.vertexOS);o.uv = float2(v.uv.x/_Sequence.y,v.uv.y/_Sequence.x + (_Sequence.x - 1)/_Sequence.x);o.uv.x += floor(_Time.y *_Sequence.y * _Sequence.z)/_Sequence.y;o.uv.y -= floor(_Time.y *_Sequence.y * _Sequence.z / _Sequence.y)/_Sequence.x;//o.uv.x += floor(_Time.y);//o.uv = float2(v.uv.x/4,v.uv.y/4);//o.uv = TRANSFORM_TEX(v.uv,_MainTex);o.fogCoord = ComputeFogFactor(o.vertexCS.z);return o;}half4 frag(Varying i) : SV_Target{float4 mainTex = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.uv);float4 col = mainTex * _Color;col.rgb = MixFog(col,i.fogCoord);return col;}ENDHLSL}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323835.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink Connector 开发

Flink Streaming Connector Flink是新一代流批统一的计算引擎,它需要从不同的第三方存储引擎中把数据读过来,进行处理,然后再写出到另外的存储引擎中。Connector的作用就相当于一个连接器,连接Flink计算引擎跟外界存储系统。Flin…

03 decision tree(决策树)

一、decision tree(决策树) 1. classification problems(纯度) i . entropy (熵) ​ 作用:衡量一组数据的纯度是否很纯 ,当五五开时他的熵都是最高的,当全是或者都不是…

网络调试 UDP1,开发板用静态地址-入门5

https://www.bilibili.com/video/BV1zx411d7eC?p11&vd_source109fb20ee1f39e5212cd7a443a0286c5 1, 开发板连接路由器 1.1,烧录无OS UDP例程 1.2,Mini USB连接电脑 1.3,开发板LAN接口连接路由器 2. Ping开发板与电脑之间通信* 2.1 根据…

工智能基础知识总结--什么是RNN

什么是RNN RNN(循环神经网络)是一种用于处理时序数据的特殊结构的神经网络。所谓时序数据,是指句子、语音、股票这类具有时间顺序或者是逻辑顺序的序列数据。 RNN的折叠图和展开图为: RNN的参数为U、W和V三个矩阵,其中U为输出到隐藏层的参数矩阵,W为上一个时刻到当前时刻…

vue3 实现关于 el-table 表格组件的封装以及调用

一、示例图&#xff1a; 二、组件 <template><div class"sn-table" :class"props.colorType 1 ? : bg-scroll"><el-table :data"tableData" :row-class-name"tableRowClassName" height"500" style"…

红外传感器深入解析

引言 宇宙间的任何物体只要其温度超过零度就能产生红外辐射&#xff0c;事实上同可见光一样&#xff0c;其辐射能够进行折射和反射&#xff0c;这样便产生了红外技术&#xff0c;利用红外光探测器因其独有的优越性而得到广泛的重视&#xff0c;并在军事和民用领域得到了广泛…

听GPT 讲Rust源代码--compiler(8)

File: rust/compiler/rustc_trait_selection/src/solve/weak_types.rs 在Rust编译器的源代码中&#xff0c;rust/compiler/rustc_trait_selection/src/solve/weak_types.rs文件的作用是处理弱类型化解决方案。 在编译器中&#xff0c;当我们在代码中使用一个未经完全指定的泛型…

为了搞项目,我差点把京东 “爬“ 了个遍。。

最近在重构我的准备 智慧校园助手2.0 &#xff0c;奈何之前的相关数据放在服务器被小黑子黑了&#xff0c;准备重新搞点数据&#xff0c;借此和大家分享一波我之前做项目没数据该咋搞 &#x1f440;。 Java面试指南 & 大厂学习导航&#xff1a;www.java2top.cn 完整源码获取…

高精度电流源研究内容有哪些

高精度电流源是一种用于产生稳定、准确且可调的电流输出的设备。在电子测试与测量领域中&#xff0c;高精度电流源被广泛应用于校准、精密测量和实验研究等方面。下面安泰电子将介绍高精度电流源的研究内容&#xff0c;帮助大家全面了解其在电子领域中的重要性和应用。 一、性能…

Spring Beans的魔法门:解密多种配置方式【beans 四】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Spring Beans的魔法门&#xff1a;解密多种配置方式【beans 四】 前言XML配置方式1. 声明和配置Bean&#xff1a;2. 构造函数注入&#xff1a;3. 导入其他配置文件&#xff1a; java注解方式1. 使用Co…

Python从入门到网络爬虫(函数详解)

前言 函数是变成语言中最常见的语法&#xff0c;函数的本质就是功能的封装。使用函数可以大大提高编程效率与程序的可读性。函数是能够实现特定功能的计算机代码而已&#xff0c;他是一种特定的代码组结构。 函数的作用 1.提升代码的重复利用率&#xff0c;避免重复开发相同代…

01-线程池项目背景:C++的数据库操作

从0开始学习C与数据库的联动 1.原始方式-使用MySQL Connector/C 提供的API查询 1.1 数据库预操作 我的本地电脑上有mysql数据库&#xff0c;里面预先创建了一个database名叫chat&#xff0c;用户名root&#xff0c;密码password。 1.2 Visual Studio预操作 在Windows上使用…