游戏开发30课 cocoscreator骨骼贴图布局设置

news2024/12/28 21:13:21

骨骼贴图布局设置

要确保 骨骼动画 也能够完全正确地参与 动态 Instancing,需要用户手动指定每张骨骼贴图的数据分配方式。

比如一个场景中要绘制大量相同的人物角色,每个角色可能在走/跳/攻击。如果希望一个 Drawcall 就能够正确完成所有角色的绘制,一个重要的前提条件是 这三个动画(走、跳、攻击)的数据都储存在同一张骨骼贴图内

目前在默认的 预烘焙骨骼动画模式 下,骨骼贴图已经做到全局自动复用,但每张贴图的大小和它们各储存哪些动画是不可预知的。如果不做任何处理直接开启蒙皮模型的 instancing 的话,最终的运行时效果可能会出现有的动画效果正确,有的动画效果完全错乱,并且完全无法预测。

因此我们在编辑器菜单栏 面板 -> 动画 中增加了 骨骼贴图布局设置 面板,用于手动指定每张骨骼贴图中要存储哪些骨骼的哪些动画信息。

注意:骨骼贴图布局设置面板提供的,本质上是运行时的 内存分配指导规则。对于指定的骨骼和动画资源,会保证按照指定规则分配。但如果运行时用到了并未指定规则的资源,还是会回到全局复用的自动分配模式上去。

骨骼贴图布局设置

下面我们以范例工程 show-cases 中的 instanced-skinning 场景(GitHub | Gitee)为例,来看一下骨骼贴图布局具体的设置流程以及实际效果。

下图中展示了一个示例场景,有多个来自同一模型的实例,同时播放完全不同的动画。这些模型使用实时计算动画模式,并没有开启 instancing。可以看到,当前场景加上 UI,总 Drawcall 为 60,instance 计数为 0。这个状态将作为后面改动的基础,以对照使用。

 

要创建开启 instancing 版本的模型,需要以下步骤:

  1. 在 属性检查器 中,勾选骨骼动画组件 (SkeletalAnimation) 中的 UseBakedAnimation 属性(使用预烘焙动画模式)

  2. 对所有蒙皮模型 (SkinningModel) 使用的材质,勾选 USE INSTANCING

在我们的示例场景中实际是制作了两套 Prefab,并在开启 instancing 的版本中将材质漫反射颜色设为蓝色,以便同时观察和区分两套系统的表现。可以看到效果已完全正确,并且只用了 5 个 Drawcall(每个模型分为 5 个部分),instance 数量为 45。

 

注意:这里能够正确渲染所有模型的原因是,动画数据量相对还比较小,通用的骨骼贴图全局复用逻辑就已经把所有动画数据写入了同一张贴图,因此效果是正确的。但随时可能加入的新动画如果超出了默认骨骼贴图的大小(360 * 360),动画效果就一定会出问题,这也就是为什么骨骼贴图布局面板必须存在的原因。

骨骼贴图布局效果

出于展示目的,我们可以在 骨骼贴图布局设置 面板故意将每个动画都单独放到一张贴图上,看看最后的渲染效果。

首先,打开 骨骼贴图布局设置 面板:

面板中三个 + 的用法如下:

  • ① — 用于增加 Texture 单元,一个 Texture 单元由多个 Skeleton 单元组成。
  • ② — 用于增加 Skeleton 单元,一个 Skeleton 单元由一个 Skeleton 资源和一至多个 AnimationClip 资源组成。
  • ③ — 用于增加 AnimationClip 资源槽。

这里我们将 9 个不同的动画分开放在 9 个 Texture 单元内:

重新运行场景,效果变为:

 

可以看到此时动画效果出现了问题,所有动画都变成了执行 attack 动作,并且不时地出现模型消失的问题。这背后的原因可以精确地分析清楚:

  • 每个 Drawcall 绘制 9 个实例,分别在播 9 个不同的动画。
  • 但骨骼动画贴图每个 Drawcall 只能用一张,这里明显使用了 Texture 单元 0,只有一个 attack 动画。
  • 而不同动画片段的长度不同,有些长度超过 attack 片段,那么在最后一段时间便会读到 Texture 单元 0 的有效区域之外,这里的数据并未定义(一般是默认全 0),不是有效的骨骼变换数据,自然无法正确渲染了。

注意:这里的 9 张贴图上都只有同一个骨骼的动画信息,所以最终效果哪怕贴图已经错了,渲染出来也只是动作错了而已;但如果一张贴图内有多个骨骼的动画信息,同时出现贴图不匹配情况的话,渲染效果就会完全错乱。

