Зарегистрировать меши и материалы с BatchRendererGroup API в URP
Mesh и Material являются управляемыми объектами C# в Unity, что означает, что вы не можете использовать их из Burst C# кода. Это означает, что для использования их в командах рисования BRG, вы должны предварительно зарегистрироваться в BRG.
Чтобы зарегистрировать объекты Mesh и Material, используйте BatchRendererGroup.RegisterMesh и BatchRendererGroup.RegisterMaterial соответственно. Эти функции возвращают BatchMeshID и BatchMaterialIDсоответственно, которые являются простыми структурами данных, содержащими совместимый с Burst манипулятор. Они сильно типизированы, чтобы предотвратить ошибки от случайного использования неправильного типа манипулятора.
Объекты Mesh и Material можно регистрировать в любое время, включая время выполнения. Единственные требования:
- Вам необходимо зарегистрировать объекты Mesh и Material, прежде чем BatchRendererGroup сможет использовать их для рендеринга.
- Материал должен поддерживать инстанционирование DOTS.
Вы также можете отменить регистрацию объектов Mesh и Material, если они больше не нужны. Это необходимо, если вы хотите выгрузить любые объекты Mesh или Material. BatchRendererGroup.Dispose автоматически отменяет регистрацию всех зарегистрированных ассетов.
Примечание: Вы не можете сериализировать BatchMeshID или BatchMaterialID. Они действительны только с BatchRendererGroup, в котором вы их зарегистрировали, и становятся недействительными, если вы их отмените, или если BatchRendererGroup больше не существует. BatchMeshID и BatchMaterialID также становятся недействительными, если что-то заставляет Unity выгрузить объекты Mesh или Material, что происходит, когда Unity выгружает Scene, частью которого являются объекты Mesh или Material.
Один и тот же объект Mesh или Material можно зарегистрировать несколько раз. Это удобно, когда нужно регистрировать меши и материалы, не отслеживая, какие из них уже зарегистрированы. В этом случае BatchRenderer ведёт внутренний счётчик регистраций так:
- Каждый раз, когда вы регистрируете объект Mesh или Material, BatchRendererGroup увеличивает его количество ссылок на 1.
- Каждый раз, когда вы отменяете регистрацию объекта Сетки или Материала, BatchRendererGroup уменьшает количество его ссылок на 1. Если это приводит к тому, что количество ссылок достигает 0, BatchRendererGroup отменяет регистрацию Сетки или Материала. Если вы хотите использовать Сетку или Материал в будущих командах рисования, вы должны зарегистрировать его снова.
- Вызов RegisterMesh или RegisterMaterial с уже зарегистрированной сеткой или материалом возвращает тот же BatchMeshID или BatchMaterialID, что и предыдущий вызов. Однако, если BatchRendererGroup полностью отрегистрировал сетку или материал, то при повторной регистрации может быть возвращен другой ID.
Примечание: BRG проверяет изменения объектов Mesh или Material после первого метода обратного вызова OnPerformCulling в кадре. Это означает, что Unity учитывает любые изменения, которые произошли до этой точки. Это включает изменения, которые вы сделали в самом первом обратном вызове, но не изменения, которые произошли в любых заданиях, запланированных обратным вызовом. Изменение объектов Mesh или Material после этой точки вызывает неопределенное поведение.
См. следующий пример кода для примера регистрации мешей и материалов с помощью объекта 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 использует концепцию, называемую пакетами. Дополнительные сведения см. в следующем разделе, Создание пакетов.