このセクションでは、GPU インスタンシングに関連するシェーダーの追加コードについて説明します。
| 追加コード | 説明 |
|---|---|
#pragma multi_compile_instancing |
インスタンシングバリアントを生成します。フラグメントシェーダーと頂点シェーダーでは必須です。サーフェスシェーダーでは任意です。 |
#pragma instancing_options
|
Unity がインスタンスに使用するオプションを指定します。利用可能なオプションスイッチについては、#pragma instancing_options を参照してください。 |
UNITY_VERTEX_INPUT_INSTANCE_ID |
頂点シェーダー入力/出力構造体のインスタンス ID を定義します。このマクロを使用するには、 INSTANCING_ON シェーダーキーワードを有効にします。有効にしないと、Unity はインスタンス ID を設定しません。 インスタンス ID にアクセスするには、#ifdef INSTANCING_ON ブロック内で vertexInput.instanceID を使用します。このブロックを使用しないと、バリアントのコンパイルに失敗します。 |
UNITY_INSTANCING_BUFFER_START(bufferName) |
bufferName という名前のインスタンスごとの定数バッファの開始を宣言します。このマクロは、UNITY_INSTANCING_BUFFER_END とともに使用して、各インスタンスに一意のプロパティ宣言をラップします。UNITY_DEFINE_INSTANCED_PROP を使用してバッファ内にプロパティを宣言します。 |
UNITY_INSTANCING_BUFFER_END(bufferName) |
bufferName という名前のインスタンスごとの定数バッファの終了を宣言します。このマクロは、UNITY_INSTANCING_BUFFER_START とともに使用して、各インスタンスに一意のプロパティ宣言をラップします。UNITY_DEFINE_INSTANCED_PROP を使用してバッファ内にプロパティを宣言します。 |
UNITY_DEFINE_INSTANCED_PROP(type, propertyName) |
型と名前を指定してインスタンスごとのシェーダープロパティを定義します。以下の例では、_Color が一意のプロパティです。 |
UNITY_SETUP_INSTANCE_ID(v); |
シェーダー関数がインスタンス ID にアクセスできるようにします。頂点シェーダーの場合、このマクロは最初に必要です。フラグメントシェーダーの場合、この追加コードは任意です。例については、頂点シェーダーとフラグメントシェーダー を参照してください。 |
UNITY_TRANSFER_INSTANCE_ID(v, o); |
頂点シェーダーの場合、入力構造体から出力構造体へインスタンス ID をコピーします。フラグメントシェーダーの場合は、インスタンスごとのデータにアクセスする必要がある場合にこのマクロを使用します。 |
UNITY_ACCESS_INSTANCED_PROP(bufferName, propertyName) |
インスタンシング定数バッファのインスタンスごとのシェーダープロパティにアクセスします。Unity はインスタンス ID を使用してインスタンスデータ配列を表します。bufferName は、指定されたプロパティを含む定数バッファの名前と一致する必要があります。このマクロのコンパイルは、INSTANCING_ON バリアントと非インスタンシングバリアントで異なります。 |
[#pragma instancing_options](#pragma-instancing_options) ディレクティブは以下の switch を使用できます。
| Switch | 説明|
| ————————————————– | ———————————————————— |
| forcemaxcount:batchSize および maxcount:batchSize | ほとんどのプラットフォームで、Unity はインスタンシングデータ配列のサイズを自動的に計算します。ターゲットデバイスの最大定数バッファサイズを、インスタンスごとのプロパティをすべて含む構造体のサイズで割ります。一般的に、バッチサイズを心配する必要はありません。ただし、プラットフォームによっては、配列サイズを固定にする必要があります。これらのプラットフォームのためにバッチサイズを指定するには、maxcount オプションを使用します。他のプラットフォームでは、このオプションは無視されます。すべてのプラットフォームでバッチサイズを強制する場合は、forcemaxcount を使用します。これは、例えばプロジェクトで RenderMeshInstanced を使用して、インスタンス化されたスプライトが 256 のドローコールを発行する場合に便利です。デフォルト値は、2 つのオプションとも 500 です。 |
| assumeuniformscaling | すべてのインスタンスが統一されたスケーリング (X, Y, Z 軸すべてに対して同じスケール) を持つと仮定するように Unity に命令します。|
|
| nolodfade| Unity が LOD フェード値に GPU インスタンシングを適用しないようにします。 |
| nolightprobe | Unity が ライトプローブ 値とそのオクルージョンデータに GPU インスタンシングを適用しないようにします。このオプションを ON に設定すると、GPU インスタンシングとライトプローブの両方を使用するゲームオブジェクトがプロジェクトに含まれていない場合に、パフォーマンスを向上させることができます。 |
| nolightmap | Unity がライトマップアトラス情報の値に GPU インスタンシングを適用しないようにします。このオプションを ON に設定すると、GPU インスタンシングとライトマップの両方を使用するゲームオブジェクトがプロジェクトに含まれていない場合に、パフォーマンスを向上させることができます。 |
| procedural:FunctionName| Graphics.RenderMeshIndirect で使用する追加のバリアントを生成します。頂点シェーダーステージの最初に、Unity はコロンの後に指定された関数を呼び出します。インスタンスデータを手動で設定するには、インスタンスごとのデータを普通にシェーダーに追加するのと同じ方法で、この関数にインスタンスごとのデータを追加します。フェッチされたインスタンスプロパティのいずれかがフラグメントシェーダーに含まれている場合は、Unity はフラグメントシェーダーの最初にも、この関数を呼び出します。 |