Version: Unity 6.0 (6000.0)
语言 : 中文
在 URP 中初始化 BatchRendererGroup 对象
在 URP 中使用 BatchRendererGroup API 创建批次

在 URP 中使用 BatchRendererGroup API 注册网格和材质

网格材质是 Unity 中的托管 C# 对象,这表示您无法从 Burst C# 代码中使用它们。这意味着,要在 BRG 绘制命令中使用它们,必须预先向 BRG 注册。

要注册网格和材质对象,请分别使用 BatchRendererGroup.RegisterMeshBatchRendererGroup.RegisterMaterial。这些函数分别返回 BatchMeshIDBatchMaterialID,它们为包含 Burst 兼容句柄的普通数据结构。它们属于强类型,有助于防止意外使用错误的句柄类型。

可以随时注册网格和材质对象(包括运行时)。唯一的要求是:

  • 必须注册网格和材质对象,然后 BatchRendererGroup 才能使用它们进行渲染。
  • 材质必须支持 DOTS 实例化。

如果不再需要网格和材质对象,也可以取消注册它们。在卸载任何网格或材质对象时,这是必要的操作。BatchRendererGroup.Dispose 会自动取消注册所有已注册的资源。

注意:BatchMeshID 或 BatchMaterialID 无法序列化。它们仅在注册的 BatchRendererGroup 中有效,如果取消注册或 BatchRendererGroup 不再存在,则它们将无效。如果强制 Unity 卸载网格或材质对象(当 Unity 卸载网格或材质对象所属的场景时,就会发生这种情况),BatchMeshID 和 BatchMaterialID 也会无效。

可以多次注册相同的网格或材质对象。这可以让您在注册网格或材质时无需确认哪些网格和材质已被注册。在这种情况下,BatchRenderer 会通过以下方式在内部记录注册数量:

  • 每次注册网格或材质对象时,BatchRendererGroup 都会将其引用计数增加 1。
  • 每次取消注册网格或材质对象时,BatchRendererGroup 都会将其引用计数减少 1。如果这导致引用计数为 0,则 BatchRendererGroup 会取消注册网格或材质。如果要在未来的绘制命令中使用网格或材质,必须再次注册。
  • 具有已注册的网格或材质的 RegisterMesh 或 RegisterMaterial 调用将返回与上次调用相同的 BatchMeshID 或 BatchMaterialID。但是,如果 BatchRendererGroup 完全取消注册了网格或材质,那么再次注册可能会返回不同的 ID。

注意:BRG 会检查在一帧中的第一次 OnPerformCulling 回调之后对网格或材质对象所做出的修改。这意味着 Unity 会考虑在该点之前进行的任何修改。其中包括您在第一次回调中所做的更改,但不包括回调在任何作业中安排的修改。在此点之后修改网格或材质对象会引发未定义行为。

请参阅以下代码示例,了解如何向 BatchRendererGroup 对象注册网格和材质。此代码示例基于初始化 BatchRendererGroup 对象中的示例。

using System;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Jobs;
using UnityEngine;
using UnityEngine.Rendering;

public class SimpleBRGExample : MonoBehaviour
{
    public Mesh mesh;
    public Material material;

    private BatchRendererGroup m_BRG;

    private BatchMeshID m_MeshID;
    private BatchMaterialID m_MaterialID;

    private void Start()
    {
        m_BRG = new BatchRendererGroup(this.OnPerformCulling, IntPtr.Zero);
        m_MeshID = m_BRG.RegisterMesh(mesh);
        m_MaterialID = m_BRG.RegisterMaterial(material);
    }

    private void OnDisable()
    {
        m_BRG.Dispose();
    }

    public unsafe JobHandle OnPerformCulling(
        BatchRendererGroup rendererGroup,
        BatchCullingContext cullingContext,
        BatchCullingOutput cullingOutput,
        IntPtr userContext)
    {
        // This simple example doesn't use jobs, so it can return an empty JobHandle.
        // Performance-sensitive applications should use Burst jobs to implement
        // culling and draw command output. In this case, this function would return a
        // handle that completes when the Burst jobs finish.
        return new JobHandle();
    }
}

在创建任何使用已注册的网格和材质的绘制命令之前,需要提供用于绘制命令实例的数据,例如变换矩阵。为了向每个实例提供要使用的数据,BatchRendererGroup 会使用一种称为“批次”的概念。有关更多信息,请参阅下一个主题:创建批次

在 URP 中初始化 BatchRendererGroup 对象
在 URP 中使用 BatchRendererGroup API 创建批次