Version: Unity 6.0 (6000.0)
言語 : 日本語
ビルトインレンダーパイプラインの GPU インスタンシング
ビルトインレンダーパイプラインの GPU インスタンシングシェーダーの例

ビルトインレンダーパイプラインでの GPU インスタンシングシェーダーへのインスタンスごとのプロパティ追加

デフォルトでは、Unity GPU は、インスタンス化された各ドローコールで、異なる Transform を持つゲームオブジェクトをインスタンス化します。インスタンスにバリエーションを追加するには、シェーダーを変更して、色などのインスタンスごとのプロパティを追加します。これは、サーフェスシェーダーと頂点/フラグメントシェーダーの両方で行うことができます。

カスタムシェーダーにはインスタンスごとのデータは必要ありませんが、ワールド行列を正しく機能させるために、インスタンス ID が必要です。サーフェスシェーダーは自動的にインスタンス ID を設定しますが、カスタムの頂点シェーダーとフラグメントシェーダーは設定しません。カスタムの頂点シェーダーとフラグメントシェーダーの ID を設定するには、シェーダーの先頭で UNITY_SETUP_INSTANCE_ID を使用します。この方法の例については、頂点シェーダーとフラグメントシェーダー を参照してください。

インスタンス化したプロパティを宣言すると、Unity はゲームオブジェクトに設定された MaterialPropertyBlock オブジェクトのすべてのプロパティ値を、1 つのドローコールにまとめます。MaterialPropertyBlock オブジェクトを使用してランタイムにインスタンスごとのデータを設定する方法の例については、ランタイムにインスタンスごとのデータを変更する を参照してください。

マルチパスシェーダーにインスタンスごとのデータを追加する場合は、以下の点に注意してください。

  • マルチパスシェーダーのパスが 2 つを超える場合、Unity は最初のパスのみをインスタンス化します。これは、Unity が後からのパスをオブジェクトごとに一緒にレンダリングすることで、マテリアルの変更を強制するためです。
  • ビルトインレンダーパイプラインでフォワードレンダリングパスを使用すると、Unity は複数のライトの影響を受けるオブジェクトを効率的にインスタンス化できません。Unity は、ベースパスに対してのみインスタンシングを効果的に使用できます。追加のパスに対しては使用できません。ライティングパスの詳細については、フォワードレンダリングとパスのタグ についてのドキュメントを参照してください。

複数のインスタンスごとのプロパティを使用する場合は、MaterialPropertyBlock オブジェクトでそれらすべてを満たす必要はありません。また、1 つのインスタンスにプロパティがない場合、Unity は参照マテリアルからデフォルト値を取得します。マテリアルにプロパティのデフォルト値がない場合、Unity は値を 0 に設定します。インスタンス化されていないプロパティを MaterialPropertyBlock に配置しないでください。インスタンシングが無効になるためです。代わりに、それらに対して異なるマテリアルを作成します。

ビルトインレンダーパイプラインの GPU インスタンシング
ビルトインレンダーパイプラインの GPU インスタンシングシェーダーの例