Microsoft DirectX 8.0 (Visual Basic)

頂点フォーマットについて

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

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

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

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

デバイスの制限を調べるには、D3DFVFCAPS_DONOTSTRIPELEMENTS および D3DFVFCAPS_TEXCOORDCOUNTMASK 柔軟な頂点フォーマット フラグについてデバイスを問い合わせる。詳細については、D3DCAPS8 型の「FVFCaps メンバ」を参照すること。

頂点のフォーマット方法に関するシステム条件の中で重要なのは、データの表示順序である。次の図は、メモリ内のすべての頂点の成分の順序とそれに関係するデータ型を示している。

テクスチャ座標はさまざまなフォーマットで宣言でき、最少 1 要素の座標、最大 4 要素のテクスチャ座標 (2D 射影テクスチャ座標の場合) を使用してテクスチャを処理できる。Math.bas からヘルパー関数の D3DFVF_TEXCOORDSIZEn セットを使用して、頂点フォーマットで使用するテクスチャ座標フォーマットを識別するためのビット パターンを作成する。Math.bas の Visual Basic コード モジュールが、この SDK に付属している。

アプリケーションがすべての単一コンポーネントを使用するとは限らない。RHW (同次 W の逆数) と頂点法線フィールドは互いに排他的である。また、ほとんどのアプリケーションで 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 つの合計) を使用するからである。

Const D3DFVF_BLENDVERTEX = (D3DFVF_XYZB3 Or D3DFVF_NORMAL Or D3DFVF_TEX1)

Private Type BLENDVERTEX
    v As D3DXVECTOR  ' 頂点シェーダで v0 として参照される。
    blend1 As Single ' 頂点シェーダで v1.x として参照される。
    blend2 As Single ' 頂点シェーダで v1.y として参照される。
    blend3 As Single ' 頂点シェーダで v1.z として参照される。
                     ' v1.w = 1.0 - (v1.x + v1.y + v1.z)
    n As D3DXVECTOR  ' 頂点シェーダで v3 として参照される。
    tu as Single     ' tu および tv。頂点シェーダで v7 として参照される。
    tv As Single     '
End Type

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

Const D3DFVF_BLENDVERTEX = (D3DFVF_XYZB4 Or D3DFVF_LASTBETA_UBYTE4 Or _
                            D3DFVF_NORMAL Or D3DFVF_TEX1)
Private Type BLENDVERTEX
    v As D3DXVECTOR    ' 頂点シェーダで v0 として参照される。
    blend1 As Single   ' 頂点シェーダで v1.x として参照される。
    blend2 As Single   ' 頂点シェーダで v1.y として参照される。
    blend3 As Single   ' 頂点シェーダで v1.z として参照される。
                       ' v1.w = 1.0 - (v1.x + v1.y + v1.z)
    indices As Long    ' 頂点シェーダで v2.xyzw として参照される。
    n As D3DXVECTOR    ' 頂点シェーダで v3 として参照される。
    tu As Single       ' tu および tv。頂点シェーダで v7 として参照される。
    tv As Single
End Type

詳細については、「柔軟な頂点フォーマット フラグ」を参照すること。