入力アセンブラー ステージ
入力アセンブラー (IA) は、ソース ジオメトリ データを 1D バッファーからプルすることで、レンダリング パイプラインに三角形、線、またはポイントを導入します。
頂点データは複数のバッファーから取得でき、各バッファーから構造体の配列形式でアクセスできます。 各バッファーは、個々の入力スロットにバインドされ、構造体のストライドが指定されます。 すべてのバッファーにわたるデータのレイアウトは、各エントリが 要素を定義する入力宣言によって指定されます。 要素には、入力スロット、構造体オフセット、データ型、およびターゲット レジスタ (パイプライン内の最初のアクティブ シェーダー用) が含まれます。
特定の一連の頂点は、バッファーからフェッチされるデータから構築されます。 データは、固定関数状態とさまざまな Draw*() DDI 呼び出しの組み合わせによって転送されるトラバーサルでフェッチされます。 頂点データのシーケンスがプリミティブのシーケンスを表すために、さまざまなプリミティブ トポロジ (ポイントリスト、ラインリスト、三角形リスト、三角形ストリップなど) を使用できます。
頂点データは、2 つの方法のいずれかで生成できます。 頂点データを生成する最初の方法は、 インデックスなし レンダリングです。これは、頂点データを含むバッファーのシーケンシャル トラバーサルです。 頂点データは、各バッファー バインドの開始オフセットから生成されます。 頂点データを生成する 2 つ目の方法は インデックス付き レンダリングです。これは、スカラー整数インデックスを含む 1 つのバッファーのシーケンシャル トラバーサルです。 インデックスは、バッファーへの開始オフセットから始まります。 各インデックスは、頂点データを含むバッファーからデータをフェッチする場所を示します。 インデックス値は、参照するバッファーの特性に依存しません。 バッファーは宣言によって記述されます。 インデックスなしレンダリングとインデックス付きレンダリングは、それぞれ独自の方法で、メモリ内の頂点データをフェッチするアドレスを生成し、その後、結果を頂点とプリミティブにアセンブルします。
インスタンス化されたジオメトリ レンダリングは、インデックスなしレンダリングまたはインデックス付きレンダリングのシーケンシャル トラバーサルで、各頂点バッファー (インデックスなしケース) またはインデックス バッファー (インデックス付きケース) 内の範囲をループできるようにすることで有効になります。 バッファー バインドは、 インスタンス データ または 頂点データとして識別できます。 この ID は、インスタンス化されたレンダリングの実行中にバインドされたバッファーを使用する方法を指定します。 インデックスなしレンダリングまたはインデックス付きレンダリングによって生成されるアドレスは、頂点データをフェッチするために使用されます。これは、ランタイムがインスタンス化されたレンダリングを実行する際のループも考慮します。 一方、インスタンス データは、常にバッファーごとのオフセットから、インスタンスごとに 1 ステップに等しい頻度で順番に走査されます (たとえば、インスタンス内の頂点の数が走査された後に 1 ステップ進みます)。 インスタンス データのステップ レートは、インスタンス周波数の副高調波 (つまり、他のインスタンスごとに 1 ステップ進む、3 番目のインスタンスごとなど) に選択することもできます。
IA のもう 1 つの特殊なケースは、ストリーム出力ステージが書き込んだバッファーを読み取ることができるということです。 このようなシナリオでは、新しい種類の描画操作 DrawAutoが可能になります。 DrawAuto を使用すると、ストリーム出力バッファーに書き込まれた出力の動的な量を再利用し、CPU の関与なしに、実際に書き込まれたデータの量を判断できます。
IA では、バッファーから頂点データを生成するだけでなく、レンダリング パイプラインのシェーダー ステージへの入力用に、VertexID、PrimitiveID、および InstanceID の 3 つのスカラー カウンター値を自動生成できます。
三角形ストリップなどのストリップ トポロジのインデックス付きレンダリングでは、1 回の *Draw*() 呼び出しで複数のストリップを描画するためのメカニズムが提供されます (つまり、ストリップを切り取る *cut コマンド)。
Direct3D ランタイムは、次のドライバー関数を呼び出して、IA の作成、設定、および破棄を行います。