固定機能 FVF コード (Direct3D 9)
FVF コードは、1 つのデータ ストリームにインターリーブして格納された頂点の内容を記述します。 通常、固定関数頂点処理パイプラインによって処理されるデータを指定します。 これは古いスタイルの頂点宣言です。現在の頂点宣言スタイルを確認するには、「 D3DVERTEXELEMENT9」を参照してください。
Direct3D アプリケーションでは、いくつかの異なる方法でモデル頂点を定義できます。 フレキシブル頂点形式またはフレキシブル頂点形式コードとも呼ばれる柔軟な頂点定義をサポートすることで、アプリケーションで必要な頂点コンポーネントのみを使用できるようになり、使用されていないコンポーネントを排除できます。 必要な頂点コンポーネントのみを使用することで、アプリケーションはメモリを節約し、モデルのレンダリングに必要な処理帯域幅を最小限に抑えることができます。 D3DFVF コードを組み合わせて頂点を書式設定する方法について説明します。
FVF 仕様には、D3DFVF_PSIZEで指定されたポイント サイズの形式が含まれています。 このサイズは、変換されていない (TL) 頂点の場合はカメラ空間ユニット、TL 頂点の場合はデバイス空間単位で表されます。
IDirect3DDevice9 インターフェイスのレンダリング メソッドは、これらのフラグの組み合わせを受け入れるメソッドを C++ アプリケーションに提供し、それらを使用してプリミティブをレンダリングする方法を決定します。 基本的に、これらのフラグは、どの頂点コンポーネント (位置、頂点ブレンドの重み、標準、色、テクスチャ座標の数と形式) をシステムに指示します。アプリケーションでは、Direct3D に適用するレンダリング パイプラインのどの部分を間接的に使用するかを示します。 さらに、特定の頂点形式フラグの有無は、頂点コンポーネント フィールドがメモリに存在し、省略したシステムと通信します。
デバイスの制限事項を確認するには、 D3DCAPS9 の FVFCaps メンバーのD3DFVFCAPS_DONOTSTRIPELEMENTSとD3DFVFCAPS_TEXCOORDCOUNTMASKの値をデバイスに照会します。
テクスチャ座標は異なる形式で宣言できるため、1 つの座標または 4 つのテクスチャ座標 (2D 投影テクスチャ座標の場合) を使用してテクスチャをアドレス指定できます。 詳細については、「 テクスチャ座標形式 (Direct3D 9)」を参照してください。 D3DFVF_TEXCOORDSIZENマクロ のセットを使用して、頂点形式で使用するテクスチャ座標形式を識別するビット パターンを作成します。
すべてのコンポーネントを使用するアプリケーションはありません。 相互同種 W (RHW) フィールドと頂点法線フィールドは相互に排他的です。 また、ほとんどのアプリケーションでは 8 セットのテクスチャ座標をすべて使用しようとしませんが、Direct3D にはこの容量があります。 他のフラグで使用できるフラグには、いくつかの制限があります。 たとえば、D3DFVF_XYZフラグとD3DFVF_XYZRHWフラグを一緒に使用することはできません。これは、アプリケーションが変換されていない頂点と変換された頂点の両方で頂点の位置を記述していることを示します。
インデックス付き頂点ブレンドを使用するには、FVF 宣言の最後に D3DFVF_LASTBETA_UBYTE4 フラグが表示されます。 このフラグが存在すると、5 番目のブレンドウェイトが float ではなく DWORD として扱われることを示します。 詳細については、「 インデックス付き頂点ブレンド (Direct3D 9)」を参照してください。
次のコード サンプルは、D3DFVF_LASTBETA_UBYTE4 フラグを使用する FVF コードとそうでない FVF コードの違いを示しています。 フラグ D3DFVF_XYZB3は、4 つのブレンド インデックスが使用されている場合に存在します。これは、4 番目の (blend₄ = 1 - (blend₁ + blend₂ + blend₃) を取得するために、常に数値 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
};
関連トピック