SRP Batching
将属性写在 UnityPerMaterial
中,就可以对 相同 材质的物体进行 DrawCall 合并。

使用
MaterialPropertyBlock
对属性进行更改之后,不再合并。
如果在合并过程中插进来一个其他材质的物体,那么会打破合并,下图粉色球是第二种材质,打破了其他三个球的合并。

解决方法一种是将粉色球向前移动或者向后移动,保证它的深度不会在另外三个球之间;第二种是修改任意一个材质的
Queue
,让其偏移 1。
GPU Instance
GPU Instance 也可以将属性写在 UnityPerMaterial
中,并且 SRP Batching 优先级比 GPU Instance 高,所以如果没有通过 MaterialPropertyBlock
修改属性的话,会优先使用 SRP Batching。如果属性写在自定义名称中,则不会启用 SRP Batching。
GPU Instance 有两种用法。一是直接修改个别物体的属性,比如基色、Cutoff 阈值等,如项目中的 PerObjectWithUnlitShader.cs
。效果如下:

二是使用 Graphics.DrawMeshInstanced
一次性绘制出许多只有些许不同的物体,如项目中的 DrawMesh.cs
。效果如下:

参考
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/

网友评论