Version: 2023.1
言語: 日本語
GPU インスタンシング対応シェーダーの作成
静的バッチ処理

ドローコールのバッチ処理

ドローコールのバッチ処理は、ドローコール最適化 メッシュを結合して、Unity がより少ないドローコールでレンダリングできるようにする方法です。Unity には 2 つのビルトインのドローコールバッチ処理方法があります。

  • 静的バッチ処理: 静的 ゲームオブジェクトに対して、Unity はそれらを結合し、まとめて描画します。
  • 動的バッチ処理: かなり小さいメッシュに対し、その頂点を CPU 上に変換して多数の類似したものを群にし、1 回のドローコールで描画します。

Unity のビルトインのドローコールのバッチ処理には、手動でメッシュをマージするのに比べいくつかの利点があります。最も重要なのは、Unity がまだメッシュを個別に削除できる点です。しかし、欠点もあります。静的バッチ処理はメモリとストレージのオーバーヘッドを発生させ、動的バッチ処理は CPU のオーバーヘッドを発生させます。

要件と互換性

このセクションでは、Unity のドローコールのバッチ処理の方法とレンダーパイプラインの互換性についての情報を紹介します。

レンダーパイプラインの互換性

機能 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタムのスクリプタブルレンダーパイプライン (SRP)
静的バッチ処理 あり あり あり あり
動的バッチ処理 あり あり なし あり

ドローコールのバッチ処理の使用

以下の使用情報は、静的バッチ処理と動的バッチ処理の両方に関連しています。各ドローコールのバッチ方法固有の情報 (有効化の方法や使用方法など) については、静的バッチ処理動的バッチ処理 を参照してください。

メッシュレンダラートレイルレンダラーラインレンダラーパーティクルシステムスプライトレンダラー はドローコールバッチ処理に対応します。Skinned Mesh Renderers Cloth など、他のタイプのレンダリングコンポーネントはサポートされていません。Unity はレンダラーを同じタイプの他のレンダラーとのみバッチ処理します (例えば、Mesh Renderer は Mesh Renderer とバッチ処理されます)。

Unity は、同じマテリアルを使用するゲームオブジェクトのドローコールをバッチ処理します。つまり、ドローコールのバッチ処理から最良の結果を得るために、できるだけ多くのゲームオブジェクト間でマテリアルを共有します。テクスチャだけが違う 2 つの同じマテリアルアセットがある場合、これらのテクスチャを結合して 1 つの大きなテクスチャにします。この処理は、テクスチャのアトラス化と呼ばれます 。詳しくは、テクスチャのアトラス化についての ウイキペディア記事 を参照してください。テクスチャが同じアトラスにあると、代わりに 1 つのマテリアルアセットを使用できます。

ビルトインレンダーパイプラインでは、MaterialPropertyBlock を使用すると、ドローコールのバッチ処理を中断することなくマテリアルのプロパティを変更することができます。CPU はまだレンダー状態の変更を行う必要がありますが、MaterialPropertyBlock を使用すると複数のマテリアルを使用するよりも高速になります。プロジェクトでスクリプタブルレンダーパイプラインを使用している場合は、。マテリアルの SRP バッチャーの互換性を削除するため MaterialPropertyBlock を使用しないでくだ さい。

透明なシェーダーは、しばしば、Unity がメッシュを後方から手前の順にレンダリングすることを必要とします。透明なメッシュをバッチ処理するために、Unity はまずメッシュを後方から手前の順に並べ、それからバッチ処理を試みます。Unity はメッシュを後方から手前に向かってレンダリングする必要があるため、多くの場合、透明なメッシュに不透明なメッシュと同等数のバッチ処理を行うことはできません。

Unity はゲームオブジェクトに動的なバッチ処理を適用することができません (Transform コンポーネントのミラーリングを含む)。例えば、あるゲームオブジェクトのスケールが 1 で、別のゲームオブジェクトのスケールが –1 の場合、Unity はそれらを一緒にバッチ処理することができません。

ドローコールのバッチ処理を使用できない場合、互いに近いメッシュを手動で結合することが良い代替方法となり得ます。メッシュの結合の詳細は、メッシュの結合 を参照してください。

注意: C# スクリプトから共有マテリアルプロパティにアクセスする場合は、Renderer.material ではなく、Renderer.sharedMaterial を必ず使用してください。Renderer.material はマテリアルのコピーを作成し、そのコピーをレンダラーに返します。これにより、Unity がそのレンダラーのドローコールをバッチ処理するのを防ぎます。


  • 2017–10–26 修正されたページ

  • グラフィックスジョブと互換性のない動的なバッチ処理に関するノートは 2017.2に追加

GPU インスタンシング対応シェーダーの作成
静的バッチ処理