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)