对于上面的示例场景,因为这个模型的确需要同时同屏播放这 9 个动画片段,所以正确的骨骼贴图布局设置应该为:

这样就能够 保证 正确渲染了。观察面板上相关数据的变化:

  • Texture 单元 0 总大小为 276 x 276(由算法自动生成的,足够存放指定的所有动画数据的最小尺寸)。
  • 指定的 9 组动画数据占了这张贴图的 94.41%,有 5.59% 的多余空间(这部分空间在运行时并不会参与全局复用)。

另外,贴图尺寸旁的图标颜色表示当前贴图的设备适配情况:

  • 绿色(边长 1024 以下):所有设备都确保有效。
  • 黄色(边长 1024 ~ 2048):某些不支持浮点贴图的移动设备或小游戏平台可能会不支持。
  • 红色(边长 2048 以上):许多移动设备上都不支持。

注意:这里只是在一张贴图上放了一套骨骼的 9 个动画,但只要总大小没有超过设备上限,每张贴图上便可以放 任意多套骨骼 的任意数量动画。通常一张贴图放多套骨骼是更为常见的情况,比如对于 蒙皮模型的平面阴影。

我们继续在场景中增加更多的实例数量,可以看到 Drawcall 数量并不会改变,只有 instance 数量的增加:

 

骨骼贴图布局设置

要确保 骨骼动画 也能够完全正确地参与 动态 Instancing,需要用户手动指定每张骨骼贴图的数据分配方式。

比如一个场景中要绘制大量相同的人物角色,每个角色可能在走/跳/攻击。如果希望一个 Drawcall 就能够正确完成所有角色的绘制,一个重要的前提条件是 这三个动画(走、跳、攻击)的数据都储存在同一张骨骼贴图内

目前在默认的 预烘焙骨骼动画模式 下,骨骼贴图已经做到全局自动复用,但每张贴图的大小和它们各储存哪些动画是不可预知的。如果不做任何处理直接开启蒙皮模型的 instancing 的话,最终的运行时效果可能会出现有的动画效果正确,有的动画效果完全错乱,并且完全无法预测。

因此我们在编辑器菜单栏 面板 -> 动画 中增加了 骨骼贴图布局设置 面板,用于手动指定每张骨骼贴图中要存储哪些骨骼的哪些动画信息。

注意:骨骼贴图布局设置面板提供的,本质上是运行时的 内存分配指导规则。对于指定的骨骼和动画资源,会保证按照指定规则分配。但如果运行时用到了并未指定规则的资源,还是会回到全局复用的自动分配模式上去。

骨骼贴图布局设置

下面我们以范例工程 show-cases 中的 instanced-skinning 场景(GitHub | Gitee)为例,来看一下骨骼贴图布局具体的设置流程以及实际效果。

下图中展示了一个示例场景,有多个来自同一模型的实例,同时播放完全不同的动画。这些模型使用实时计算动画模式,并没有开启 instancing。可以看到,当前场景加上 UI,总 Drawcall 为 60,instance 计数为 0。这个状态将作为后面改动的基础,以对照使用。

要创建开启 instancing 版本的模型,需要以下步骤:

  1. 在 属性检查器 中,勾选骨骼动画组件 (SkeletalAnimation) 中的 UseBakedAnimation 属性(使用预烘焙动画模式)

  2. 对所有蒙皮模型 (SkinningModel) 使用的材质,勾选 USE INSTANCING

在我们的示例场景中实际是制作了两套 Prefab,并在开启 instancing 的版本中将材质漫反射颜色设为蓝色,以便同时观察和区分两套系统的表现。可以看到效果已完全正确,并且只用了 5 个 Drawcall(每个模型分为 5 个部分),instance 数量为 45。

注意:这里能够正确渲染所有模型的原因是,动画数据量相对还比较小,通用的骨骼贴图全局复用逻辑就已经把所有动画数据写入了同一张贴图,因此效果是正确的。但随时可能加入的新动画如果超出了默认骨骼贴图的大小(360 * 360),动画效果就一定会出问题,这也就是为什么骨骼贴图布局面板必须存在的原因。

骨骼贴图布局效果

出于展示目的,我们可以在 骨骼贴图布局设置 面板故意将每个动画都单独放到一张贴图上,看看最后的渲染效果。

首先,打开 骨骼贴图布局设置 面板:

面板中三个 + 的用法如下:

  • ① — 用于增加 Texture 单元,一个 Texture 单元由多个 Skeleton 单元组成。
  • ② — 用于增加 Skeleton 单元,一个 Skeleton 单元由一个 Skeleton 资源和一至多个 AnimationClip 资源组成。
  • ③ — 用于增加 AnimationClip 资源槽。

