Direct3D 9 宣言への FVF コードのマッピング (Direct3D 9)

次の表は、FVF コードを D3DVERTEXELEMENT9 構造体にマップします。

Fvf データ型 使用 使用状況インデックス
D3DFVF_XYZ D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZRHW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITIONT 0
D3DFVF_XYZW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZB5とD3DFVF_LASTBETA_UBYTE4 D3DVSDT_FLOAT3、D3DVSDT_FLOAT4、D3DVSDT_UBYTE4 D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5とD3DFVF_LASTBETA_D3DCOLOR D3DVSDT_FLOAT3、D3DVSDT_FLOAT4、D3DVSDT_D3DCOLOR D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 D3DDECLTYPE_FLOAT3、D3DDECLTYPE_FLOAT4、D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) D3DDECLTYPE_FLOAT3、D3DDECLTYPE_FLOATn D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT 0
D3DFVF_XYZBn (n=1..4) と D3DFVF_LASTBETA_UBYTE4 D3DDECLTYPE_FLOAT3、D3DDECLTYPE_FLOAT(n-1)、D3DDECLTYPE_UBYTE4 D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) と D3DFVF_LASTBETA_D3DCOLOR D3DDECLTYPE_FLOAT3、D3DDECLTYPE_FLOAT(n-1)、D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_POSITION、D3DDECLUSAGE_BLENDWEIGHT、D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_NORMAL D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_NORMAL 0
D3DFVF_PSIZE D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_PSIZE 0
D3DFVF_DIFFUSE D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 0
D3DFVF_SPECULAR D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 1
D3DFVF_TEXCOORDSIZEm(n) D3DDECLTYPE_FLOATm D3DDECLUSAGE_TEXCOORD n

 

D3DDECLUSAGE_POSITIONTを使用した頂点宣言

(D3DUSAGE_POSITIONT,0) を持つ頂点要素の存在は、入ってくる頂点データが既に頂点処理 (D3DFVF_XYZRHW ビットが設定された FVF など) をデバイスに示すために使用されます。 描画時に、現在設定されている宣言に (D3DUSAGE_POSITIONT、0) セマンティックを持つ要素がある場合、頂点処理全体がスキップされます (D3DFVF_XYZRHW ビットを持つ FVF が設定されている場合と同様)。

(D3DDECLUSAGE_POSITIONT、0) を使用した頂点宣言にはいくつかの制限があります。

  • このような宣言では、ストリーム 0 のみを使用できます。
  • 頂点要素は、ストリーム オフセットを増やして並べ替える必要があります。
  • ストリーム オフセットは DWORD で配置する必要があります。
  • 同じ (使用状況、使用状況インデックス) ペアは 1 回だけ一覧表示する必要があります。
  • D3DDECLMETHOD_DEFAULT メソッドのみを使用できます。
  • 他の頂点要素には、(D3DDECLUSAGE_POSITION、0) セマンティックを含めることはできません。

さらに、デバイス ドライバーのバージョンに関連するこのような宣言にはいくつかの制限があります。 Direct3D は変換を行わずにドライバーに直接このような宣言を送信するため、これらの制限は有効です。

D3DDECLUSAGE_POSITIONTを使用しない頂点宣言

