序列帧动画

游戏画面中之所以能产生动态效果主要的原因是因为 游戏循环 机制,即游戏画面每隔一个固定时间(每一帧)就会重新渲染。游戏运行时,每一帧都会更新屏幕,这种更新频率通常称为 帧率(Frames Per Second,FPS)比如 30 FPS、60 FPS 代表的就是 1秒钟更新30次,1秒钟更新60次

而之所以看起来画面是变化的,是因为我们在每一帧可能都会改变游戏中对象的位置、角度、缩放、颜色等等信息后重新渲染,一般情况下,只要帧率大于24FPS,人眼就认为一帧帧切换着的画面是流畅且连贯的了

利用Shader制作动态效果的关键就是 —— 利用时间变化来改变数据,从而导致渲染结果改变,带来画面变化

时间是关键数据,Shader中提供了对应的内置时间变量

  • float4 _Time:4个分量的值分别是(t / 20, t, 2t, 3t),其中t代表该游戏场景从加载开始缩经过的时间
  • float4 _SinTime:4个分量的值分别是(t / 8, t / 4, t / 2, t), 其中t代表 游戏运行的时间的正弦值
  • float4 _CosTime:4个分量的值分别是(t / 8, t / 4, t / 2, t),其中t代表 游戏运行的时间的余弦值
  • float4 unity_DeltaTime:4个分量的值分别是(dt, 1 / dt, smoothDt, 1 / smoothDt),dt代表帧间隔时间(上一帧到当前帧间隔时间),smoothDt是平滑处理过的时间间隔,对帧间隔时间进行某种平滑算法处理后的结果

一般会利用时间和什么数据一起计算,来达到动态效果呢?

  • 颜色:通过时间控制颜色的变化,比如 渐变、闪烁 等效果
  • 位置:利用时间使顶点在某个方向上移动,比如 波动 等效果
  • 纹理坐标:利用时间变化来动态改变纹理坐标,比如 水流、云彩、序列帧动画 等效果
  • 法线:利用时间动态修改法线方向,比如 风吹草动 等效果
  • 缩放:利用时间改变物体缩放比例,比如 脉动、跳动等效果
  • 透明度:利用时间控制物体透明度,比如 淡入淡出、闪烁等效果

1、序列帧动画原理

关键点:

  • UV坐标范围0~1,原点为图片左下角;
  • 图集序列帧动画播放顺序为从左到右,从上到下

分析问题

  • 如何得到当前应该播放哪一帧动画?
  • 如何将采样规则从0~1修改为在指定范围内采样?

问题解决思路

  • 用内置时间参数 _Time.y 参与计算得到具体哪一帧

时间是不停增长的数值,用它对总帧数取余,便可以循环获取到当前帧数

  • 利用时间得到当前应该绘制哪一帧后

我们只需要确认从当前小图片中,采样开始位置,采样范围即可,采样开始位置,可以利用当前帧和行列一起计算,采样范围可以将0~1范围 缩放转换到 小图范围内

以下图为例

