固定関数 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 つのブレンド インデックスが使用されている場合に存在します。これは、常に最初の 3 つの合計を数値 1 から減算して 4 つ目を取得するためです (blend₄ = 1 - (blend₁ + blend₂ + blend₃))。
#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
};
関連トピック
-
頂点宣言 を する