ランタイムは、宣言の作成を検証します。 次に、どのような宣言が有効であるかを示す一般的な規則を示します。

  • ストリームのすべての頂点要素は、連続してオフセットで並べ替える必要があります。
  • ストリーム オフセットは DWORD で配置する必要があります。
  • 同じ (使用状況、使用状況インデックス) ペアは 1 回だけ一覧表示する必要があります。
  • D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSETが設定されている場合は、
    • 複数の頂点要素は、ストリーム内で同じオフセットを共有できます。
    • 頂点要素はすべて、異なるサイズの異なる型にすることができます。
    • 頂点要素は任意に重なることができます。 たとえば、ある要素は、ストリームの場所から開始できます。同時に、別の要素の中央に配置されます。
    • 頂点要素には、任意の順序でストリーム オフセットを設定できます。
  • 頂点要素の数を 64 より大きくすることはできません。
  • UsageIndex の範囲は [0 から 15] である必要があります。
  • DrawPrimitive API で使用される宣言には、D3DDECLMETHOD_DEFAULT、D3DDECLMETHOD_LOOKUPPRESAMPLED、またはD3DDECLMETHOD_LOOKUP以外の頂点要素を含めてはいけません。
  • D3DDECLMETHOD_LOOKUPまたは LOOKUPPRESAMPLED を含む宣言は、プログラミング可能な頂点パイプラインでのみ使用する必要があります。
  • DrawRectPatch/DrawTriPatch API で使用される宣言は、D3DDECLMETHOD_LOOKUPPRESAMPLEDまたはD3DDECLMETHOD_LOOKUPを持つ頂点要素を持つことはできません。
  • 宣言には、D3DDECLMETHOD_LOOKUP メソッドまたは D3DDECLMETHOD_LOOKUPPRESAMPLED メソッドを持つ要素が 1 つだけ必要です。
  • D3DDECLMETHOD_LOOKUPまたはD3DDECLMETHOD_LOOKUPPRESAMPLEDを使用した宣言には、N パッチに対してのみディスプレイスメント マッピングが行われるため、D3DDECLMETHOD_DEFAULT以外の要素を含めないようにする必要があります。
  • D3DDECLMETHOD_LOOKUPまたはD3DDECLMETHOD_LOOKUPPRESAMPLEDを持つ頂点要素は、(D3DDECLUSAGE_SAMPLE、n) セマンティックでのみ使用でき、その逆も可能です。
  • D3DDECLMETHOD_LOOKUP メソッドを持つ頂点要素に、既に存在する頂点要素のストリーム インデックスとオフセットがある場合、この頂点要素のデータ型は同じである必要があります。
  • D3DDECLMETHOD_LOOKUP メソッドを持つ頂点要素には、D3DDECLTYPE_FLOAT2/3/4 データ型が必要です
  • 型D3DDECLMETHOD_CROSSUV、D3DDECLMETHOD_PARTIALU、D3DDECLMETHOD_PARTIALVを持つ頂点要素には、互換性のあるデータ型を持つ頂点要素のオフセットが必要です。
  • メソッド D3DDECLMETHOD_UVまたはD3DDECLMETHOD_LOOKUPPRESAMPLEDを持つ頂点要素には、型D3DDECLTYPE_UNUSED、ストリーム インデックス 0、およびストリーム オフセット 0 が必要です。
  • メソッドD3DDECLMETHOD_UV、D3DDECLMETHOD_PARTIALU、およびD3DDECLMETHOD_PARTIALVを持つ宣言は、DrawRectPatch でのみ使用できます。
  • 使用状況D3DDECLUSAGE_TESSFACTORは、データ型D3DDECLTYPE_FLOAT1と使用状況インデックス 0 でのみ使用する必要があります。
  • テセレーション (DrawRectPatch、DrawTriPatch、N パッチ) に宣言を使用する場合、データ型はD3DDECLTYPE_SHORT4以下である必要があります。
  • 特定のデバイス機能 (ディスプレイスメント マッピング、RT パッチなど) を必要とするメソッドを含む宣言は、デバイスでサポートされている場合にのみ作成できます。
  • 点と線を描画するために使用される頂点宣言には、D3DDECLMETHOD_DEFAULT以外のメソッドを使用することはできません。
  • 作成できる宣言は、ドライバーの機能によっても異なります。

ドライバーに関する考慮事項

Direct3D 9 より前のドライバー

  • 入力宣言は、有効な FVF に変換できる必要があります (頂点要素とそのデータ型の順序は同じです)。
  • テクスチャ座標のギャップは許可されません。 つまり、(D3DDECLUSAGE_TEXCOORD、n) を持つ頂点要素がある場合は、(D3DDECLUSAGE_TEXCOORD、n-1) を持つ頂点要素も存在する必要があります。

ピクセル シェーダー バージョン 3 がサポートされていない Direct3D 9 ドライバー

  • 入力宣言は、有効な FVF に変換できる必要があります (頂点要素とそのデータ型の順序は同じです)。
  • テクスチャ座標のギャップが許容されます。

ピクセル シェーダー バージョン 3 をサポートする Direct3D 9 ドライバー

より一般的な宣言を使用できます。

  • 頂点要素は任意の順序で指定でき、任意のデータ型を持つことができます。
  • 複数の頂点要素は、同じストリーム オフセットを共有でき、D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSETがデバイスによって設定されている場合は、同時に異なる種類になります。

プログラム可能な頂点パイプラインを使用した頂点宣言の使用

  • 描画時に、Direct3D は、現在の頂点宣言と現在の頂点シェーダー関数で同じ "使用法 - 使用状況インデックス" の組み合わせを検索します。 組み合わせが見つかると、シェーダー関数 DCL のレジスタが頂点要素の宛先として使用されます。
  • 現在の頂点宣言の頂点要素に、現在の頂点シェーダーで見つからない使用法がある場合、その頂点要素は無視されます。
  • 2.0 未満のバージョンの頂点シェーダーを使用する場合は、シェーダー コードで言及されているすべてのセマンティクスが、描画時にバインドされた宣言に存在する必要があります。 頂点シェーダー 2.0 以上を使用する場合、アプリケーションが同じ頂点シェーダーで異なる頂点宣言を使用できるようにするこの制限は存在しません。 これは、頂点シェーダーが静的条件に基づいて入力データを読み取る場合に便利です。 このため、頂点シェーダー レジスタが初期化されないと、未定義の値が発生します。

