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

文章目录

  • 前言
  • 一、一般序列帧动画是按照序列图如下顺序读取的
  • 二、在Shader找到UV流动的起始点
    • 1、先实现纹理采样
    • 2、得到 uv 走格的单位格子大小
    • 3、定位到左上角为起始单位格
  • 三、使UV流动的起始点通用化
    • 1、在属性面板接收 行 和 列的属性
    • 2、看图片可以总结出第一个单元格的公式
    • 3、我们选几个不同的序列图看看效果
  • 四、测试代码


前言

我们在Shader中实现序列帧动画。可以实现一些简单特效或动画节省性能用。

我们在这篇文章中,实现一下UV流动的通用起始点。


一、一般序列帧动画是按照序列图如下顺序读取的

  • 先左到右,再从上到下
    在这里插入图片描述

二、在Shader找到UV流动的起始点

1、先实现纹理采样

  • Unity中 URP Shader 的纹理与采样器的分离定义

  • 属性面板

_MainTex(“MainTex”,2D) = “white”{}

  • 定义纹理

TEXTURE2D(_MainTex);

  • 定义采样器

SAMPLER(sampler_MainTex);

  • 在片元着色器进行纹理采样

float4 mainTex = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.uv);

2、得到 uv 走格的单位格子大小

  • m ∗ n m * n mn 的序列帧图,就对UV除以多少,来得到一个格子的图像
    u m 和 v n \frac{u}{m} 和 \frac{v}{n} munv
  • 比如说,我们使用如下 4 x 4 的序列帧来测试
    在这里插入图片描述
    就对 uv 分别除以4得到一个序列图的大小

o.uv = float2(v.uv.x/4,v.uv.y/4);

在这里插入图片描述

3、定位到左上角为起始单位格

  • 可以看出,我们的 u 方向以及在起始位置了,但是 v 方向却在最后一列
  • 所以,我们需要加上 n - 1 个单位格大小,使 v 方向上达到第一行

o.uv = float2(v.uv.x/4,v.uv.y/4 + 0.75);

在这里插入图片描述


三、使UV流动的起始点通用化

1、在属性面板接收 行 和 列的属性

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

2、看图片可以总结出第一个单元格的公式

  • u v . x = u v . x C o l u m n uv.x = \frac{uv.x}{Column} uv.x=Columnuv.x
  • u v . y = u v . y R o w + R o w − 1 R o w uv.y = \frac{uv.y}{Row}+\frac{Row-1}{Row} uv.y=Rowuv.y+RowRow1

o.uv = float2(v.uv.x/_Sequence.y,v.uv.y/_Sequence.x + (_Sequence.x - 1)/_Sequence.x);

3、我们选几个不同的序列图看看效果

  • 4x3
    在这里插入图片描述

  • 4x4
    在这里插入图片描述


四、测试代码

