Platform SDK: DirectX

ストライド頂点フォーマット

[Visual Basic]

 :  ここでは、C++ でのアプリケーション開発について説明する。DirectX for Visual Basic では、ストライド頂点はサポートしていない。

[C++]

ストライド頂点フォーマットには、IDirect3DDevice7::DrawPrimitiveStridedIDirect3DDevice7::DrawIndexedPrimitiveStrided、および IDirect3DVertexBuffer7::ProcessVerticesStrided メソッドで使用する、未トランスフォームの頂点、「未トランスフォーム ライティング済みの頂点」、または「未トランスフォーム 未ライティングの頂点」を表すフィールドが含まれる。ストライド頂点フォーマットは、トランスフォームされた頂点には使用できない。"通常" の頂点は、必要な頂点成分を物理的にすべて含む構造体である。これとは異なり、"ストライド" 頂点は、頂点成分へのポインタを含む構造体で、頂点成分自体を含むわけではない。

この間接的なアクセスは、DrawPrimitiveStridedDrawIndexedPrimitiveStrided、および ProcessVerticesStrided メソッドが受け取る D3DDRAWPRIMITIVESTRIDEDDATA 構造体によって行われる。ストライド頂点は、非ストライド頂点と同様に柔軟な頂点フォーマット フラグを組み合わせて記述する。しかし、非ストライド頂点とは異なり、これら使用するフラグは、指定のフィールドがメモリ内に存在することを示すのではなく (D3DDRAWPRIMITIVESTRIDEDDATA にはこれらのフラグがすべて含まれる)、どの構造体メンバをアプリケーションで使用するかを示す。これらのフラグに対する制約は、非ストライド頂点の場合と同じである。詳細については、「柔軟な頂点フォーマット フラグ」を参照すること。

D3DDRAWPRIMITIVESTRIDEDDATA 構造体には 12 個の D3DDP_PTRSTRIDE 構造体が含まれ、それぞれの構造体は頂点の位置座標、法線、ディフューズ色、スペキュラ色、およびテクスチャ座標セットを表す。各 D3DDP_PTRSTRIDE 構造体には、データ配列へのポインタと、その配列のストライドが含まれる。これら 12 個の構造体による間接的なアクセスにより、アプリケーションは頂点成分をどのようにでも配置できる。たとえば、次の図に示すように、頂点成分ごとに異なる配列を使用できる。

対応する D3DDP_PTRSTRIDE 構造体の lpvData メンバは、頂点成分の配列があるバッファのアドレスを含む。各配列の各要素は 1 つの頂点に対する 1 つのコンポーネントを表し、このコンポーネントはいくつかの浮動小数点値 (位置座標、法線、およびテクスチャ座標) または 1 つの RGBA 値 (ディフューズ色とスペキュラ色) から成る。各配列には、レンダリングする頂点 1 つにつき 1 つのエントリがある。D3DDP_PTRSTRIDE 構造体の dwStride メンバには、配列内のエントリ間のメモリ ストライドをバイト数で設定しなければならない。次の表は、コンポーネントとそれに対応するストライドを示す。

コンポーネント ストライド
未トランスフォームの位置座標 3 〜 6 つの浮動小数点値 (x,y,z, と 0 〜 3 つのブレンド ウェイト)
頂点法線 3 つの浮動小数点値 (nx,ny,nz)
ディフューズ色 1 つの DWORD (RGBA)
スペキュラ色 1 つの DWORD (RGBA)
テクスチャ座標 1、2、3、または 4 つの浮動小数点値

(第 1、第 2、第 3、または第 4 テクスチャ座標)


 :  DirectX 7.0 では、テクスチャ座標は複数のフォーマットで宣言でき、最少 1 つの座標、最大 3 つのテクスチャ座標 (2D 射影テクスチャ座標の場合) を使用してテクスチャを処理できる。詳細については、「テクスチャ座標フォーマット」を参照すること。マクロの D3DFVF_TEXCOORDSIZEn セットを使用して、頂点フォーマットで使用するテクスチャ座標フォーマットを識別するためのビット パターンを作成する。

場合によっては、インタリーブ配列に頂点成分の一部またはすべてを含めることもある。ストライド頂点フォーマットでは、これを簡単に行うことができる。たとえば、アプリケーションで頂点位置座標と法線コンポーネントをインタリーブした場合、メモリ レイアウトと D3DDP_PTRSTRIDE 構造体の対応する設定は、次のように表すことができる。

この場合、D3DDP_PTRSTRIDE 構造体の lpvData メンバは同一バッファ内の 2 つの位置座標をポイントし、ストライドはインタリーブされたコンポーネントの幅を結合した値に設定される。もちろん、これは特定のインタリーブ スキームに限定されるものではない。データ ポインタとそのストライドを正しく設定していれば、どのようなインタリーブ スキームでも可能である。