SRP Batching
將屬性寫在 UnityPerMaterial
中,就可以對 相同 材質(zhì)的物體進行 DrawCall 合并。
3 個球,一個 Call
使用
MaterialPropertyBlock
對屬性進行更改之后,不再合并解幼。5 個球,5 個 Call
如果在合并過程中插進來一個其他材質(zhì)的物體包警,那么會打破合并撵摆,下圖粉色球是第二種材質(zhì),打破了其他三個球的合并害晦。
中間那次 SPR Batch 是粉色球
解決方法一種是將粉色球向前移動或者向后移動特铝,保證它的深度不會在另外三個球之間;第二種是修改任意一個材質(zhì)的
Queue
壹瘟,讓其偏移 1鲫剿。
GPU Instance
GPU Instance 也可以將屬性寫在 UnityPerMaterial
中,并且 SRP Batching 優(yōu)先級比 GPU Instance 高稻轨,所以如果沒有通過 MaterialPropertyBlock
修改屬性的話灵莲,會優(yōu)先使用 SRP Batching。如果屬性寫在自定義名稱中殴俱,則不會啟用 SRP Batching政冻。
GPU Instance 有兩種用法。一是直接修改個別物體的屬性粱挡,比如基色赠幕、Cutoff 閾值等俄精,如項目中的 PerObjectWithUnlitShader.cs
询筏。效果如下:
5 個球,1 個 Call
二是使用 Graphics.DrawMeshInstanced
一次性繪制出許多只有些許不同的物體竖慧,如項目中的 DrawMesh.cs
嫌套。效果如下:
512 個球
參考
https://catlikecoding.com/unity/tutorials/custom-srp/draw-calls/
https://docs.unity3d.com/Manual/GPUInstancing.html
Unlit.shader in URP
項目鏈接
https://gitee.com/zhangqrr/CustomRP/tree/master/
image