Shader "MyShader/URP/P3_9"
{Properties{_Color("Color",Color) = (1,1,1,1)_MainTex("MainTex",2D) = "white"{}_Sequence("Row(X) Column(Y)",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 = 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.mzph.cn/news/598128.shtml

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

相关文章

Kotlin/JS工程构建及编译运行到浏览器

概述 Kotlin/JS 提供了转换 Kotlin 代码、Kotlin 标准库的能力,并且兼容 JavaScript 的任何依赖项。Kotlin/JS 的当前实现以 ES5 为目标。 使用 Kotlin/JS 的推荐方法是通过 kotlin.multiplatform Gradle 插件。它提供了一种集中且便捷的方式来设置与控制以 JavaS…

请求头类型content-type配置

类型 // 1 默认的格式请求体中的数据会以json字符串的形式发送到后端Content-Type: application/json // 2 请求体中的数据会以普通表单形式(键值对)发送到后端Content-Type: application/x-www-form-urlencoded // 3 它会将请求体的数据处理为一条消息…

华为DriveONE电机控制器拆解实拍

如果说之前的问界M5、M7,华为让我们看到其在智能化上确实拥有遥遥领先的能力,那么在智界S7上,则让我们看到华为在动力、底盘这些硬件执行层面,竟然也有不输给很多车企的实力。1、华为电驱,全球第一?在智界S…

8K超高清应用:输电线网智慧巡检提升巡视效率

电力安全关系国计民生,是国家安全的重要保障,因此确保电力线路系统的安全运行至关重要。电力线路系统整体分为三大板块:输电线路、变电站和配电线路。然而,由于自然灾害、人为破坏等因素影响,这三大板块的设备很容易发…

队列:通过链表方式实现

#include <stdio.h> #include <stdlib.h>#define maxsize 5 typedef struct LinkNode {int data;struct LinkNode *next; } LinkNode;typedef struct {LinkNode *front, *rear;//链表头&#xff0c;链表尾 } LinkQueue;void initQueue(LinkQueue &q) {q.front …

开启Hyper-V

开启Hyper-V 为了给windows-ltsc激活&#xff0c;只好给系统装个虚拟机服务器。VMware太大了&#xff0c;于是想起Hyper-V。 走起。 在搜索栏直接搜索“windows功能”就能找到“开启或关闭windows功能”&#xff0c;直接勾选Hyper-V&#xff0c;就能安装了。重启后&#xff0c;…

不同阶数的巴特沃斯低通滤波器的空间域表示——数字图像处理

原理 巴特沃斯低通滤波器&#xff08;Butterworth Low-Pass Filter&#xff09;在频率域中的定义是明确的&#xff0c;但它在空间域中的表示不是直观的。这是因为巴特沃斯滤波器的形式是基于频率的&#xff0c;并且其空间域表示涉及到一个复杂的逆傅里叶变换&#xff0c;该变换…

透明展示柜的安装方法

透明展示柜的安装方法主要包括以下步骤&#xff1a; 准备工具和材料&#xff1a;在安装前&#xff0c;需要准备相应的工具和材料&#xff0c;如螺丝刀、电钻、固定架、玻璃板、胶水等。 确定安装位置&#xff1a;选择一个合适的安装位置&#xff0c;确保展示柜的摆放位置合理&…

关于“Python”的核心知识点整理大全62

目录 20.2.2 安装 Heroku Toolbelt 20.2.3 安装必要的包 注意 20.2.4 创建包含包列表的文件 requirements.txt requirements.txt requirements.txt 注意 20.2.5 指定 Python 版本 runtime.txt 注意 20.2.6 为部署到 Herohu 而修改 settings.py settings.py 20.2.7…

SparkStreaming基础解析(四)

1、 Spark Streaming概述 1.1 Spark Streaming是什么 Spark Streaming用于流式数据的处理。Spark Streaming支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、Flume、Twitter、ZeroMQ和简单的TCP套接字等等。数据输入后可以用Spark的高度抽象原语如&#xff1a;map、…

鸿蒙南向开发—OpenHarmony技术编译构建框架

概述 OpenHarmony编译子系统是以GN和Ninja构建为基座&#xff0c;对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统&#xff0c;该系统提供以下基本功能&#xff1a; 以部件为最小粒度拼装产品和独立编译。支持轻量、小型、标准三种系…

竞赛保研 基于机器视觉的行人口罩佩戴检测

简介 2020新冠爆发以来&#xff0c;疫情牵动着全国人民的心&#xff0c;一线医护工作者在最前线抗击疫情的同时&#xff0c;我们也可以看到很多科技行业和人工智能领域的从业者&#xff0c;也在贡献着他们的力量。近些天来&#xff0c;旷视、商汤、海康、百度都多家科技公司研…

思科常用图标大全Cisco产品图标库Icon(附PPT下载)

华为企业网络常用图标大全&#xff08;附PPT下载&#xff09;-CSDN博客文章浏览阅读2.8k次。PPT完整版获取交换机&WLAN服务器网络&网管建筑公共终端end_华为企业网络常用图标大全https://blog.csdn.net/XMWS_IT/article/details/120864637?ops_request_misc%257B%2522…

Windows安装多个Tomcat部署项目

前言 在实际生产环境中&#xff0c;经常会有一个tomcat部署多个应用程序的场景&#xff0c;但多个项目应用同一个基础框架时&#xff0c;会出现某些文件路径相同的情况导致管理混乱&#xff08;例如附件&#xff0c;日志&#xff0c;缓存文件&#xff09;&#xff0c;并且更新…

OpenAI ChatGPT-4开发笔记2024-03:Chat之Function Calling/Function/Tool/Tool_Choice

Updates on Function Calling were a major highlight at OpenAI DevDay. In another world,原来的function call都不再正常工作了&#xff0c;必须全部重写。 function和function call全部由tool和tool_choice取代。2023年11月之前关于function call的代码都准备翘翘。 干嘛…

【Java EE初阶八】多线程案例(计时器模型)

1. java标准库的计时器 1.1 关于计时器 计时器类似闹钟&#xff0c;有定时的功能&#xff0c;其主要是到时间就会执行某一操作&#xff0c;即可以指定时间&#xff0c;去执行某一逻辑&#xff08;某一代码&#xff09;。 1.2 计时器的简单介绍 在java标准库中&#xff0c;提供…

web前端之web前端

MENU web前端之原生实现分时函数、分时间段渲染页面&#xff0c;而不是等到所有操作都执行结束才渲染页面、提高用户体验web前端之原生实现树形目录结构、一维数组生成多维数组、无限级菜单目录 web前端之原生实现分时函数、分时间段渲染页面&#xff0c;而不是等到所有操作都执…

JS 文件导出,jszip多文件压缩导出

文章目录 JS 文件导出&#xff0c;jszip压缩导出1、单个文件导出2、压缩导出3、axios请求通过地址获取Blob源数据 JS 文件导出&#xff0c;jszip压缩导出 1、单个文件导出 let urlhttp://~.png // 可直接访问地址 // 当源数据为blob时 // url window.URL.createObjectURL(bl…

已经在datagrip或navicate等数据库管理工具连接上了mysql8.0,但是现在忘记了,怎么快速重置密码

直接在datagrip的查询终端中&#xff0c;执行这条sql&#xff0c;其中123456为你的新密码。 ALTER USER rootlocalhost IDENTIFIED BY 123456;

新手可理解的PyTorch线性层解析:神经网络的构建基石

目录 torch.nn子模块Linear Layers详解 nn.Identity Identity 类描述 Identity 类的功能和作用 Identity 类的参数 形状 示例代码 nn.Linear Linear 类描述 Linear 类的功能和作用 Linear 类的参数 形状 变量 示例代码 nn.Bilinear Bilinear 类的功能和作用 B…