Skinning 类型 | 优势 |
---|---|
CPU Skinning | 各平台类似稳定 |
无 CPU/GPU 传输损耗 | |
---- | ---- |
GPU Skinning | 多核并行计算 |
访存速度更快 | |
浮点运算能力更高 |
目前 Unity 拥有一套 GPU Skinning 的流程,经过勾选 Project Setting 中的 GPU Skinning 选项便可。在 GPU 要支持 Texture Float 格式( Sample2D_float )下,经过 Skinning Mesh Renderer 进行 Transform feedback 结合 Geometry Shader 对 Vertex Buffer 重写来实现。html
Skinning 类型 | 优势 |
---|---|
Unity GPU Skinning | 须要 OpenGL ES 3.0 |
CPU 计算骨骼信息 | |
GPU 蒙皮 | |
支持 Unity 原生工具链 | |
---- | ---- |
自定义 GPU Skinning | 须要 OpenGL ES 2.0 |
不须要计算骨骼信息 | |
GPU 蒙皮 |
总的来讲,GPU Skinning 分红两部分:工具
第一部分经过离线采样过程,把对应骨骼信息和动画矩阵烘焙在一张 Texture 上性能
第二部分经过运行蒙皮过程,经过 Shader 实时计算顶点坐标。动画
(1)离线采样过程3d
GPU Skinning Samplerorm
其中 GPU Skinning Animation 数据比较复杂,包含骨骼信息和动画矩阵。htm
仔细观察,以前介绍 Texture 上已经存在骨骼信息和动画矩阵,这里 Animation 包括多余动画矩阵数据,主要是为了实如今 CPU 端获取骨骼点实时位置,用于实现相似特效挂点之类。对象
(2)运行蒙皮过程blog
在 GPU 端获取当前动画帧和 Texture 上的动画矩阵来计算顶点坐标。排序
使用少许 DrawCall 一次性绘制大量相同 Mesh 且具备不一样参数的对象。
Instance 接口 | 优势 |
---|---|
DrawMesh | 简单 |
---- | ---- |
DrawMeshInstanced | 材质改变时候能够合批 |
深度排序时候能够合批 | |
一次最多绘制 1023 个 |
MaterialPropertyBlock 相对于修改 Material.SetXXX 性能更优,并经过避免调用 Renderer.material 致使产生新 Material,从而节省内存。
实现 Instance 一般须要三个步骤:
UNITY_INSTANCING_BUFFER_START(name)
UNITY_DEFINE_INSTANCED_PROP(float4, _Property)
UNITY_INSTANCING_BUFFER_END(name)
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_SETUP_INSTANCE_ID(v)
UNITY_ACCESS_INSTANCED_PROP(name, property)