这里我们将 9 个不同的动画分开放在 9 个 Texture 单元内:

重新运行场景,效果变为:

 

可以看到此时动画效果出现了问题,所有动画都变成了执行 attack 动作,并且不时地出现模型消失的问题。这背后的原因可以精确地分析清楚:

  • 每个 Drawcall 绘制 9 个实例,分别在播 9 个不同的动画。
  • 但骨骼动画贴图每个 Drawcall 只能用一张,这里明显使用了 Texture 单元 0,只有一个 attack 动画。
  • 而不同动画片段的长度不同,有些长度超过 attack 片段,那么在最后一段时间便会读到 Texture 单元 0 的有效区域之外,这里的数据并未定义(一般是默认全 0),不是有效的骨骼变换数据,自然无法正确渲染了。

注意:这里的 9 张贴图上都只有同一个骨骼的动画信息,所以最终效果哪怕贴图已经错了,渲染出来也只是动作错了而已;但如果一张贴图内有多个骨骼的动画信息,同时出现贴图不匹配情况的话,渲染效果就会完全错乱。

对于上面的示例场景,因为这个模型的确需要同时同屏播放这 9 个动画片段,所以正确的骨骼贴图布局设置应该为:

这样就能够 保证 正确渲染了。观察面板上相关数据的变化:

  • Texture 单元 0 总大小为 276 x 276(由算法自动生成的,足够存放指定的所有动画数据的最小尺寸)。
  • 指定的 9 组动画数据占了这张贴图的 94.41%,有 5.59% 的多余空间(这部分空间在运行时并不会参与全局复用)。

另外,贴图尺寸旁的图标颜色表示当前贴图的设备适配情况:

  • 绿色(边长 1024 以下):所有设备都确保有效。
  • 黄色(边长 1024 ~ 2048):某些不支持浮点贴图的移动设备或小游戏平台可能会不支持。
  • 红色(边长 2048 以上):许多移动设备上都不支持。

注意:这里只是在一张贴图上放了一套骨骼的 9 个动画,但只要总大小没有超过设备上限,每张贴图上便可以放 任意多套骨骼 的任意数量动画。通常一张贴图放多套骨骼是更为常见的情况,比如对于 蒙皮模型的平面阴影。

我们继续在场景中增加更多的实例数量,可以看到 Drawcall 数量并不会改变,只有 instance 数量的增加:

 

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

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

相关文章

【金万维】使用天联高级版登录用友U8+,进行凭证打印操作。

【操作步骤】 通过“天联高级版客户端”登录 U8,打印凭证步骤: 第一步:首先查看一下天联高级版客户端的打印参数是否如下图所示。 (一般软件初次安装后,默认即可。) 第二步:进入U8后&#xff0…

闭坑1:Django “TemplateDoesNotExist at /index/“解决/Django加载HTML出错

