動態合批
Dynamic batching的原理也很簡單,在進行場景繪制之前將所有的共享同一材質的模型的頂點信息變換到世界空間中,然后通過一次Draw call繪制多個模型,達到合批的目的。模型頂點變換的操作是由CPU完成的,所以這會帶來一些CPU的性能消耗
GPU Instancing
-
優先級
靜態合批>Instancing>動態合批 -
特征
只能渲染相同的meshes,但是允許每個實例有不同的參數(顏色,scale..) -
與動態和靜態合批的區別
1,GPU Instancing 沒有動態合批那樣對網格數量的限制,也沒有靜態網格那樣需要這么大的內存,它很好的彌補了這兩者的缺陷
2,與動態和靜態合批不同的是,GPU Instancing 並不通過對網格的合並操作來減少Drawcall,GPU Instancing 的處理過程是只提交一個模型網格讓GPU繪制很多個地方,這些不同地方繪制的網格可以對縮放大小,旋轉角度和坐標有不一樣的操作,材質球雖然相同但材質球屬性可以各自有各自的區別。
使用
- 材質球shader支持GPU Instancing
- shader需要添加對應的定義和操作
- 實例的data存在矩陣數組,使用對應的Graphics.DrawMeshInstanced繪制。(CommandBuff再進一步優化,省位置不變時的繪制)
SRP Bathch
SRP Batcher兼容性
1 為了使對象通過SRP Batcher代碼路徑渲染,要注意二個要求:
對象必須處於網格中。對象不可以是粒子或蒙皮網格。
必須使用兼容SRP Batcher的着色器。HDRP和LWRP中的所有Lit Shader受光着色器和Unlit Shader無光照着色器都符合此要求
2 為了讓着色器兼容SRP,需要進行以下處理:
所有內置引擎屬性必須在名為“UnityPerDraw”的CBUFFER中聲明。例如:unity_ObjectToWorld或unity_SHAr。
所有材質屬性必須在名為“UnityPerMaterial”的單個CBUFFER中聲明。
提速效果源於二個方面:
每個材質內容現在都會一直保留在GPU內存中
專用代碼會管理大型“per object” GPU CBUFFER
其他-------
GPUSkinning
思路
迭代
- 動作烘焙到Texture中。
Animation Instancing – Blog
Unity大規模角色的GPU蒙皮動畫表達方式
UWA - GPU Skinning 加速骨骼動畫
《Unity3D高級編程之進階主程》第七章,渲染管線與圖形學(三) - 渲染原理與知識3