Version: 6000.3
语言: 中文
在 URP 中初始化 BatchRendererGroup 对象
在 URP 中使用 BatchRendererGroup API 创建批处理

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

网格Unity 的主要图形原语。网格体构成了 3D 世界的很大一部分。Unity 支持三角或四边形多边形网格。Nurbs、Nurms、Subdiv 曲面必须转换为多边形。更多信息
请参阅术语表
材质(Material)定义表面应如何渲染的资产。更多信息
请参阅术语表
是 Unity 中的托管 C# 对象,这意味着您无法在 Burst C# 代码中使用它们。这意味着要在 BRG 绘制命令中使用它们,您必须在 BRG 中预先注册。

要注册网格体和材质对象,请分别使用 BatchRendererGroup.RegisterMeshBatchRendererGroup.RegisterMaterial。这些函数分别返回 BatchMeshIDBatchMaterialID,它们是包含与 Burst 兼容句柄的纯数据结构。它们采用强类型,以帮助防止意外使用错误的句柄类型而出现错误。

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

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

如果不再需要网格体和材质对象,还可以取消注册它们。如果要卸载任何网格体或材质对象,则需要这样做。BatchRendererGroup.Dispose 会自动注销所有已注册的资产。

注意:您无法序列化 BatchMeshID 或 BatchMaterialID。它们仅对注册它们的 BatchRendererGroup 有效,如果取消注册它们或 BatchRendererGroup 不再存在,它们将失效。如果某些内容强制 Unity 卸载网格体或材质对象,则 BatchMeshID 和 BatchMaterialID 也会失效,当 Unity 卸载场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
网格体或材质对象所属的对象。

可以多次注册同一个网格体或材质对象。这在你想注册网格体或材质而不必知道哪些网格体和材质已经注册的情况下非常有用。在这种情况下,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 创建批处理