GPU インスタンシングは ドローコール最適化 の方法で、同じマテリアルをもつ複数のメッシュコピーを 1 回のドローコールでレンダリングします。メッシュの各コピーはインスタンスと呼ばれます。これは、例えば、木や茂みなど、シーンに何度も現れるものを描画するのに便利です。
GPU インスタンシングは、、各ドローコールで同じメッシュをレンダリングします。バリエーションを追加して繰り返しの印象を減らすために、各インスタンスは Color や Scale のような異なるプロパティをもつことができます。複数のインスタンスをレンダリングするドローコールは、Frame Debugger に、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 インスタンシングは、Unity の ベイクした Global Illumination システム をサポートします。Unity のスタンダードシェーダーとサーフィスシェーダーは、デフォルトで GPU インスタンシングと Unity のベイクした Global Illumination システムをサポートします。
各 GPU インスタンスは、以下のいずれかのソースからのグローバルイルミネーションをサポートしています。
GPU インスタンシングは、自動的に以下と動作します。
Graphics.DrawMeshInstanced
でライト プローブ レンダリングを有効にするには、LightProbeUsage パラメータをCustomProvided に設定し、プローブ データを含むMaterialPropertyBlock を提供します。詳細およびコード例については、LightProbes.CalculateInterpolatedLightAndOcclusionProbes を参照してください。
また、LPPV コンポーネントの参照と LightProbeUsage.UseProxyVolume を Graphics.DrawMeshInstanced
に渡すこともできます。これを行うと、すべてのインスタンスがライトプローブのデータの L0 バンドと L1 バンドのボリュームをサンプリングします。L2 データとオクルージョンデータを補うには、MaterialPropertyBlock
を使用します。詳細は、ライトプローブ - 技術的な情報 を参照してください。
頂点数が少ないメッシュは、GPU インスタンシングを使用しても、効率的に処理することができま せん。なぜなら、GPU のリソースを十分に活用した方法で作業を分配できないからです。この処理効率の悪さは、パフォーマンスに有害な影響を与える可能性があります。非効率が始まるしきい値は GPU によって異なりますが、原則として、256 より少ない頂点のメッシュには GPU インスタンシングを使用しないでく ださい。
頂点数の少ないメッシュを何度も描画する場合は、すべてのメッシュの情報を含むバッファを 1 つ作成し、それを使ってメッシュを描画するのが効率的です。