GPU インスタンシングは ドローコール最適化 の方法で、同じマテリアルをもつ複数のメッシュコピーを 1 回のドローコールでレンダリングします。メッシュの各コピーはインスタンスと呼ばれます。これは、例えば、木や茂みなど、シーンに何度も現れるものを描画するのに便利です。
GPU インスタンシングは、同じドローコールで同一のメッシュをレンダリングします。バリエーションを追加して繰り返しの表示を低減するために、各インスタンスには 色 や スケール のような異なるプロパティを設定できます。複数のインスタンスをレンダリングするドローコールは、フレームデバッガー に、Draw Mesh (instanced) として表示されます。
このセクションでは、GPU インスタンシングのプラットフォーム、レンダーパイプライン、SRP バッチャーの互換性についての情報を紹介します。
GPU インスタンシングは、WebGL 1.0 を除くすべてのプラットフォームで利用可能です。
機能 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタムのスクリプタブルレンダーパイプライン (SRP) |
---|---|---|---|---|
GPU インスタンシング | 可 | あり (1) | あり (1) | あり (1) |
ノート:
GPU インスタンシングは SRP バッチャー と互換性がありません。SRP バッチャーは GPU インスタンシングより優先されます。ゲームオブジェクトが SRP バッチャーと互換性がある場合、Unity は GPU インスタンシングではなく SRP バッチャーを使用してレンダリングします。最適化手法の優先順位についての詳細は、最適化の優先順位 を参照してください。
プロジェクトが SRP バッチャーを使用していて、ゲームオブジェクトに GPU インスタンスを使用したい場合、以下のいずれかを実行します。
Unity は、同じメッシュとマテリアルを共有するゲームオブジェクトに対して、GPU インスタンシングを行います。メッシュとマテリアルをインスタンス化するには以下を行います。
マテリアルに GPU インスタンシングを使用するには、Inspector で Enable GPU Instancing オプションを選択します。
GPU instancing supports Unity’s Baked Global Illumination system. Unity Standard Shaders and surface shaders support GPU instancing and Unity’s Baked Global Illumination system by default.
各 GPU インスタンスは、以下のいずれかのソースからのグローバルイルミネーションをサポートしています。
GPU インスタンシングは、自動的に以下と動作します。
Graphics.RenderMeshInstanced
でライトプローブレンダリングを有効にするには、プローブデータを含む MaterialPropertyBlock を指定します。詳細およびコード例については、LightProbes.CalculateInterpolatedLightAndOcclusionProbes を参照してください。
または、LPPV コンポーネントの参照と LightProbeUsage.UseProxyVolume を Graphics.RenderMeshInstanced
に渡すこともできます。これを行うと、すべてのインスタンスがライトプローブのデータの L0 バンドと L1 バンド のボリュームをサンプリングします。L2 データとオクルージョンデータを補うには、MaterialPropertyBlock
を使用します。詳細は、ライトプローブ: 技術的な情報 を参照してください。
頂点数が少ないメッシュは、GPU インスタンシングを使用しても、効率的に処理することができま せん。なぜなら、GPU のリソースを十分に活用した方法で作業を分配できないからです。この処理効率の悪さは、パフォーマンスに有害な影響を与える可能性があります。非効率が始まるしきい値は GPU によって異なりますが、原則として、256 より少ない頂点のメッシュには GPU インスタンシングを使用しないでく ださい。
頂点数の少ないメッシュを何度も描画する場合は、すべてのメッシュの情報を含むバッファを 1 つ作成し、それを使ってメッシュを描画するのが効率的です。