GPU Skinning 结合 Instanced 高效实现大量单位动画
GPU Skinning 与 Instance
蒙皮动画

计算骨骼信息
蒙皮
GPU Skinning
CPU Skinning 与 GPU Skinning 实现方式
| Skinning 类型 | 优点 |
|---|---|
| CPU Skinning | 各平台相似稳定 |
| 无 CPU/GPU 传输损耗 | |
| ---- | ---- |
| GPU Skinning | 多核并行计算 |
| 访存速度更快 | |
| 浮点运算能力更高 |
Unity GPU Skinning 与 自定义 GPU Skinning 实现方式
目前 Unity 拥有一套 GPU Skinning 的流程,通过勾选 Project Setting 中的 GPU Skinning 选项即可。在 GPU 要支持 Texture Float 格式( Sample2D_float )下,通过 Skinning Mesh Renderer 进行 Transform feedback 结合 Geometry Shader 对 Vertex Buffer 重写来实现。

| Skinning 类型 | 优点 |
|---|---|
| Unity GPU Skinning | 需要 OpenGL ES 3.0 |
| CPU 计算骨骼信息 | |
| GPU 蒙皮 | |
| 支持 Unity 原生工具链 | |
| ---- | ---- |
| 自定义 GPU Skinning | 需要 OpenGL ES 2.0 |
| 不需要计算骨骼信息 | |
| GPU 蒙皮 |
自定义 GPU Skinning
总的来说,GPU Skinning 分成两部分:
第一部分通过离线采样过程,把对应骨骼信息和动画矩阵烘焙在一张 Texture 上
第二部分通过运行蒙皮过程,通过 Shader 实时计算顶点坐标。
(1)离线采样过程

GPU Skinning Sampler
- Animation
- Mesh
- Material
- Texture


其中 GPU Skinning Animation 数据比较复杂,包含骨骼信息和动画矩阵。

仔细观察,之前介绍 Texture 上已经存在骨骼信息和动画矩阵,这里 Animation 包括多余动画矩阵数据,主要是为了实现在 CPU 端获取骨骼点实时位置,用于实现类似特效挂点之类。

(2)运行蒙皮过程


在 GPU 端获取当前动画帧和 Texture 上的动画矩阵来计算顶点坐标。



GPU Instance
使用少量 DrawCall 一次性绘制大量相同 Mesh 且具有不同参数的对象。
DrawMesh 与 DrawMeshInstanced 实现方式

