システム生成値は、シェーダー操作の特定の効率を可能にするために、(ユーザーが指定した入力 セマンティクスに基づいて) IA ステージによって生成されます。
インスタンス ID (VS に表示される)、頂点 ID (VS から参照可能)、プリミティブ ID (GS/PS に表示) などのデータをアタッチすることで、後続のシェーダー ステージでは、これらのシステム値を検索してそのステージでの処理を最適化できます。 たとえば、VS ステージでは、シェーダーの頂点ごとの追加データを取得したり、他の操作を実行したりするために、インスタンス ID を検索できます。GS ステージと PS ステージでは、プリミティブ ID を使用して、プリミティブごとのデータを同じ方法で取得できます。
Note
これらの Direct3D システム生成値は、Win32 アプリ モデルと UWP アプリ モデルのどちらを使用しているかに関係なく、アプリに適用されます。
VertexID
頂点 ID は、各シェーダー ステージで各頂点を識別するために使用されます。 既定値が 0 の 32 ビット符号なし整数です。 これは、プリミティブが IA ステージによって処理されるときに頂点に割り当てられます。 頂点 ID セマンティックをシェーダー入力宣言にアタッチして、頂点ごとの ID を生成するように IA ステージに通知します。
IA は、シェーダー ステージで使用するために各頂点に頂点 ID を追加します。 描画呼び出しごとに、頂点 ID は 1 ずつインクリメントされます。 インデックス付き描画呼び出しの間に、カウントは開始値にリセットされます。 ID3D11DeviceContext::DrawIndexed および ID3D11DeviceContext::DrawIndexedInstanced の場合、頂点 ID はインデックス値を表します。 頂点 ID がオーバーフローした場合 (2 ² – 1 を超える)、0 に折り返されます。
すべてのプリミティブ型に対して、頂点には頂点 ID が関連付けられています (隣接関係なく)。
PrimitiveID
プリミティブ ID は、各プリミティブを識別するために各シェーダー ステージによって使用されます。 既定値が 0 の 32 ビット符号なし整数です。 これは、プリミティブが IA ステージによって処理されるときにプリミティブに割り当てられます。 プリミティブ ID を生成するように IA ステージに通知するには、プリミティブ ID セマンティックをシェーダー入力宣言にアタッチします。
IA ステージは、ジオメトリ シェーダーまたはピクセル シェーダー ステージ (IA ステージの後にアクティブな最初のステージ) で使用するプリミティブ ID を各プリミティブに追加します。 インデックスが作成された描画呼び出しごとにプリミティブ ID は 1 ずつインクリメントされますが、新しいインスタンスが開始されるたびにプリミティブ ID は 0 にリセットされます。 他のすべての描画呼び出しでは、インスタンス ID の値は変更されません。インスタンス ID がオーバーフローした場合 (2 ² – 1 を超える)、0 に折り返されます。
ピクセル シェーダー ステージには、プリミティブ ID に対する個別の入力がありません。ただし、プリミティブ ID を指定するピクセル シェーダー入力では、定数補間モードが使用されます。
隣接するプリミティブのプリミティブ ID を自動的に生成することはできません。 隣接性を持つ三角形ストリップなど、隣接性を持つプリミティブ型の場合、プリミティブ ID は、隣接性のない三角形ストリップ内のプリミティブのセットと同様に、内部プリミティブ (隣接しないプリミティブ) に対してのみ保持されます。
InstanceID
インスタンス ID は、現在処理されているジオメトリのインスタンスを識別するために、各シェーダー ステージで使用されます。 既定値が 0 の 32 ビット符号なし整数です。
頂点シェーダー入力宣言にインスタンス ID セマンティックが含まれている場合、IA ステージは各頂点にインスタンス ID を追加します。 インデックス付き描画呼び出しごとに、インスタンス ID は 1 ずつインクリメントされます。 他のすべての描画呼び出しでは、インスタンス ID の値は変更されません。インスタンス ID がオーバーフローした場合 (2 ² – 1 を超える)、0 に折り返されます。
例
次の図は、IA ステージでインスタンス化された三角形ストリップにシステム値をアタッチする方法を示しています。
これらの表は、同じ三角形ストリップの両方のインスタンスに対して生成されたシステム値を示しています。 最初のインスタンス (インスタンス 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 | 八 | 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 | 八 | 9 |
| InstanceID | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 価値 | 価値 | 価値 | |
|---|---|---|---|
| PrimitiveID | 0 | 1 | 2 |
| InstanceID | 1 | 1 | 1 |
入力アセンブラーは ID (頂点、プリミティブ、およびインスタンス) を生成します。また、各インスタンスには一意のインスタンス ID が指定されていることにも注意してください。データは、三角形ストリップの各インスタンスを分離するストリップ カットで終わります。
関連トピック