Shader "ShaderProj/8/SequentialFrameAnimation"
{Properties{_MainTex ("Texture", 2D) = "white" {}// 图集行列 _Rows ("Rows", int) = 8_Columns ("Columns", int) = 8_Speed ("Speed", float) = 1}SubShader{// 因为背景是透明的,所以要以透明模式来渲染,并且关掉深度写入Tags { "RenderType"="Transparent" "Queue"="Transparent" "IgnoreProjector" = "True" }Pass{ZWrite OffBlend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;float _Rows;float _Columns;float _Speed;v2f vert (appdata_base v){v2f data;data.vertex = UnityObjectToClipPos(v.vertex);data.uv = v.texcoord;return data;}fixed4 frag (v2f i) : SV_Target{//得到当前帧 利用时间变量计算float frameIndex = floor(_Time.y * _Speed) % (_Rows * _Columns);//小格子(小图片)采样时的起始位置计算//除以对应的行和列 目的是将行列值 转换到 0~1的坐标范围内// 1 - (floor(frameIndex / _Columns) + 1)/_Rows// +1 是因为把格子左上角转换为格子左下角// 1- 因为UV坐标采样时从左下角进行采样的float2 frameUV = float2(frameIndex % _Columns / _Columns, 1 - (floor(frameIndex / _Columns) + 1) / _Rows);//得到uv缩放比例 相当于从0~1大图 隐射到一个 0~1/n的一个小图中float2 size = float2(1 / _Columns, 1 / _Rows);//计算最终的uv采样坐标信息//*size 相当于把0~1范围 缩放到了 0~1/8范围//+frameUV 相当于把起始的采样位置 移动到了 对应帧小格子的起始位置float2 uv = i.uv * size + frameUV;return tex2D(_MainTex, uv);}ENDCG}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode:83. 删除排序链表中的重复元素 II(java) 保留一个重复的

目录 题目描述: 代码: 第一种: 第二种: 题目描述: 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2]示例 2&#xff1a…

Java项目实战II基于spring boot的个人博客系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在信息爆炸的时代,个人博客…

强网杯 2024 pwn false AK

强网杯 2024 pwn 🏄🏽‍♀️前言🏄🏽‍♂️heap(UAF house of banana orw)🏄🏽分析🏄🏽解题🏄🏽exp 🏄🏽‍♂…

shodan进阶-实战案例

导语 一、CVE-2019-0708(3389漏洞) 1. 概要 2. 原理 3. 搜索命令 二、vnc空密码(未授权访问) 1. 概要 2. 原理 3. 搜索命令 三、思科网络设备未授权 1. 概要 2. 原理 3.搜索命令 四、MongoDB 未授权访问 1. 概要 2…

并发编程中的CAS思想

共享变量操作的原子性 分析如下代码片段: // 获取共享变量时,为了保证该变量的可见性,需要使用 volatile 修饰。 static volatile int count 0;public static void add(){count; }public static void main(String[] args) throws Interrup…

占地1.1万平,2亿投资的智能仓储系统:高架库、AGV、码垛机器人……

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 我国调味料市场近年来展现出惊人的增长潜力,各大品牌纷纷加大投入,力求在竞争中脱颖而出。 广东美味鲜调味食品有限公司,作为行业内的佼佼者&#…

激活函数、条件熵和最大熵在机器学习的应用

文章目录 摘要Abstractsigmoid 和 softmaxsigmoid和softmax的关系 条件熵最大熵总结 摘要 本周学习内容探讨了神经网络中激活函数的选择及其对梯度消失问题的影响。通过使用 ReLU 函数替代 Sigmoid 函数来改善梯度消失问题的优化方法,同时分析了 Sigmoid、Softmax …

【MySql】-0.1、Unbunt20.04二进制方式安装Mysql5.7和8.0

1、下载Mysql二进制报(选择Linux的通用版本) mysql官网地址:https://downloads.mysql.com/archives/community/ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.26-linux-glibc2.12-x86_64.tar wget https://downloads.…

全渠道供应链打造中企业定制开发2+1链动模式S2B2C商城小程序的策略与影响

摘要:本文探讨了全渠道供应链打造对于零售企业的重要性及面临的挑战,着重分析了物流环节整合的难点,并以家电行业为例说明了节假日期间物流对企业经营的影响。同时,引入“企业定制开发21链动模式S2B2C商城小程序”这一关键因素&am…

【Python+Pycharm】2024-Python安装配置教程

【PythonPycharm】2024-Python安装配置教程 一、下载装 Python 1、进入Python官网首页,下载最新的Python版本 Download Python | Python.org 选择对应版本下载 安装 测试安装情况 python如果安装失败 在系统环境变量添加安装路径 where pythonwin7安装路径添加…

C++开发者必看:用Flow-IPC改善进程间通信

进程间通信(IPC)对于现代计算环境至关重要,这种机制使得多个处理器核心能够同时执行多个线程。IPC的本意是让不同线程甚至独立程序能够高效地共享数据。例如,当我们在线观看流媒体视频时,可能会有一个线程负责视频解码…

JAVA 插入 JSON 对象到 PostgreSQL

博主主页:【南鸢1.0】 本文专栏:JAVA 目录 ​编辑 简介 所用: 1、 确保 PostgreSQL 数据库支持 JSON: 2、添加 PostgreSQL JDBC 驱动 3、安装和运行 PostgreSQL 4、建立数据库的连接 简介 在现代软件开发中,由于 JSON 数据…

闪存学习_1:Flash-Aware Computing from Jihong Kim

闪存学习_1:Flash-Aware Computing from Jihong Kim 前言一、Storage Media:NAND Flash Memory1、概念2、编程和擦除操作3、读操作4、异地更新操作(Out-Place Update)5、数据可靠性6、闪存控制器(SSD主控)7…

C++STL-deque、stack、queue、priority_queue

C教学总目录 deque、stack、queue、priority_queue 1、deque2、stack使用介绍3、stack实现4、queue使用介绍5、queue实现6、priority_queue使用介绍7、priority_queue实现8、反向迭代器 1、deque deque是双端队列,我们学习的队列是先进先出的(First in first out)&a…

汽车虚拟仿真软件有哪些?行业软件大盘点!

汽车虚拟仿真是指利用计算机技术,根据汽车的设计、制造、测试、运行等各个环节的需求,建立汽车的数学模型和物理模型,通过软件平台进行可视化、动态化、交互式的模拟和分析,从而实现对汽车性能、功能、品质等方面的预测和评估。汽…

【合肥工业大学】操作系统 习题解析 作业答案(仅作学习与交流/侵删)

第一章习题解析 1.设计现代OS的主要目标是什么? 答:(1)有效性 ( 2)方便性 ( 3)可扩充性 ( 4)开放性 2. OS 的作用可表现在哪几个方…

【C++动态规划】2435. 矩阵中和能被 K 整除的路径|1951

本文涉及知识点 C动态规划 LeetCode2435. 矩阵中和能被 K 整除的路径 给你一个下标从 0 开始的 m x n 整数矩阵 grid 和一个整数 k 。你从起点 (0, 0) 出发,每一步只能往 下 或者往 右 ,你想要到达终点 (m - 1, n - 1) 。 请你返回路径和能被 k 整除的…

matlab读取逐日的1km分辨率中国大陆地区的土壤水数据,并汇总至逐月分辨率

1.前言 ESSD一篇文章介绍了逐日的土壤水数据: ESSD - A 1 km daily soil moisture dataset over China using in situ measurement and machine learning 图片来源:Li et al., 2022, ESSD 中国大陆地区的土壤水的数据下载地址: 国家青藏高…

用Pyhon写一款简单的益智类小游戏——2048

文字版——代码及讲解 代码—— import random# 初始化游戏棋盘 def init_board():return [[0] * 4 for _ in range(4)]# 在棋盘上随机生成一个2或4 def add_new_tile(board):empty_cells [(i, j) for i in range(4) for j in range(4) if board[i][j] 0]if empty_cells:i,…

C++类和对象上

1. 类的定义 1.1 类定义格式 • class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。…