Version: Unity 6.0 (6000.0)
言語 : 日本語
BatchRendererGroup API のためのカスタムシェーダーの記述
URP のカスタムシェーダーで DOTS インスタンシングをサポートする

URP の DOTS Instancing シェーダー

BatchRenderGroup (BRG) は、多数のインスタンスの効率的なレンダリングを行うために、DOTS Instancing (DOTS インスタンシング) と呼ばれる新しいシェーダーインスタンシングモードを使用します。BRG が使用するすべてのシェーダーは DOTS Instancing をサポートしている必要があります。従来のインスタンス化されたシェーダーでは、定数バッファまたはユニフォームバッファ内のインスタンス化された各プロパティに対する配列がシェーダーに渡されます。各配列のそれぞれの要素には、描画内の 1 つのインスタンスのプロパティ値が含まれます。DOTS のインスタンス化されたシェーダーでは、Unity は DOTS Instanced プロパティごとに 1 つの 32 ビット整数をシェーダーに渡します。この 32 ビット整数はメタデータ値と呼ばれます。この整数は何でも表せますが、通常は、シェーダーがレンダリングするインスタンス用にプロパティデータをロードする (ロード元の)、バッファ内のオフセットを表します。

従来のインスタンシングと比較して、DOTS Instancing には多くの利点があります。これには例えば以下が含まれます。

  • インスタンスデータは GraphicsBuffer に格納されて GPU 上に永続的に保持されるため、Unity はインスタンスをレンダリングするたびにそれを再設定する必要がありません。インスタンスが実際に変更される時にだけデータ設定を行うことで、インスタンスデータがほとんど (あるいは全く) 変更されない場合のパフォーマンスを大幅に向上させることができます。これは、エンジンがフレームごとにすべてのインスタンスのすべてのデータを設定しなければならない、従来のインスタンシングよりもはるかに効率的です。
  • インスタンスデータの設定プロセスは、ドローコールの設定とは別になっています。これにより、ドローコールの設定が軽量かつ効率的になります。BRG では、(各ドローコール用の処理を最小限に抑えた) スクリプタブルレンダーパイプライン (SRP) バッチャーの特殊な高速パスによって、これが可能になっています。開発者が自分でこの処理 (作業) を行うことになるため、各ドローコールでレンダリングする内容を、より自在に制御できます。
  • ドローコールのサイズは、定数バッファまたはユニフォームバッファに格納できるインスタンスデータの量によって制限されなくなりました。これにより、BRG は 1 回のドローコールでより多くのインスタンス数をレンダリングできるようになります。
    ノート: 各インデックスではさらにデータが必要なため、インスタンスインデックスの数によってドローコールのサイズが制限されます。ただし、インデックスが消費するメモリは、インスタンス化されたプロパティの完全なセットよりもはるかに少ないため、定数バッファまたはユニフォームバッファに格納できるインスタンスは多くなります。例えば、各インデックスには 16 バイト必要なため、特定のプラットフォームのバッファのメモリ制限が 64 kb の場合、4096 個のインデックスをバッファに格納できます。
  • 特定のプロパティに関してすべてのインスタンスが同じ値を使用する場合、すべてのインスタンスにメモリ内の同じ場所から値をロードすることができます。これにより、インスタンスごとの値の複製に費やされるメモリと GPU サイクル数を節約できます。
BatchRendererGroup API のためのカスタムシェーダーの記述
URP のカスタムシェーダーで DOTS インスタンシングをサポートする