Version: Unity 6.0 (6000.0)
言語 : 日本語
URP で BatchRendererGroup オブジェクトを初期化する
URP の BatchRendererGroup API でバッチを作成する

URP で BatchRendererGroup API を使用してメッシュとマテリアルを登録する

メッシュマテリアル は Unity のマネージ C# オブジェクトです。つまり、Burst C# コードからは使用できません。これらを BRG の描画コマンドで使用するには、BRG に事前に登録する必要があります。

メッシュオブジェクトを登録するには BatchRendererGroup.RegisterMesh、マテリアルオブジェクトを登録するには BatchRendererGroup.RegisterMaterial を使用します。前者の関数は BatchMeshID を返し、後者の関数は BatchMaterialID を返します。これらは Burst 互換ハンドルを含むプレーンなデータ構造体で、間違ったハンドルタイプの使用によるエラーを防ぐために、強く型付けされています。

メッシュオブジェクトとマテリアルオブジェクトの登録は、ランタイムを含め、いつでも行えます。ただし、以下の条件だけは満たしている必要があります。

  • メッシュオブジェクトやマテリアルオブジェクトは、BatchRendererGroup によってレンダリングに使用される前に登録されている必要があります。
  • マテリアルは DOTS インスタンシングをサポートしている必要があります。

不要になったメッシュオブジェクトやマテリアルオブジェクトは登録解除することもできます。メッシュオブジェクトやマテリアルオブジェクトをアンロードする場合には、登録解除が必要です。BatchRendererGroup.Dispose は、登録されているすべてのアセットを自動的に登録解除します。

ノート: BatchMeshID や BatchMaterialID はシリアライズできません。これらは、登録先の BatchRendererGroup にのみ有効です。登録を解除するか、BatchRendererGroup が存在しなくなると、無効になります。BatchMeshID と BatchMaterialID は、Unity がメッシュオブジェクトまたはマテリアルオブジェクトを強制的にアンロードする場合も無効になります。これは、メッシュオブジェクトまたはマテリアルオブジェクトが属するシーンを Unity がアンロードするときに発生します。

同じメッシュオブジェクトまたはマテリアルオブジェクトを複数回登録できます。これは、どのメッシュまたはマテリアルが登録済みであるかが不明な場合に、メッシュまたはマテリアルを登録するのに便利です。この場合、BatchRenderer は登録回数を以下のように内部でカウントします。

  • メッシュあるいはマテリアルオブジェクトが 1 つ登録されるたびに、BatchRendererGroup は参照カウントを 1 増加させます。
  • メッシュオブジェクトまたはマテリアルオブジェクトの登録が解除されるたびに、BatchRendererGroup はその参照カウントを 1 減少させます。参照カウントが 0 になると、BatchRendererGroup はそのメッシュまたはマテリアルの登録を解除します。後からそのメッシュまたはマテリアルを描画コマンドで使用するには、再度登録する必要があります。
  • 既に登録されているメッシュあるいはマテリアルで RegisterMesh または RegisterMaterial を呼び出すと、前回の呼び出しと同じ BatchMeshID または BatchMaterialID が返されます。ただし、BatchRendererGroup がメッシュまたはマテリアルの登録を完全に解除した場合は、再登録の際に異なる ID が返される可能性があります。

ノート: BRG は、フレーム内の最初の OnPerformCulling コールバックメソッドの後に、メッシュオブジェクトまたはマテリアルオブジェクトの変更をチェックします。つまり、その時点より前に発生したすべての変更が考慮されます。これには最初のコールバック自体で行った変更は含まれますが、そのコールバックがスケジュールしたジョブで発生した変更は含まれません。それ以降にメッシュオブジェクトまたはマテリアルオブジェクトを変更すると、未定義の動作が発生します。

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();
    }
}

登録されたメッシュとマテリアルを使用する描画コマンドを作成するには、その描画コマンドのインスタンスに使用するデータ (Transform 行列など) を前もって提供する必要があります。BatchRendererGroup は、バッチと呼ばれる概念を使用して、各インスタンスに使用するデータを提供します。詳細は、次のトピック バッチを作成する を参照してください。

URP で BatchRendererGroup オブジェクトを初期化する
URP の BatchRendererGroup API でバッチを作成する