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

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM