Microsoft DirectX 8.0 (C++) |
柔軟な頂点フォーマット (FVF) のコードは、インターリーブされて格納される頂点の内容を単一データ ストリームに記述する。一般に、固定機能頂点処理パイプラインで処理されるデータを指定する。
Microsoft® Direct3D® アプリケーションでは、複数の方法でモデルの頂点を定義できる。柔軟な頂点定義 ("柔軟な頂点フォーマット" または "柔軟な頂点フォーマット コード" とも呼ぶ) がサポートされていることから、必要な頂点の成分のみアプリケーションで使用し、使用しない頂点の成分は削除できる。必要な頂点の成分のみ使用できるので、アプリケーションでメモリを節約でき、モデルのレンダリングに必要な処理帯域幅を最小限に抑えることができる。柔軟な頂点フォーマット フラグを組み合わせて使用して、頂点のフォーマット方法を指定する。
FVF 仕様にはポイント サイズのフォーマットも含まれ、D3DFVF_PSIZE によって指定する。このサイズは、非 TL 頂点についてはカメラ空間単位で、TL 頂点についてはデバイス空間単位で表される。
C++ アプリケーションでは、IDirect3DDevice8 インターフェイスのレンダリング メソッドにより、これらのフラグの組み合わせを受け取るメソッドを使用でき、その組み合わせを使用してプリミティブのレンダリング方法を決める。基本的には、これらのフラグは、アプリケーションでどの頂点の成分 (位置座標、頂点ブレンディング ウェイト、法線、色、およびテクスチャ座標の数とフォーマット) を使用するかをシステムに知らせ、また、Direct3D でレンダリング パイプラインのどの部分を頂点の成分に適用するかを間接的に知らせる。さらに、特定の頂点フォーマット フラグの有無によって、メモリに存在する頂点の成分フィールドと、省略した頂点の成分をシステムに知らせる。
デバイスの制限を調べるには、D3DFVFCAPS_DONOTSTRIPELEMENTS および D3DFVFCAPS_TEXCOORDCOUNTMASK 柔軟な頂点フォーマット フラグについてデバイスを問い合わせる。詳細については、D3DCAPS8 構造体の「FVFCaps メンバ」を参照すること。
頂点のフォーマット方法に関するシステム条件の中で重要なのは、データの表示順序である。次の図は、メモリ内のすべての頂点の成分の順序とそれに関係するデータ型を示している。
注 テクスチャ座標はさまざまなフォーマットで宣言でき、最少 1 要素の座標、最大 4 要素のテクスチャ座標 (2D 射影テクスチャ座標の場合) を使用してテクスチャを処理できる。詳細については、「テクスチャ座標フォーマット」を参照すること。マクロの D3DFVF_TEXCOORDSIZEn セットを使用して、頂点フォーマットで使用するテクスチャ座標フォーマットを識別するためのビット パターンを作成する。
アプリケーションがすべてのコンポーネントを使用するとは限らない。同次 W の逆数 (RHW) と頂点法線フィールドは互いに排他的である。また、ほとんどのアプリケーションで 8 つのテクスチャ座標セットをすべて使用するとも限らない。しかし、Direct3D にはこのような柔軟性がある。あるフラグを別のフラグと併用する場合には、いくつかの制限がある。たとえば、D3DFVF_XYZ フラグと D3DFVF_XYZRHW フラグは併用できない。この場合、未トランスフォームの頂点とトランスフォーム済みの頂点の両方を使用して、1 つの頂点の位置座標を定義することになるからである。
インデックス頂点ブレンディングを使用するには、D3DFVF_LASTBETA_UBYTE4 フラグは FVF の最後に置く必要がある。このフラグを指定すると、5 番目のブレンディング ウェイトは、フロートではなく DWORD として処理される。詳細については、「インデックス付き頂点ブレンディング」を参照すること。
次のコードは、D3DFVF_LASTBETA_UBYTE4 フラグを使用する FVF コードと、このフラグを使用しない FVF コードとの違いを示している。次に定義する FVF は、D3DFVF_LASTBETA_UBYTE4 フラグを使用していない。4 つのブレンディング インデックスを使用する場合は、フラグ D3DFVF_XYZ3 が存在する。これは、4 番目のブレンディング インデックスに対して、常に (1 - 最初の 3 つの合計) を使用するからである。
#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB3|D3DFVF_NORMAL|D3DFVF_TEX1) struct BLENDVERTEX { D3DXVECTOR3 v; // 頂点シェーダで v0 として参照される。 FLOAT blend1; // 頂点シェーダで v1.x として参照される。 FLOAT blend2; // 頂点シェーダで v1.y として参照される。 FLOAT blend3; // 頂点シェーダで v1.z として参照される。 // v1.w = 1.0 - (v1.x + v1.y + v1.z) D3DXVECTOR3 n; // 頂点シェーダで v3 として参照される。 FLOAT tu, tv; // 頂点シェーダで v7 として参照される。 };
次に定義する FVF は、D3DFVF_LAST_UBYTE4 フラグを使用している。
#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL|D3DFVF_TEX1) struct BLENDVERTEX { D3DXVECTOR3 v; // 頂点シェーダで v0 として参照される。 FLOAT blend1; // 頂点シェーダで v1.x として参照される。 FLOAT blend2; // 頂点シェーダで v1.y として参照される。 FLOAT blend3; // 頂点シェーダで v1.z として参照される。 // v1.w = 1.0 - (v1.x + v1.y + v1.z) DWORD indices; // 頂点シェーダで v2.xyzw として参照される。 D3DXVECTOR3 n; // 頂点シェーダで v3 として参照される。 FLOAT tu, tv; // 頂点シェーダで v7 として参照される。 };
詳細については、「柔軟な頂点フォーマット フラグ」を参照すること。