Version: 2023.1
언어: 한국어
BatchRendererGroup 오브젝트 초기화
배치 생성

메시 및 머티리얼 등록

메시머티리얼은 Unity에서 관리되는 C# 오브젝트이며 버스트 C# 코드에서는 사용할 수 없습니다.즉, BRG 드로우 커맨드에 사용하려면 BRG에 미리 등록해야 합니다.

메시 및 머티리얼 오브젝트를 등록하려면 각각 BatchRendererGroup.RegisterMeshBatchRendererGroup.RegisterMaterial을 사용하십시오.이러한 함수는 각각 BatchMeshIDBatchMaterialID를 반환하며, 이는 버스트 호환 핸들을 포함하는 플레인 데이터 구조체입니다.실수로 잘못된 핸들 타입을 사용하여 발생하는 오류를 방지할 수 있도록 철저히 분류되어 있습니다.

런타임을 비롯하여 언제든지 메시 및 머티리얼 오브젝트를 등록할 수 있습니다.유일한 요구 사항은 다음과 같습니다.

  • 메시 및 머티리얼 오브젝트를 등록해야 BatchRendererGroup이 이를 렌더링에 사용할 수 있습니다.
  • 머티리얼은 DOTS 인스턴싱을 지원해야 합니다.

또한 메시 및 머티리얼 오브젝트가 더 이상 필요하지 않은 경우 등록을 취소할 수 있습니다.이는 메시 또는 머티리얼 오브젝트를 언로드하려는 경우 필요합니다.BatchRendererGroup.Dispose는 등록된 모든 에셋을 자동으로 등록 취소합니다.

참고:BatchMeshID나 BatchMaterialID를 직렬화할 수 없습니다.등록한 BatchRendererGroup에서만 유효하며, 등록을 취소하거나 BatchRendererGroup이 더 이상 존재하지 않는 경우 유효하지 않게 됩니다.또한 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은 배치라는 개념을 사용합니다.자세한 내용은 다음 주제인 배치 생성을 참조하십시오.

BatchRendererGroup 오브젝트 초기화
배치 생성