プリミティブ トポロジ

Direct3D 10 以降では、 D3D_PRIMITIVE_TOPOLOGY 列挙型で表されるいくつかのプリミティブ型 (またはトポロジ) がサポートされています。 これらの型は、パイプラインによって頂点がどのように解釈およびレンダリングされるかを定義します。

基本プリミティブ型

次の基本的なプリミティブ型がサポートされています。

各プリミティブ タイプの視覚化については、このトピックの後半の「 巻き取り方向」および「頂点の先頭位置」の図を参照してください。

入力アセンブラー ステージは、頂点バッファーとインデックス バッファーからデータを読み取り、データをこれらのプリミティブにアセンブルしてから、残りのパイプライン ステージにデータを送信します。 ( ID3D11DeviceContext::IASetPrimitiveTopology メソッドを使用して、input-assembler ステージのプリミティブ型を指定できます)。

プリミティブ隣接

Direct3D 10 以降のすべてのプリミティブ型 (ポイント リストを除く) は、隣接性を持つプリミティブ型と隣接性のないプリミティブ型の 2 つのバージョンで使用できます。 隣接性を持つプリミティブには、それを取り囲む頂点がいくつか含まれますが、隣接性を持たないプリミティブに含まれるのは、ターゲット プリミティブの頂点のみです。 たとえば、(D3D_PRIMITIVE_TOPOLOGY_LINELIST値で表される) 行リスト プリミティブには、隣接性 (D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ値で表される) を含む対応する行リスト プリミティブがあります。

隣接プリミティブは、ジオメトリに関する追加情報の提供を目的としており、ジオメトリ シェーダーによってのみ認識されます。 隣接性は、シルエット検出やシャドウ ボリュームの押し出しなどを使用するジオメトリ シェーダーで役に立ちます。

たとえば、隣接性のあるトライアングル リストを描画するとします。 36 個の頂点を持つ隣接性のあるトライアングル リストからは 6 個の完全なプリミティブが作成されます。 ライン ストリップを除き、隣接性のあるプリミティブは、隣接性を持たない同じプリミティブのちょうど 2 倍の頂点を含んでいます。ここで、追加の頂点はそれぞれ隣接頂点です。

巻き方向と先行頂点の位置

下の図にあるように、先頭頂点は、プリミティブ内の最初の非隣接頂点です。 先頭頂点がそれぞれ異なるプリミティブで使用されている限り、1 つのプリミティブ タイプで複数の先頭頂点を定義することができます。 隣接性を持つトライアングル ストリップでは、先頭頂点は 0、2、4、6 ... となります。 隣接性を持つライン ストリップでは、先頭頂点は 1、2、3 ... となります。 一方、隣接プリミティブには先頭頂点はありません。

次の図は、入力アセンブラーで生成可能なすべてのプリミティブ タイプの頂点の順序を表しています。

プリミティブ タイプの頂点順序の図

この図の記号の意味を、次の表に示します。

シンボル 名前 説明
頂点を表す記号 Vertex 3D 空間内の点です。
ワインディング方向を表す記号 ワインディング方向 プリミティブをアセンブルするときの頂点の順序です。 時計回りまたは反時計回りにできます。 ID3D11Device1::CreateRasterizerState1 を呼び出して、これを指定します。
先頭頂点を表す記号 先頭頂点 プリミティブ内で、定数ごとのデータを含む最初の非隣接頂点です。

 

複数のストリップの生成

ストリップ カットによって、複数のストリップを生成することができます。 ストリップ カットを実行するには、RestartStrip HLSL 関数を明示的に呼び出すか、インデックス バッファーに特殊なインデックス値を挿入します。 この値とは –1 で、32 ビットのインデックスは 0xffffffff、16 ビットのインデックスは 0xffff です。 -1 のインデックスは、現在のストリップの明示的な ”カット” または ”再開” を示します。 前のインデックスは前のプリミティブかストリップを完了し、次のインデックスは新しいプリミティブかストリップを開始します。 複数のストリップの生成の詳細については、「 Geometry-Shader Stage」を参照してください。

Note

すべての 10level9 ハードウェアがこの機能を実装しているわけではないため、機能レベル 10.0 以上のハードウェアが必要です。

 

Input-Assembler ステージでのはじめに

パイプライン ステージ (Direct3D 10)