SRP Batching & GPU Instance

SRP Batching

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

3 个球,一个 Call

使用 MaterialPropertyBlock 对属性进行更改之后,不再合并。
5 个球,5 个 Call

如果在合并过程中插进来一个其他材质的物体,那么会打破合并,下图粉色球是第二种材质,打破了其他三个球的合并。
中间那次 SPR Batch 是粉色球

解决方法一种是将粉色球向前移动或者向后移动,保证它的深度不会在另外三个球之间;第二种是修改任意一个材质的 Queue,让其偏移 1。

GPU Instance

GPU Instance 也可以将属性写在 UnityPerMaterial 中,并且 SRP Batching 优先级比 GPU Instance 高,所以如果没有通过 MaterialPropertyBlock 修改属性的话,会优先使用 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容