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 重寫來實現。html

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)離線採樣過程3d

GPU Skinning Samplerorm

  • Animation
  • Mesh
  • Material
  • Texture


其中 GPU Skinning Animation 數據比較複雜,包含骨骼信息和動畫矩陣。htm

仔細觀察,以前介紹 Texture 上已經存在骨骼信息和動畫矩陣,這裏 Animation 包括多餘動畫矩陣數據,主要是爲了實如今 CPU 端獲取骨骼點實時位置,用於實現相似特效掛點之類。對象

(2)運行蒙皮過程blog


在 GPU 端獲取當前動畫幀和 Texture 上的動畫矩陣來計算頂點座標。排序



GPU Instance

使用少許 DrawCall 一次性繪製大量相同 Mesh 且具備不一樣參數的對象。

DrawMesh 與 DrawMeshInstanced 實現方式

Instance 接口 優勢
DrawMesh 簡單
---- ----
DrawMeshInstanced 材質改變時候能夠合批
深度排序時候能夠合批
一次最多繪製 1023 個

MaterialPropertyBlock

MaterialPropertyBlock 相對於修改 Material.SetXXX 性能更優,並經過避免調用 Renderer.material 致使產生新 Material,從而節省內存。

  • 針對 [Per-Renderer-Data]
  • 性能較好
  • 新的 DrawCall

UWA https://blog.uwa4d.com/archives/1983.html

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)

相關文章
相關標籤/搜索