頂点宣言
頂点宣言
概念上、頂点宣言は、頂点 DMA (Direct Memory Access) やグラフィックス パイプのテセレータ エンジンをプログラミングする方法の 1 つである。頂点宣言は、データ レイアウトとテッセレータの処理を簡潔に表現する。Microsoft® DirectX® 8.x での宣言の複雑さと拡張性に対応するため、この頂点ストリームの新しい表現形式を導入した。
頂点シェーダと頂点宣言は、CreateVertexShader 時に互いにバインドされない。シェーダの評価は 2 つの部分に分かれた。1 つは頂点シェーダの作成時に実行され、もう 1 つは DrawPrimitive 時に実行される。頂点シェーダと頂点宣言はオブジェクトによって表現される。
宣言は、DWORD のストリームとしては表現されなくなった。D3DVERTEXELEMENT9 構造体の配列として表現される。配列の各要素で、1 つの頂点要素を記述する。
さらに、アプリケーション プログラミング インターフェイス (API) の可用性の問題を解決するために、SetVertexDeclaration 呼び出しに相当する個別の SetFVF 呼び出しがある。これは便利な関数である。この呼び出しを行うと、現在設定されている宣言は無効になり、新しい宣言が有効になる。DirectX 8.0 以前のドライバ (NumStreams が 0 に設定される) では、宣言を柔軟な頂点フォーマット (FVF) に変換できないために、SetVertexDeclaration が失敗する場合がある。SetFVF は、固定機能およびプログラム可能な頂点パイプラインとして使える。内部的には、FVF は FVF から DirectX 9.0 宣言へのマッピングを使って、頂点シェーダ宣言に変換される。頂点シェーダ機能の DCL コマンドは、このことを踏まえて作成する必要がある。この変換のために、以下では頂点宣言についてのみ説明する。
D3DVERTEXELEMENT9 構造体
以下では、D3DVERTEXELEMENT9 構造体内のフィールドとその説明を示す。
Stream - このフィールドを読み取るストリーム番号。
Offset - このフィールドを読み取る、バイト単位のオフセット。
Type - 入力データの型と、そのデータを頂点シェーダ レジスタ (float1、float2、short2n など) に格納するときのデータ変換方法。出力の型はメソッドによって決定する。メソッドによっては型が決まっている場合がある。
Method - 指定した入力に対してテセレータ (または手続き型ジオメトリ ルーチン) が実行する、あらかじめ定義されている処理。
- D3DDECLMETHOD_DEFAULT :テセレータを使っている場合、この要素は、補間されるか、頂点プロセッサの入力レジスタ内にコピーされる。この処理の入力型は任意である。この処理の出力型は入力型と同じである。
- D3DDECLMETHOD_PARTIALU :矩形パッチ (R パッチ) 上のポイントにおける U 方向への接線を求める。この処理の入力型は、D3DDECLTYPE_FLOAT[43]、D3DDECLTYPE_D3DCOLOR、D3DDECLTYPE_UBYTE4、または D3DDECLTYPE_SHORT4 である。この処理の出力型は常に D3DDECLTYPE_FLOAT3 である。
- D3DDECLMETHOD_PARTIALV :R パッチ上の点の V 方向の接線を計算する。この処理の入力型は、D3DDECLTYPE_FLOAT[43]、D3DDECLTYPE_D3DCOLOR、D3DDECLTYPE_UBYTE4、または D3DDECLTYPE_SHORT4 である。この処理の出力型は常に D3DDECLTYPE_FLOAT3 である。
- D3DDECLMETHOD_CROSSUV :Rect/Tri パッチ (RT パッチ)上の点の法線を、2 本の接線の外積をとることによって計算する。この処理の入力型は、D3DDECLTYPE_FLOAT[43]、D3DDECLTYPE_D3DCOLOR、D3DDECLTYPE_UBYTE4、または D3DDECLTYPE_SHORT4 である。この処理の出力型は常に D3DDECLTYPE_FLOAT3 である。
- D3DDECLMETHOD_UV :R パッチ上の点の U 値および V 値をコピーする。2D float を生成する。この処理の入力タイプは D3DDECLTYPE_UNUSED に設定する。出力データの型は、常に D3DDECLTYPE_FLOAT2 である。入力ストリームおよびオフセットも使用しない (ただし 0 を設定する必要がある)。
- D3DDECLMETHOD_LOOKUP :ディスプレースメント マップを参照する。入力型には D3DDECLTYPE_FLOAT[234] を使える。テクスチャ マップ参照には .x および .y の成分のみを使う。この操作の出力型は常に D3DDECLTYPE_FLOAT4 である。デバイスがディスプレースメント マッピングをサポートしている場合だけ使える。このメソッドが使えるのは、D3DDECLUSAGE_SAMPLE だけである。
- D3DDECLMETHOD_LOOKUPPRESAMPLED :プリサンプリングしたディスプレースメント マップを参照する。入力タイプ、ストリーム インデックス、ストリーム オフセットはすべて使わない。タイプは D3DDECLTYPE_UNUSED に設定し、ストリームとオフセットは 0 に設定しなければならない。この操作の出力型は常に D3DDECLTYPE_FLOAT4 である。デバイスがディスプレースメント マッピングをサポートしている場合だけ使える。このメソッドが使えるのは、D3DDECLUSAGE_SAMPLE だけである。
Semantic type - 法線かどうかなど、要素の使用法。N パッチに使うと便利で、さまざまなデータ レイアウトや頂点シェーダの間の相互操作性が向上する。ユーザー定義フィールド (Microsoft Direct3D® で定義した既存のセマンティクスを持たないフィールド) には TEXCOORDS セマンティクスを使える。通常、セマンティックスは、頂点宣言と頂点シェーダ間のバインド メカニズムである。しかし、場合によっては、特別な解釈を持つことがある。たとえば、NORMAL または POSITION セマンティックスを持つ要素は、テセレーションを設定するために N パッチ テセレータが使う。
次のものが許可される。
セマンティックス, 使用法インデックス 特別な解釈 (D3DDECLUSAGE_POSITION, 0 ) 固定機能頂点シェーダと N パッチ テセレータの未トランスフォーム位置。 (D3DDECLUSAGE_POSITION, 1) スキニングのための、固定機能頂点シェーダの未トランスフォーム位置。 (D3DDECLUSAGE_BLENDWEIGHT, 0) 固定機能頂点シェーダのブレンドの重み。 (D3DDECLUSAGE_BLENDINDICES, 0) 頂点シェーダによってインデックスが付けられた、パレットのスキニング用の行列インデックス。 (D3DDECLUSAGE_NORMAL, 0) 固定機能頂点シェーダと N パッチ テセレータの頂点法線。 (D3DDECLUSAGE_NORMAL, 1) スキニングのための、固定機能頂点シェーダの頂点法線。 (D3DDECLUSAGE_PSIZE, 0) ポイント スプライト機能の四角形にポイントを拡大するために、ラスタライザのセットアップ エンジンが使う、ポイント サイズ属性。 (D3DDECLUSAGE_TEXCOORD, n) 固定機能頂点シェーダおよび 3_0 以前のピクセル シェーダのテクスチャ座標。これらは、ユーザー定義データを渡すために使える。 (D3DDECLUSAGE_TANGENT, n) 接線。特別な解釈はない。 (D3DDECLUSAGE_BINORMAL, n) 従法線。特別な解釈はない。 (D3DDECLUSAGE_TESSFACTOR, 0) テセレーションのレートを制御するために、テセレーション ユニットで使われるテセレーション係数。 (D3DDECLUSAGE_POSITIONT, 0) トランスフォーム後の位置。これを含む宣言が設定されると、頂点処理をバイパスする。 (D3DDECLUSAGE_COLOR, 0) 固定機能頂点シェーダおよび 3_0 以前のピクセル シェーダのディフューズ色。 (D3DDECLUSAGE_COLOR, 1) 固定機能頂点シェーダおよび 3_0 以前のピクセル シェーダのスペキュラ色。 (D3DDECLUSAGE_FOG, 0) 3_0 以前のピクセル シェーダが設定されたときに、ピクセル シェーダ後に使うフォグ ブレンド値。 (D3DDECLUSAGE_DEPTH, n) 深さ。特別な解釈はない。 (D3DDECLUSAGE_SAMPLE, n) 参照したディスプレースメント値。D3DDECLMETHOD_LOOKUPPRESAMPLED または D3DDECLMETHOD_LOOKUP のみで使える。
頂点要素内の特別な値を、頂点シェーダ宣言の終わりと見なす。この値は、#define D3DDECL_END() {0xFF,0,0,0,0,0} である。
頂点要素のセマンティクスを指定するには、UsageIndex を Usage と共に使う。DirectX 8.x のときのように D3DVSDE_POSITION2 を使うのではなく、Usage として D3DDECLUSAGE_POSITION を指定し、さらに UsageIndex = 1 を指定できる。
宣言は、テセレータ エンジンへの (または、テセレータを使っていない場合は頂点処理エンジンへの直接の) 入力と出力を指定する。頂点要素内の Type フィールドは、宣言へ入力データの型を指定する。出力型はメソッドによって決まる。
頂点シェーダには、{semantic, semantic index, register number} という形式のプリアンブルがある。ランタイムは宣言のセマンティクスとシェーダのセマンティクス情報を照合し、入力レジスタとバイト オフセットを組み合わせて 1 つのストリームに入れる。
FVF から DirectX 9.0 宣言へのマッピング
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) による頂点宣言には、次のようないくつかの制限がある。
- このような宣言では、ストリーム ゼロのみが使える。
- 頂点要素は、増加するストリーム オフセットでソートする必要がある。
- ストリーム オフセットは、アラインメントされた DWORD である必要がある。
- 同じ (使用法, 使用法インデックス) ペアは、1 回のみリストする。
- D3DDECLMETHOD_DEFAULT メソッドのみ使用できる。
- 他の頂点要素は、(D3DDECLUSAGE_POSITION, 0) セマンティックスを持つことはできない。
さらに、デバイス ドライバのバージョンに関連して、このような宣言にはいくつかの制限がある。これらの制限が有効になるのは、Direct3D が変換を実行せずに、宣言を直接ドライバに送るためである。
DirectX 9.0 以前のドライバ
- 入力宣言は、有効な FVF に翻訳可能でなければならない。つまり、同じ順序の頂点要素とそのデータ型を持っている必要がある。
- テクスチャ座標に隙間があってはならない。これは、(D3DDECLUSAGE_TEXCOORD, n) を持つ頂点要素がある場合、(D3DDECLUSAGE_TEXCOORD, n-1) の頂点要素もなくてはならない。
ピクセル シェーダ バージョン 3 のサポートがない DirectX 9.0 ドライバ
- 入力宣言は、有効な FVF に翻訳可能でなければならない。つまり、同じ順序の頂点要素とそのデータ型を持っている必要がある。
- テクスチャ座標に隙間があってもよい。
ピクセル シェーダ バージョン 3 のサポートがある DirectX 9.0 ドライバ
より一般的な宣言が許可される。
- 頂点要素は順序不同で、任意のデータ型を持つことができる。
- デバイスが D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET を設定する場合、複数の頂点要素は同じストリーム オフセットを共有でき、同時に別のタイプにすることができる。
D3DDECLUSAGE_POSITIONT のない頂点宣言
ランタイムは、宣言の作成を検証する。以下では、有効な宣言に関する一般的な規則を示す。
- 1 つのストリーム内の頂点要素はすべてが連続し、オフセットによって分類されなければならない。
- ストリーム オフセットは、アラインメントされた DWORD である必要がある。
- 同じ(使用法, 使用法インデックス) ペアは、1 回のみリストする。
- D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET が設定されている場合、頂点要素では次のことが可能である。
- 複数の頂点要素は、ストリームの同じオフセットを共有できる。
- これらは、すべて異なるタイプにでき、各タイプは異なるサイズにできる。
- また、任意にオーバーラップできる。たとえば、1 つの要素がストリームの場所で開始し、同時に他の要素が中央の場所で開始できる。
- 頂点要素は、任意の順序でストリーム オフセットを持つことができる。
- 頂点要素の数は 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 を含む宣言に、D3DDECLMETHOD_DEFAULT 以外の要素は指定できない。ディスプレースメント マッピングは N パッチに対してのみ実行されるからである。
- 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 型、ストリーム インデックス ゼロ、およびストリーム オフセット ゼロを持たなければならない。
- D3DDECLMETHOD_UV、D3DDECLMETHOD_PARTIALU、および D3DDECLMETHOD_PARTIALV メソッドを含む宣言は、DrawRectPatch のみで使える。
- 使用法 D3DDECLUSAGE_TESSFACTOR と共に使えるのは、データ型 D3DDECLTYPE_FLOAT1 および使用法インデックス 0 のみである。
- テセレーション (DrawRectPatch, DrawTriPatch, N-patches) に宣言を使う場合、データ型は D3DDECLTYPE_SHORT4 以下でなくてはならない。
- 特定のデバイス能力を必要とするメソッドを含む宣言 (たとえば、ディスプレースメント マッピングや RT パッチ) は、デバイスがそれらをサポートしている場合に限り作成できる。
- 点と線を描画するために使う頂点宣言は、D3DDECLMETHOD_DEFAULT 以外のメソッドを持つことはできない。
- 作成できる宣言は、ドライバの能力によっても異なる。
プログラマブル頂点パイプラインでの使用方法
- Direct3D は描画時に、現在の頂点宣言と現在の頂点シェーダ機能の中に同じ "使用法 - 使用法インデックス" の組み合わせを探す。この組み合わせが見つかった場合、シェーダ機能の DCL のレジスタが頂点要素の宣言として使われる。
- 現在の頂点宣言内の頂点要素が持つ使用法が現在の頂点シェーダ内にないと、その頂点要素は無視される。
- 2.0 より前の頂点シェーダを使う場合、すべてのセマンティックス (シェーダ コードで述べた) は、描画時にバインドされた宣言に存在している必要がある。頂点シェーダ 2.0 以降を使う場合、この制限は存在せず、これにより、アプリケーションは同じ頂点シェーダを含む異なる頂点宣言を使える。これは、頂点シェーダが静的な条件に基づいて入力データを読み取る場合に便利である。この理由で初期化されない頂点シェーダ レジスタは、未定義の値を持つ。
DirectX 8.x ドライバでハードウェア頂点処理と共に使う場合、さらに次のような制限がある。
- 頂点要素はオーバーラップしたり、同じオフセットを共有したりできない。
- データ型は、DirectX 8.x ドライバが理解できる範囲に制限される。
指定した宣言が DirectX 8.x 形式の宣言に変換できない場合、CreateVertexDeclaration は失敗する可能性がある。ミックス モード デバイスの場合、描画時にこの失敗が起きる。このシェーダがハードウェア頂点処理で使われているのか、ソフトウェア頂点処理で使われているかがわかるのはこのときだけである。
固定頂点パイプラインでの使用方法
次の規則に従う宣言のみが使える。
- 頂点要素間に隙間があってはならない。DirectX 8.x 宣言では、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.x ドライバでハードウェア頂点処理と共に宣言を使う場合、Direct3D ランタイムは次の規則を使って、それを DirectX 8.x 形式の宣言に変換する。
- 複数の頂点要素が 1 つのストリーム内の同じオフセットを共有したり、オーバーラップすることはできない。
- データ タイプは、D3DDECLTYPE_SHORT4 以下でなければならない。
- D3DDECLMETHOD_DEFAULT、D3DDECLMETHOD_CROSSUV、 D3DDECLMETHOD_UV の各メソッドのみが使える。
- 使用法と使用法インデックスは、Mapping DirectX 9.0 宣言から DirectX 8.x へのマッピングに従ってレジスタ値に変換される。
- Mapping DirectX 9.0 宣言から DirectX 8.x へのマッピングでは、DirectX 8.x 形式の宣言に変換できる、DirectX 9.0 のセマンティックスを示している。
- 宣言に n 個の頂点要素があり、0 - m (m < n) は FVF にマップするが (要素は DirectX 9.0 宣言から FVF ビットへのマッピングで説明している)、m+1 である場合、次のことが当てはまる。
- m+2 から n-1 頂点要素のいずれかを FVF/dx8decl にマッピングする場合、宣言は無効である。
- 要素 0 ~ m は、DirectX 8.0 以前のドライバのランタイムと DirectX 9.0 ドライバによって、DirectX 9.0 宣言から FVF ビットへのマッピングを使って変換される。m+1、m+2 ~ n-1 は、要素 0 ~ m の任意の texcoord から、連続する texcoord(k)、texcoord(k+1) にマッピングされる。
- マッピングされた texcoord のデータ型は float[1234] であると仮定され、現在の要素に含まれているデータ型と置き換えられるが、サイズは同じである。そのため、既存のデータ型をDirectX 9.0 宣言から FVF ビットへのマッピングにないデータ型にしてもかまわない。
- k が 8 以上のとき、FVF/dx8dec に対する宣言は無効になる。
- texcoords へのマッピングが発生した場合、宣言全体が、デフォルト以外の生成メソッドを持つ要素を含んではならない。そうでない場合、FVF/dx8decl に対する宣言は無効になる。
Mapping DirectX 9.0 宣言から DirectX 8.x へのマッピング
DirectX 9.0 使用法 | DirectX 9.0 使用法インデックス | DirectX 8.0 |
---|---|---|
D3DDECLUSAGE_POSITION | 0 | D3DVSDE_POSITION |
D3DDECLUSAGE_POSITION | 1 | D3DVSDE_POSITION2 |
D3DDECLUSAGE_NORMAL | 0 | D3DVSDE_NORMAL |
D3DDECLUSAGE_NORMAL | 1 | D3DVSDE_NORMAL2 |
D3DDECLUSAGE_BLENDWEIGHT | 0 | D3DVSDE_BLENDWEIGHT |
D3DDECLUSAGE_BLENDINDICES | 0 | D3DVSDE_BLENDINDICES |
D3DDECLUSAGE_PSIZE | 0 | D3DVSDE_PSIZE |
D3DDECLUSAGE_COLOR | 0 | D3DVSDE_DIFFUSE |
D3DDECLUSAGE_COLOR | 1 | D3DVSDE_SPECULAR |
D3DDECLUSAGE_TEXCOORD | n | D3DVSDE_TEXCOORDn |
DirectX 7.0.x ドライバでハードウェア頂点処理と共に宣言を使う場合、Direct3D ランタイムは次の規則を使って、それを FVF に変換する。
- 使用できるのはストリーム 0 だけである (MaxStreams 能力から明らか)。
- 頂点要素の順序は、FVF ビットの順序と同じである必要がある。
- テクスチャ座標に隙間があってはならない。
- DirectX 9.0 宣言から FVF ビットへのマッピングで説明されていない頂点要素は、DirectX 8.0 以前のすべての有効なドライバには変換できず、そのために、このようなドライバでは使わない。
- デバイスが、D3DPTEXTURECAPS_PROJECTED または D3DPTEXTURECAPS_CUBEMAP 能力のいずれも設定しない場合、D3DDECLUSAGE_TEXCOORD を含む頂点要素には、D3DDECLTYPE_FLOAT2 のみが許可される。
DirectX 9.0 宣言から FVF ビットへのマッピング
データ タイプ | 使用法 | 使用法インデックス | FVF |
---|---|---|---|
D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_POSITION | 0 | D3DFVF_XYZ |
D3DDECLTYPE_FLOAT4 | D3DDECLUSAGE_POSITIONT | 0 | D3DFVF_XYZRHW |
D3DDECLTYPE_FLOATn | D3DDECLUSAGE_BLENDWEIGHT | 0 | D3DFVF_XYZBn |
D3DDECLTYPE_UBYTE4 | D3DDECLUSAGE_BLENDINDICES | 0 | D3DFVF_XYZB (nWeights+1) |
D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_NORMAL | 0 | D3DFVF_NORMAL |
D3DDECLTYPE_FLOAT1 | D3DDECLUSAGE_PSIZE | 0 | D3DFVF_PSIZE |
D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_COLOR | 0 | D3DFVF_DIFFUSE |
D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_COLOR | 1 | D3DFVF_SPECULAR |
D3DDECLTYPE_FLOATm | D3DDECLUSAGE_TEXCOORD | n | D3DFVF_TEXCOORDSIZEm(n) |
D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_POSITION | 1 | 不適用 |
D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_NORMAL | 1 | 不適用 |
ProcessVertices を含む頂点宣言の使用法
ProcessVertices の出力を記述するには、頂点宣言を使える。このような宣言は、次の規則に従う必要がある。
- ストリーム ゼロだけが使える。
- 頂点要素は同じオフセットを共有したり、お互いにオーバーラップしたりできない。
- D3DDECLMETHOD_DEFAULT メソッドのみが許可される。
- D3DDECLTYPE_FLOATn または D3DDECLTYPE_D3DCOLOR データ型のみが使える。
- (D3DDECLUSAGE_POSITION, 0) または (D3DDECLUSAGE_POSITIONT,0) を含む頂点要素は不要である。
- (D3DDECLUSAGE_POSITION, 0) および (D3DDECLUSAGE_POSITIONT,0) を含む頂点要素は、同じ宣言に存在することはできない。
- このような宣言を使う場合、現在の頂点シェーダはバージョン 3.0 以降でなくてはならない。