DirectX 8 ドライバーのハードウェア頂点処理で を使用する場合は、追加の制限があります。

  • 頂点要素は、重複したり、同じオフセットを共有したりすることはできません。
  • データ型は、DirectX 8 ドライバーが理解できる内容に制限されます。

指定された宣言を DirectX 8 スタイルの宣言に変換できない場合、CreateVertexDeclaration が失敗する可能性があります。 混合モード デバイスの場合、このエラーは Draw* 時に発生します。これは、このシェーダーがハードウェアまたはソフトウェアの頂点処理で使用されているかどうかを確認できる唯一の時間であるためです。

固定関数パイプラインでの頂点宣言の使用

使用できるのは、次の規則に従う宣言のみです。

  • 頂点要素間にギャップが存在しないようにする必要があります (固定関数パイプラインに使用される DirectX 8 宣言では SKIP を使用できませんでした)。
  • セマンティック (D3DDECLUSAGE_POSITION、0) を指定する必要があり、データ型D3DDECLTYPE_FLOAT3必要があります。
  • メソッドD3DDECLMETHOD_UVを持つ頂点要素は、使用法のD3DDECLUSAGE_TEXCOORDまたはD3DDECLUSAGE_BLENDWEIGHTを指定する必要があります。
  • メソッドのD3DDECLMETHOD_PARTIALU、_PARTIALV、または_CROSSUVを持つ頂点要素は、D3DDECLUSAGE_POSITION、_NORMAL、_BLENDWEIGHT、または_TEXCOORDでのみ使用でき、入力型D3DDECLTYPE_FLOAT3を使用する必要があります。

DirectX 8 ドライバーのハードウェア頂点処理で宣言を使用する場合、Direct3D ランタイムは、次の規則を使用して DirectX 8 スタイルの宣言に変換します。

  • 頂点要素はストリーム内で同じオフセットを共有できず、重複することもできません。
  • データ型は、D3DDECLTYPE_SHORT4以下である必要があります。
  • 許可されるメソッドは、D3DDECLMETHOD_DEFAULT、D3DDECLMETHOD_CROSSUV、D3DDECLMETHOD_UVのみです。
  • Direct3D 9 宣言と Direct3D 8 宣言 (Direct3D 9) の間のマッピング は、どの Direct3D 9 セマンティクスを DirectX 8 スタイルの宣言に変換できるかを示しています。 Usage と UsageIndex はレジスタ値に変換されます。
  • 宣言に n 個の頂点要素があり、0 - m (m < n) が FVF ( Direct3D 宣言と FVF コード (Direct3D 9) の間のマッピングで説明されている要素) にマップされている場合、m + 1 ではマップされません。
    • n ~ 1 個の頂点要素が FVF/dx8decl にマップされるまで m + 2 のいずれかが存在する場合、宣言は無効です。
    • 要素 0 から m は、Direct3D 宣言と FVF コード間のマッピング (Direct3D 9) を使用して(DirectX 8 以前のドライバーのランタイムによって、Direct3D 9 ドライバーによって) 変換されます。n - 1 が連続する texcoord(k)、texcoord(k+1) にマップされるまで、要素 0 - m の任意の texcoord から始まります。
    • マップされた texcoord のデータ型は float[1234] と見なされ、現在の要素に含まれるすべてのデータ型 (ただし同じサイズ) が置き換えられます。 したがって、既存のデータ型は、 Direct3D 宣言と FVF コード (Direct3D 9) の間のマッピングに含まれていないものにすることができます。
    • k が 8 に達した場合、FVF/dx8decl の宣言は無効です。
    • texcoords へのマッピングが発生した場合、宣言全体に DEFAULT 以外の生成メソッドを持つ要素が含まれていないか、FVF/dx8decl の宣言が無効である必要があります。

ProcessVertices での頂点宣言の使用

頂点宣言を使用して、ProcessVertices の出力を記述できます。 このような宣言は、次の規則に従う必要があります。

  • ストリーム 0 のみを使用する必要があります。
  • D3DDECLMETHOD_DEFAULTメソッドのみが許可されます。
  • D3DDECLTYPE_FLOATnまたはD3DDECLTYPE_D3DCOLORデータ型のみを使用できます。
  • 頂点要素は、同じオフセットを共有したり、互いに重なったりすることはできません。
  • (D3DDECLUSAGE_POSITION、0) または (D3DDECLUSAGE_POSITIONT,0) の頂点要素は必要ありません。
  • (D3DDECLUSAGE_POSITION、0) と (D3DDECLUSAGE_POSITIONT,0) の頂点要素は、同じ宣言に存在できません。
  • このような宣言を使用する場合、現在の頂点シェーダーはバージョン 3.0 以上である必要があります。

頂点宣言