System-Generated値の使用

システム生成値は、シェーダー操作の特定の効率を可能にするために、(ユーザーが指定した入力 セマンティクスに基づいて) IA ステージによって生成されます。

インスタンス ID (VS に表示される)、頂点 ID (VS に表示される)、プリミティブ ID (GS/PS に表示される) などのデータをアタッチすることで、後続のシェーダー ステージでこれらのシステム値を検索して、そのステージでの処理を最適化できます。 たとえば、VS ステージは、シェーダーの追加の頂点ごとのデータを取得したり、他の操作を実行したりするために、インスタンス ID を探す場合があります。GS ステージと PS ステージでは、プリミティブ ID を使用して、プリミティブごとのデータを同じ方法で取得できます。

VertexID

頂点 ID は、各シェーダー ステージで各頂点を識別するために使用されます。 これは 32 ビットの符号なし整数で、既定値は 0 です。 プリミティブが IA ステージによって処理されるときに、頂点に割り当てられます。 頂点 ID セマンティックをシェーダー入力宣言にアタッチして、頂点ごとの ID を生成するように IA ステージに通知します。

IA は、シェーダー ステージで使用するために、各頂点に頂点 ID を追加します。 描画呼び出しごとに、頂点 ID は 1 ずつインクリメントされます。 インデックス付きの描画呼び出しの間では、カウントが開始値にリセットされます。 ID3D11DeviceContext::D rawIndexed および ID3D11DeviceContext::D rawIndexedInstanced の場合、頂点 ID はインデックス値を表します。 頂点 ID がオーバーフローした場合 (2 ² – 1 を超える)、0 に折り返されます。

すべてのプリミティブ型について、頂点には頂点 ID が関連付けられています (隣接関係はありません)。

PrimitiveID

プリミティブ ID は、各シェーダー ステージで各プリミティブを識別するために使用されます。 これは 32 ビットの符号なし整数で、既定値は 0 です。 プリミティブが IA ステージによって処理されるときに、プリミティブに割り当てられます。 プリミティブ ID を生成するように IA ステージに通知するには、プリミティブ ID セマンティックをシェーダー入力宣言にアタッチします。

IA ステージは、ジオメトリ シェーダーまたはピクセル シェーダー ステージ (IA ステージの後にアクティブな最初のステージ) で使用するために、各プリミティブにプリミティブ ID を追加します。 インデックス付き描画呼び出しごとに、プリミティブ ID は 1 ずつインクリメントされますが、新しいインスタンスが開始されるたびにプリミティブ ID は 0 にリセットされます。 他のすべての描画呼び出しでは、インスタンス ID の値は変更されません。インスタンス ID がオーバーフローした場合 (2 ² – 1 を超える)、0 にラップされます。

ピクセル シェーダー ステージには、プリミティブ ID に対する個別の入力がありません。ただし、プリミティブ ID を指定するピクセル シェーダー入力では、定数補間モードが使用されます。

隣接するプリミティブのプリミティブ ID を自動的に生成することはできません。 隣接性を持つ三角形ストリップなどの隣接性を持つプリミティブ型の場合、プリミティブ ID は、隣接性のない三角形ストリップ内のプリミティブのセットと同様に、内部プリミティブ (隣接しないプリミティブ) に対してのみ保持されます。

InstanceID

インスタンス ID は、現在処理されているジオメトリのインスタンスを識別するために、各シェーダー ステージで使用されます。 これは 32 ビットの符号なし整数で、既定値は 0 です。

頂点シェーダー入力宣言にインスタンス ID セマンティックが含まれている場合、IA ステージは各頂点にインスタンス ID を追加します。 インデックス付き描画呼び出しごとに、インスタンス ID が 1 ずつインクリメントされます。 他のすべての描画呼び出しでは、インスタンス ID の値は変更されません。インスタンス ID がオーバーフロー (2 ² – 1 を超える) 場合は、0 にラップされます。

次の図は、IA ステージのインスタンス化された三角形ストリップにシステム値がどのようにアタッチされるかを示しています。

インスタンス化されたトライアングル ストリップのシステム値の図

下の表は、同じサンプル トライアングル ストリップの 2 つのインスタンスに対して生成されるシステム値を示したものです。 最初のインスタンス (インスタンス U) は青で示され、2 番目のインスタンス (インスタンス V) は緑で示されています。 実線はプリミティブ内の頂点を結び、破線は隣接頂点を結んでいます。

次の表に、インスタンス U のシステム生成値を示します。

頂点データ C,U D,U E,U F,U G,U H,U I,U J,U K,U L,U
VertexID 0 1 2 3 4 5 6 7 8 9
InstanceID 0 0 0 0 0 0 0 0 0 0

 

PrimitiveID 0 1 2
InstanceID 0 0 0

 

次の表に、インスタンス V のシステム生成値を示します。

頂点データ C,V D,V E,V F,V G,V H,V I,V J,V K,V L,V
VertexID 0 1 2 3 4 5 6 7 8 9
InstanceID 1 1 1 1 1 1 1 1 1 1

 

PrimitiveID 0 1 2
InstanceID 1 1 1

 

入力アセンブラーは ID (頂点、プリミティブ、インスタンス) を生成します。また、各インスタンスには一意のインスタンス ID が与えられていることにも注意してください。データは、三角形ストリップの各インスタンスを分離するストリップカットで終わります。

入力アセンブラー ステージ