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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/14624.html
標籤:其他
