Version: 2021.2
言語: 日本語
ドローコールの最適化
ドローコールのバッチ処理

GPU インスタンシング

GPU インスタンシングは ドローコール最適化 の方法で、同じマテリアルをもつ複数のメッシュコピーを 1 回のドローコールでレンダリングします。メッシュの各コピーはインスタンスと呼ばれます。これは、例えば、木や茂みなど、シーンに何度も現れるものを描画するのに便利です。

GPU インスタンシングは、、各ドローコールで同じメッシュをレンダリングします。バリエーションを追加して繰り返しの印象を減らすために、各インスタンスは ColorScale のような異なるプロパティをもつことができます。複数のインスタンスをレンダリングするドローコールは、Frame Debugger に、Draw Mesh (instanced) として表示されます。

要件と互換性

このセクションでは、GPU インスタンシングのプラットフォーム、レンダーパイプライン、SRP バッチャーの互換性についての情報を紹介します。

プラットフォームの互換性

GPU インスタンシングは、WebGL 1.0 を除くすべてのプラットフォームで利用可能です。

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

機能 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタムのスクリプタブルレンダーパイプライン (SRP)
GPU インスタンシング 可 (1) 可 (1) 可 (1)

ノート:

  1. シェーダーが SRP バッチャー と互換性がない場合のみ

SRP バッチャー

GPU インスタンシングは SRP バッチャー と互換性がありません。SRP バッチャーは GPU インスタンシングより優先されます。ゲームオブジェクトが SRP バッチャーと互換性がある場合、Unity は GPU インスタンシングではなく SRP バッチャーを使用してレンダリングします。最適化手法の優先順位についての詳細は、最適化の優先順位 を参照してください。

プロジェクトが SRP バッチャーを使用していて、ゲームオブジェクトに GPU インスタンスを使用したい場合、以下のいずれかを実行します。

  • Graphics.DrawMeshInstanced を使用する。この API はゲームオブジェクトの使用を回避し、指定されたパラメーターを使用して直接画面上にメッシュを描画します。
  • SRP バッチャーの互換性を手動で削除します。この方法については、互換性を意図的に削除する を参照してください。

GPU インスタンシングの使用法

Unity は、同じメッシュとマテリアルを共有するゲームオブジェクトに対して、GPU インスタンシングを行います。メッシュとマテリアルをインスタンス化するには以下を行います。

  • The material’s shader must support GPU instancing. Unity’s Standard Shader supports GPU instancing, as do all surface shaders. To add GPU instancing support to any other shader, see [Creating shaders that support GPU instancing(gpu-instancing-shader).
  • The mesh must be from one of the following sources:

マテリアルに GPU インスタンシングを使用するには、Inspector で Enable GPU Instancing オプションを選択します。

マテリアルインスペクターに表示される Enable GPU Instancing オプション
マテリアルインスペクターに表示される Enable GPU Instancing オプション

ライティング

GPU インスタンシングは、Unity の ベイクした Global Illumination システム をサポートします。Unity のスタンダードシェーダーとサーフィスシェーダーは、デフォルトで GPU インスタンシングと Unity のベイクした Global Illumination システムをサポートします。

各 GPU インスタンスは、以下のいずれかのソースからのグローバルイルミネーションをサポートしています。

  • 任意の数の ライトプローブ
  • 1 つの ライトマップ
    ノート: インスタンスはライトマップで複数のアトラスリージョンを使用することができます。
  • 1 つの [Light Probe Proxy Volume (LPPV) コンポーネン ノート: LPPV は、すべてのインスタンスを含むスペースボリュームをベイクする必要があります。

GPU インスタンシングは、自動的に以下と動作します。

  • ライトプローブのの影響を受ける動的 メッシュレンダラー
  • 同じライトマップテクスチャにベイクする静的メッシュレンダラー。Contribute GI が メッシュレンダラーの Static Editor Flags に含まれる場合、メッシュレンダラーは、このコンテキストでは静的です。

Graphics.DrawMeshInstanced でライト プローブ レンダリングを有効にするには、LightProbeUsage パラメータをCustomProvided に設定し、プローブ データを含むMaterialPropertyBlock を提供します。詳細およびコード例については、LightProbes.CalculateInterpolatedLightAndOcclusionProbes を参照してください。

また、LPPV コンポーネントの参照と LightProbeUsage.UseProxyVolumeGraphics.DrawMeshInstanced に渡すこともできます。これを行うと、すべてのインスタンスがライトプローブのデータの L0 バンドと L1 バンドのボリュームをサンプリングします。L2 データとオクルージョンデータを補うには、MaterialPropertyBlock を使用します。詳細は、ライトプローブ - 技術的な情報 を参照してください。

パフォーマンスへの影響

頂点数が少ないメッシュは、GPU インスタンシングを使用しても、効率的に処理することができま せん。なぜなら、GPU のリソースを十分に活用した方法で作業を分配できないからです。この処理効率の悪さは、パフォーマンスに有害な影響を与える可能性があります。非効率が始まるしきい値は GPU によって異なりますが、原則として、256 より少ない頂点のメッシュには GPU インスタンシングを使用しないでく ださい。

頂点数の少ないメッシュを何度も描画する場合は、すべてのメッシュの情報を含むバッファを 1 つ作成し、それを使ってメッシュを描画するのが効率的です。


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

  • Enable Instancing チェックボックスの説明、DrawMeshInstancedIndirect、#pragma multi-compile に関しては 5.6 で追加

  • GPU インスタンシングのためのシェーダーウォームアップは 2017.3 で追加 NewIn20173

  • GPU インスタンシングでのグローバルイルミネーション (GI) サポートは 2018.1 で追加 NewIn20181

ドローコールの最適化
ドローコールのバッチ処理
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961