版本:Unity 6(6000.0)
语言:英语
在URP中初始化BatchRendererGroup对象
使用URP中的BatchRendererGroup API创建批处理

注册网格和材质

MeshUnity的主要图形基元。网格构成了3D世界的很大一部分。Unity支持三角形或四边形多边形网格。必须将Nurbs、Nurms和细分曲面转换为多边形。 详细信息
请参阅 词汇表
Material定义如何渲染曲面的资源。 详细信息
请参阅 词汇表
是Unity中的C#托管对象,也就是说,你不能从Burst C#代码中使用它们。这意味着要用它们在BRG绘制命令,你必须先在BRG中预注册。

要注册Mesh和Material对象,请分别使用BatchRendererGroup.RegisterMeshBatchRendererGroup.RegisterMaterial。这些函数分别返回BatchMeshIDBatchMaterialID,它们是包含Burst兼容句柄的普通数据结构。它们是强类型的,这样可以帮助防止因意外使用错误的句柄类型而产生错误。

你可以在任何时候(包括运行时)注册Mesh和Material对象。唯一的要求是

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

如果不再需要Mesh和Material对象,你还可以取消注册它们。如果你要卸载任何Mesh或Material对象,这是必需的。 BatchRendererGroup.Dispose会自动取消注册所有已注册的资源。

注意:不能序列化 BatchMeshID 或 BatchMaterialID。它们只与注册它们的 BatchRendererGroup 有效,如果您取消注册它们,或者 BatchRendererGroup 不再存在,它们将变为无效。如果某些内容强制 Unity 卸载网格或材质对象,也会使 BatchMeshID 和 BatchMaterialID 失效,这种情况发生在 Unity 卸载包含网格或材质对象的场景一个场景包含游戏的环境和菜单。设想每个独特的场景文件作为一个不同的关卡。在每个场景中,您可以放置自己的环境、障碍物和装饰品,基本以碎片式设计和构建自己的游戏。更多信息
参见Glossary
时。

可以多次注册相同的网格或材质对象。在您想要注册网格或材质,但不知道已经注册了哪些网格和材质的情况下,此功能很有用。在此情况下,BatchRenderer 会按照以下方式内部记录注册次数

  • 每次注册网格或材质对象时,BatchRendererGroup 会将引用计数增加 1。
  • 每次取消注册网格或材质对象时,BatchRendererGroup 会将引用计数减少 1。如果这会导致引用计数达到 0,BatchRendererGroup 会取消注册网格或材质。如果您希望在将来的绘图命令中使用该网格或材质对象,则必须重新注册它。
  • 使用已经注册的网格或材质对象进行的 RegisterMesh 或 RegisterMaterial 调用会返回与前一次调用相同的 BatchMeshID 或 BatchMaterialID。但是,如果 BatchRendererGroup 已完全取消注册该网格或材质,则再次注册它可能会返回不同的 ID。

注意:BRG 会在一个帧中的第一个 OnPerformCulling 回调方法后检查网格或材质对象是否修改。这意味着 Unity 会将修改发生的时间计算在内。这包括您在第一个回调自身中进行的更改,但不包括在回调中安排作业时发生的更改。在此时间之后修改网格或材质对象会导致未定义的行为。

请参阅下面的代码示例,了解如何使用 BatchRendererGroup 对象注册网格和材质。此代码示例基于Initializing a BatchRendererGroup object中的示例。

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 使用称为“批次”的概念。有关更多信息,请参阅下一主题Creating batches

在URP中初始化BatchRendererGroup对象
使用URP中的BatchRendererGroup API创建批处理