SRPBatcher和GPUInstance¶
GPU Instancing(unity内置渲染管线)¶
GPU Instancing是对相同mesh的多份实例进行处理,例如树和草等
instanceID:语义SV_InstanceID,类型uint,实例对应的数组索引。当启用实例化时,我们现在可以访问顶点程序中的实例 ID。有了它,我们可以在变换顶点位置时使用正确的矩阵。但是,UnityObjectToClipPos没有矩阵参数。它总是使用unity_ObjectToWorld. 为了解决这个问题,UnityInstancing包含unity_ObjectToWorld使用矩阵数组的宏覆盖文件。这可以被认为是一个肮脏的宏黑客,但它无需更改现有着色器代码即可工作,从而确保向后兼容性。(在使用实例化渲染调用时,gl_InstanceID会从0开始,在每个实例被渲染时递增1。比如说,我们正在渲染第43个实例,那么顶点着色器中它的gl_InstanceID将会是42。因为每个实例都有唯一的ID,我们可以建立一个数组,将ID与位置值对应起来,将每个实例放置在世界的不同位置。)
教程:(Jasper Flick) GPU Instancing
Jasper Flick详细说明了原理及lod_fade对GPU Instancing的支持
简要概括:cpu将相同mesh的物体相且相同材质球每次次最大化数量提交到GPU,额外增加untiy_ObjectToWorld[]数组,及不同的颜色数组(如果有),顶点属性(instanceID)等等信息,减少了SetPassCall,实际GPU的DrawCall没有减少。
条件: - 相同mesh的物体 - 相同材质球 (可以使用共享材质球)
支持使用MaterialPropertyBlock修改
SRP Batcher(SRP 自定义渲染管线)¶
教程:(Jasper Flick)SRP Batcher
这里教程说明了SRP Batcher在2.1节,GPU Instancing(SRP渲染管线) 在2.3节
将属性写在 UnityPerMaterial 和 UnityPerDraw 中
条件: - 相同Shader(允许不同材质球,不同mesh) - 相同Shader的Keywords(变体) - 对象不可以是粒子或蒙皮网格 - 位置不相邻且中间夹杂不同的Shader或不同的变体的其他物体,不会同批处理(可以调整Queue来避免该情况)
不支持使用 ~~MaterialPropertyBlock~~ 修改,使用 MaterialPropertyBlock 对属性进行更改之后,不再合并,然后转到GPUIn stancing,如果支持的话。
SRP Batcher & GPU instancing的不同点和相同点¶
优先级顺序: SRP Batcher > Static Batching > GPU Instancing > Dynamic Batching
| - | Static Batching | Dynamic Batching | GPU Instancing | SRP Batcher |
|---|---|---|---|---|
| 优点 | 限制少 | 自动无需处理 | 性能极好 | 多材质加速 |
| 缺点 | 增加包体大小 增加运行时内存 |
增加运行时CPU消耗 限制多 |
限制多 | 只能用于SRP中 |
| 适用场景 | 静态场景不适合大量重复物体 |
小物体、特效等 | 大量重复物体 | 较为广泛 |
参考:https://www.jianshu.com/p/f2a7e9ed9b89
(Unity Doc) GPU Instancing (Unity Doc) SRP Batcher