デフォルトでは、Unity GPU は、インスタンス化された各ドローコールで、異なる Transform を持つゲームオブジェクトをインスタンス化します。インスタンスにバリエーションを追加するには、シェーダーを変更して、色などのインスタンスごとのプロパティを追加します。これは、サーフェスシェーダーと頂点/フラグメントシェーダーの両方で行うことができます。
カスタムシェーダーにはインスタンスごとのデータは必要ありませんが、ワールド行列を正しく機能させるために、インスタンス ID が必要です。サーフェスシェーダーは自動的にインスタンス ID を設定しますが、カスタムの頂点シェーダーとフラグメントシェーダーは設定しません。カスタムの頂点シェーダーとフラグメントシェーダーの ID を設定するには、シェーダーの先頭で UNITY_SETUP_INSTANCE_ID を使用します。この方法の例については、頂点シェーダーとフラグメントシェーダー を参照してください。
インスタンス化したプロパティを宣言すると、Unity はゲームオブジェクトに設定された MaterialPropertyBlock オブジェクトのすべてのプロパティ値を、1 つのドローコールにまとめます。MaterialPropertyBlock オブジェクトを使用してランタイムにインスタンスごとのデータを設定する方法の例については、ランタイムにインスタンスごとのデータを変更する を参照してください。
マルチパスシェーダーにインスタンスごとのデータを追加する場合は、以下の点に注意してください。
複数のインスタンスごとのプロパティを使用する場合は、MaterialPropertyBlock オブジェクトでそれらすべてを満たす必要はありません。また、1 つのインスタンスにプロパティがない場合、Unity は参照マテリアルからデフォルト値を取得します。マテリアルにプロパティのデフォルト値がない場合、Unity は値を 0 に設定します。インスタンス化されていないプロパティを MaterialPropertyBlock に配置しないでください。インスタンシングが無効になるためです。代わりに、それらに対して異なるマテリアルを作成します。