| Instance 接口 | 优点 |
|---|---|
| DrawMesh | 简单 |
| ---- | ---- |
| DrawMeshInstanced | 材质改变时候可以合批 |
| 深度排序时候可以合批 | |
| 一次最多绘制 1023 个 |
MaterialPropertyBlock
MaterialPropertyBlock 相对于修改 Material.SetXXX 性能更优,并通过避免调用 Renderer.material 导致产生新 Material,从而节省内存。
- 针对 [Per-Renderer-Data]
- 性能较好
- 新的 DrawCall
Shader
实现 Instance 通常需要三个步骤:
- 定义数据缓冲区
UNITY_INSTANCING_BUFFER_START(name)
UNITY_DEFINE_INSTANCED_PROP(float4, _Property)
UNITY_INSTANCING_BUFFER_END(name)
- 定义 SV_InstanceID
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_SETUP_INSTANCE_ID(v)
- 根据 ID 访问缓冲区数据
UNITY_ACCESS_INSTANCED_PROP(name, property)
GPU Skinning 结合 Instanced 高效实现大量单位动画的更多相关文章
- GPU Skinning不生效问题
1)GPU Skinning不生效问题2)勾选凸包报的警告问题3)Unity 2019 图片压缩格式选择4)Android Export打包对压缩的影响5)Android内存中的Unknown部分泄漏 ...
- CSS动画与GPU
写在前面 满世界的动画性能优化技巧,例如: 只允许改变transform.opacity,其它属性不要动,避免重新计算布局(reflow) 对动画元素应用transform: translate3d( ...
- U3D GPU蒙皮
在U3D中默认情况下是使用CPU蒙皮的,在BUILDING SETTING中的others中可以设置为GPU skinning
- CPU与GPU,我们应该使用哪个?
CPU与GPU,我们应该使用哪个? CPU与GPU CPU即中央处理器,GPU即图形处理器. 两者的相同之处:两者都有总线和外界联系,有自己的缓存体系,以及数字和逻辑运算单元 两者的区别之处:在于存在 ...
- 利用GPU实现大规模动画角色的渲染
0x00 前言 我想很多开发游戏的小伙伴都希望自己的场景内能渲染越多物体越好,甚至是能同时渲染成千上万个有自己动作的游戏角色就更好了. 但不幸的是,渲染和管理大量的游戏对象是以牺牲CPU和GPU性能为 ...
- 利用GPU实现大规模动画角色的渲染(转)
原文: https://www.cnblogs.com/murongxiaopifu/p/7250772.html 利用GPU实现大规模动画角色的渲染 0x00 前言 我想很多开发游戏的小伙伴都希望自 ...
- 3D网页小实验-基于多线程和精灵动画实现RTS式单位行为
一.实验目的: 1.在上一篇的"RTS式单位控制"的基础上添加逻辑线程,为每个单位实现ai计算: 2.用精灵动画为单位的行为显示对应的动作效果. 二.运行效果: 1.场景中的单位分 ...
- 剖析虚幻渲染体系(15)- XR专题
目录 15.1 本篇概述 15.1.1 本篇内容 15.1.2 XR概念 15.1.2.1 VR 15.1.2.2 AR 15.1.2.3 MR 15.1.2.4 XR 15.1.3 XR综述 15. ...
- FPS手游如何脱颖而出?看《CF手游》的性能突破之路
WeTest导读 俗话说:用户体验不谈性能就是耍流氓. 在PC游戏上的性能问题并没有那么明显, 加个内存换个CPU或者刷个主频就能轻松搞定:到了手游时代后情况则显得比较严峻,捉襟见肘的内存使得资源加载 ...
随机推荐
- Java的浅克隆与深克隆
前言 克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据,这样也能实现克隆的目的. 但当对象属性 ...
- Neo4j 快速清除数据库数据
在开发过程中,很多时候需要快(简)速(单)清(粗)除(暴)Neo4j中存在的海量数据节点和关系数据.在这种情况下,delete和detach从性能上都已力不从心.Neo4j官方推荐清库方法,即删除gr ...
- 使用webuploader实现大文件分片上传
文件夹数据库处理逻辑 public class DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject() ...
- NetworkX系列教程(9)-线性代数相关
小书匠 Graph 图论 学过线性代数的都了解矩阵,在矩阵上的文章可做的很多,什么特征矩阵,单位矩阵等.grpah存储可以使用矩阵,比如graph的邻接矩阵,权重矩阵等,这节主要是在等到graph后 ...
- ZROI Day6比赛总结
比赛还没结束而且我没有参加比赛就来这里了. T1 略 T2 设\(ans_d\)表示\(d|b_i\)的方案数(最后反演一下就可以) 设\(d\not|a_i\)的个数为\(l\)(可以\(O(n\l ...
- codeforces524E
题意:n*m的矩阵,给出k个点,Q次询问,问每个矩阵中每个点是否被看管,一个点被看管的定义是那个点所在的行或列有点,n,m<=1e5,k,q<=2e5 sol :发现行和列是独立的,即要么 ...
- vue+elementui 开发的网站IE浏览器加载白屏(不兼容)解决办法
1.需要检查一下 export default { name: 'aa',-------vue的name是不可以重复的-----这个是决定性原因 data() { return {} } 2.变量声明 ...
- Mac 10.14.5系统偏好设置安全性与隐私不展示任何来源解决办法
Mac新系统升级(10.14.5)后未从appstore下载的软件在安装时会提示安装包已损坏之类的东东,这是因为没有打开“设置”—“安全与隐私”中的“任何来源”造成的,可是升级后的10.14.5却没有 ...
- springboot连接redis进行CRUD
springboot连接redis进行CRUD: 1.添加以下依赖: <dependency> <groupId>org.springframework.boot</gr ...
- MQ Cannot convert from [[B] to [] for GenericMessage
MQ消费端转换报错:主要错误信息:Caused by: org.springframework.messaging.converter.MessageConversionException: Cann ...