To render to the screen, BatchRendererGroup (BRG) generates draw commands which are a BRG-specific concept that contains everything Unity needs to efficiently create optimized, instanced draw calls.
To determine when to render the instances in a draw command, BRG uses filter settings. Filter settings control when to render instances themselves, but also when to render certain facets of each instance such as its shadows and motion vectors
Because the same filter settings can often apply to a large number of draw commands, BRG uses draw ranges to apply filter settings to a range of draw commands. A draw range combines a contiguous number of draw commands with an instance of filter settings that apply to them. Draw ranges are especially useful if the filter settings determine that Unity shouldn’t render the draw commands, because this makes it possible for Unity to efficiently skip rendering for every draw command in the range.
There is no restriction on which instances are in which draw calls. It’s possible to render the same instance, an object with the same instance index and batchID, many times with different meshes and materials. One example where this can be useful is drawing different sub-meshes with different materials, but using the same instance indices to share properties like transform matrices between the draws.
For information on how to create a renderer with BRG, see Creating a renderer with BatchRendererGroup.
In most cases, Unity renders a draw command as a single, platform-level, instanced draw call for each compatible DrawRenderers call in the Scriptable Render Pipeline. However, that isn’t possible when the graphics API has a lower size limit for draw calls than the draw command’s visibleCount
. In these situations, Unity splits the draw command into multiple instanced draw calls.