GPU Instancing 功能與計劃
- 團隊開發重點
- 什麼是 GPU Instancing?
- 一個 draw call 同時繪製多個 geometry 相同物體
- 用途
- 透過減少 draw call 數量降低 CPU,但不能減少 GPU 消耗
- 應用
- 大量相同 Material、Mesh 的物體 (Ex: 植被、太空隕石)
- 渲染方式
- instance data (世界矩陣、顏色等自訂屬性) -> 打包 Uniform Array -> 存入 Instance Constant Buffers -> Shader 讀取
- 限制
- 使用 lightmap 的物體
- 受不同 light probe / reflection probe 影響的物體
- 使用 multi-pass shader 的物體,只有 first pass 可以 instancing
- Forward Rendering 時,受多個光源影響的物體只有 base pass 可以 instancing , add passes 不行
- 受制於 constant buffer 的大小限制 , 一個 instanced draw call 能畫的物體數量是有上限的 (參見 UnityInstancing.cginc 中的 UNITY_MAX_INSTANCE_COUNT)最後需要
- 再次強調的是,Instancing在Shader上有額外的開銷,並不代表一定能提高FPS。永遠要以實際Profiling結果為準!
- 實作方式
- 5.6前 project right -> create instancing shader
- 5.6後 Material setting enable instancing
- New API
- 其他
- 需要 OpenGL ES 3.1+ 手機目前支援度不高
- Material setting enable instancing 時,打包時 shader 參考會被引入,造成打包後大小變大
- 相關參考