网上很多方法说是settings.py 的配置TEMPLATES中 DIRS: [], 未填写,事实上好多教程会改为路径 DIRS: [ os.path.join(BASE_DIR,"templates/") ], 看下BASE_DIR的定义: import os BASE_DIR os.path.dirname(os.path.dir…

见证云力量|飞马网技术沙龙“云计算专场”圆满结束

2022年11月26日下午,光环国际联合元宇宙教育实验室以在线直播的形式举办了“第322期FMI飞马网技术沙龙活动”。 光环国际成立于2001年,是新三板“科创人才培养第一股”。FMI飞马网技术沙龙作为光环国际旗下重要的沙龙品牌活动,如今已经成为了…

【站内题解】十六道csdn每日一练Python题解

文章目录题目一: 游乐园的门票1. 问题描述2. 输入描述3. 输出描述4. 示例4.1 输入4.2 输出5. 答案5.1 解法一5.2 解法二题目二:小桥流水人家1. 问题描述2. 输入描述3. 输出描述4. 示例4.1 输入4.2 输出5. 答案题目三:小艺读书1. 问题描述2. 输…

前端开发,自定义本地域名解析,更改host,模拟线上环境

最近的一个需求搞得我心力交瘁,需求如下 希望网站 xxx.com 和网站 xxx.cn 统一登录状态,也就是说一个 com 站点登录,需要同步更新 cn 站点的用户,退出登录同理 实现原理是使用 iframe postMessage localstorage,具体…

【数据结构与算法】LinkedList与链表

✨个人主页:bit me ✨当前专栏:数据结构 ✨每日一语:假如困境有解,何须心烦意乱;倘若困境无解,又何须郁郁寡欢。每个人都有两次生命,当你意识到你只有一次生命的时候,你的第二次生命…

艾美捷MTT细胞增殖检测试剂盒测定方案

细胞增殖的测量和监测是任何实验室中必不可少的技术专注于基于细胞的研究。该技能还允许优化细胞培养条件作为细胞因子,生长因子或激素活性的测定。更重要的是,细胞抑制毒理学测试中抗癌化合物的性质,治疗化学品在药物中的功效筛选和细胞介导…

设计模式之迭代器模式(十三)

目录 1. 背景 1.1 学院展示问题 1.2 迭代器模式概述 2. 迭代器模式 2.1 迭代器解决院校展示 2.2 迭代器模式在JDK ArrayList中的应用 1. 背景 1.1 学院展示问题 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系 组成&…

驱动——platform驱动总线三种匹配方式

三种platform驱动匹配方式代码案例以及现象 方式一:通过设置名字进行匹配 相关API简介: 1、platform_device的API ①分配对象 struct platform_device { const char *name;//用于进行匹配的名字 int id;//总线号 PLATFORM_DEVID_AUTO(自…

Java基于springboot+vue的共享电动车管理系统 nodejs

随着在我国国民水平的提高,低碳环保的概念也深入人心,越来越多的人选择了绿色环保的出现方式,共享电动车更是为绿色出行提供了一个有利的保障。通过本人的调查研究发现,很多大学的共享电动车的管理还是用手工传统的方式在进行&…

谷歌翻译用不了的解决方案

1.上 https://ping.chinaz.com/ ping一下translate.google.cn 2.往下拉,根据自己所在地,例如广东深圳,则看看按照响应时间排序,找广东省内的。 3.把响应ip复制,并且本地ping一下看看响应时间 响应时间40ms还能接受 …

redis cluster如何添加和删除节点?

文章目录redis cluster如何增加和删除节点?背景说明添加节点添加 master 节点添加slave节点删除节点删除 master 节点删除slave节点redis cluster如何增加和删除节点? 背景说明 由于虚拟环境有限,目前所采用的集群方案是在 3 台机器去搭建 …

java项目_第166期ssm多人命题系统_java毕业设计_计算机毕业设计

java项目_第166期ssm多人命题系统_java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm多人命题系统》 1、该项目分为3个角色,管理员和、用户、教师。 用户角色可以浏览前台,包含功能有: 首页、学校公告、试题信息、论坛信息 用…

Thread的基本用法

目录 1.创建线程 2.1 继承Thread类,重写run方法 2.2 实现Runnable,重写run方法 2.3 使用匿名内部类继承Thread类,重写run方法 2.4 使用匿名内部类实现Runnable接口,重写run方法 2.5 使用lambda表达式 3.Thread类的构造方法 4.Thread类的常见属性的获取方法 5.线程方法的…

游戏开发28课 cocoscreator 渲染排序说明

渲染排序说明 2D 渲染节点排序 2D 渲染节点可分为在 Canvas 下的节点和不在 Canvas 下的节点两种: 在 Canvas 下的节点可参考下文 UI 节点排序 部分的内容。 不在 Canvas 下的节点,用户可选择通过 自定义材质 来开启深度检测实现和 3D 物体的遮挡显示…

面试中经常被问到的几个回溯问题

前言:大家好,我是小威,24届毕业生,本篇文章是对最近复刷的回溯相关的算法题进行记录,方便复习使用。 如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。 小威在此先感谢各位大佬啦~~&#x1…

马尔可夫预测案例分析

根据已经有数据进行预测的研究方法有很多,包括arima模型、指数平滑法、灰色预测等,本文针对马尔可夫预测进行阐述。比如研究中国移动,中国联通和中国电信三家运营商,他们的用户可以互相携号转网,已经当前3家运营商的市…

开发者友好的Linux常见命令整理

系统本身 uname -a # 查看内核/操作系统/CPU信息 cat /etc/redhat-release 查看服务器版本 cat /proc/cpuinfo # 查看CPU信息 hostname # 查看计算机名 lspci -tv # 列出所有PCI设备 lsusb -tv # 列出所有USB设备 lsmod # 列出加载的内核模块 env # 查看环境变量 查看…

领域驱动设计-领域建模

领域建模 领域建模是针对问题空间的战术求解的过程:观察真实世界的业务需求,对业务知识进行提炼和转换,排除技术因素对建模产生的影响,一切围绕着业务需求而来。同时满足未来的需求变更与产品维护 快速建模法:名次动…

通信原理技术复习重点知识

1.感知控制层通信的目的和特点: 目的:将各种传感设备(数据采集设备以及相关的控制设备)所感知的信息在较短的通信距离内传送到信息汇聚系统,并由该系统传送到网络传输层 特点:传输距离近,传输方…