頂点フォーマット

頂点フォーマット

柔軟な頂点フォーマット (FVF) のコードは、インターリーブされて格納される頂点の内容を単一データ ストリームに記述する。一般に、固定機能頂点処理パイプラインで処理されるデータを指定する。

Microsoft® Direct3D® アプリケーションでは、複数の方法でモデルの頂点を定義できる。柔軟な頂点定義 (柔軟な頂点フォーマットまたは柔軟な頂点フォーマット コードとも呼ぶ) がサポートされていることから、必要な頂点の成分のみアプリケーションで使い、使用しない頂点の成分は削除できる。必要な頂点の成分のみ使用できるので、アプリケーションでメモリを節約でき、モデルのレンダリングに必要な処理帯域幅を最小限に抑えることができる。D3DFVF を組み合わせて使って、頂点のフォーマット方法を指定する。

FVF 仕様にはポイント サイズのフォーマットも含まれ、D3DFVF_PSIZE によって指定する。このサイズは、非 TL 頂点についてはカメラ空間単位で、TL 頂点についてはデバイス空間単位で表される。

C++ アプリケーションでは、IDirect3DDevice9 インターフェイスのレンダリング メソッドにより、これらのフラグの組み合わせを受け取るメソッドを使え、その組み合わせを使ってプリミティブのレンダリング方法を決める。基本的には、これらのフラグは、アプリケーションでどの頂点の成分 (位置座標、頂点ブレンディング ウェイト、法線、色、テクスチャ座標の数とフォーマット) を使うかをシステムに知らせ、また、Direct3D でレンダリング パイプラインのどの部分を頂点の成分に適用するかを間接的に知らせる。さらに、特定の頂点フォーマット フラグの有無によって、メモリに存在する頂点の成分フィールドと、省略した頂点の成分をシステムに知らせる。

デバイスの制限を調べるには、D3DFVFCAPS_DONOTSTRIPELEMENTS および D3DFVFCAPS_TEXCOORDCOUNTMASK 柔軟な頂点フォーマット フラグについてデバイスを問い合わせる。詳細については、D3DCAPS9 構造体の 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;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

次に定義する FVF は、D3DFVF_LAST_UBYTE4 フラグを使っている。

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    DWORD       indices; // Referenced as v2.xyzw in the vertex shader 
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};