転送先頂点バッファの FVF 使用設定
Direct3DDevice8.ProcessVertices メソッドでは、転送先頂点バッファの柔軟な頂点フォーマット フラグに対して特殊な設定が必要となる。柔軟な頂点フォーマット (FVF) の使用設定には、頂点処理の現在の設定との互換性がなければならない。
固定機能による頂点処理の場合、ProcessVertices は以下のような FVF 設定を必要とする。
- 位置座標のタイプは常に D3DFVF_XYZRHW であり、D3DFVF_XYZ および D3DFVF_XYZB1 〜 D3DFVF_XYZB5 は無効である。
- D3DFVF_NORMAL、D3DFVF_RESERVED0、および D3DFVF_RESERVED2 フラグは設定しない。
- 以下の条件の OR 演算子が TRUE を返す場合、D3DFVF_DIFFUSE フラグを設定する必要がある。
- ライティングが有効、つまり D3DRS_LIGHTING が TRUE である。
- ライティングが無効で、入力頂点ストリームにディフューズ色があり、D3DPV_DONOTCOPYDATA が設定されていない。
- 以下の条件の OR が TRUE を返す場合、D3DFVF_SPECULAR フラグを設定する必要がある。
また、テクスチャ座標のカウント数は、以下の方法で設定する。
- すべてのアクティブ テクスチャ ステージに対して、テクスチャ トランスフォームとテクスチャ生成が無効の場合、D3DPV_DONOTCOPYDATA は設定されず、出力テクスチャ座標の数およびタイプは、入力テクスチャ座標の数およびタイプと一致しなければならない。D3DPV_DONOTCOPYDATA が設定されていて、テクスチャ トランスフォームとテクスチャ生成が無効な場合、出力テクスチャ座標は無視される。
- いずれかのアクティブ テクスチャ ステージに対して、テクスチャ トランスフォームまたはテクスチャ生成が有効になっている場合、出力される頂点は入力された頂点よりも多くのテクスチャ座標を必要とすることがある。これは、テクスチャ生成によって生成されたりテクスチャ トランスフォームによって派生したテクスチャ座標による、テクスチャ座標の増殖によるものである。DrawPrimitive 呼び出しでも同様の増殖が発生するが、この場合はアプリケーション プログラマからは見えないことに注意すること。このケースでは、Microsoft® Direct3D® によって新しいテクスチャ座標セットが生成される。テクスチャ ステージが進み、テクスチャ生成、テクスチャ トランスフォーム、テクスチャ座標インデックスの設定を分析して、そのステージに固有のテクスチャ座標セットが必要かどうかを判定するにつれて、新しいテクスチャ座標セットが生成される。新しいセットが必要になるたびに、追加された順に割り当てられる。最大の、そして一般的な必要数は 1 ステージあたり 1 セットであるが、D3DTSS_TEXCOORDINDEX を介して未トランスフォームのテクスチャ座標を共有することによって、これより少ない場合もある。
つまり、テクスチャがそのステージにバインドされていて、以下の条件のいずれかが TRUE の場合、各テクスチャ ステージには、新しいテクスチャ座標セットが生成される。
- そのステージのテクスチャ生成が有効である。
- そのステージのテクスチャ トランスフォームが有効である。
- 未トランスフォームの入力テクスチャ座標が、D3DTSS_TEXCOORDINDEX を介して初めて参照される。
Direct3D がテクスチャ座標を生成するとき、アプリケーションは以下のアクションを実行する必要がある。
- 適切な FVF 使用で転送先頂点バッファを使用する。
- 処理後のテクスチャ座標の配置に応じて、テクスチャ ステージの D3DTSS_TEXCOORDINDEX を再プログラムする。処理した頂点バッファを、その後の Direct3DDevice8.DrawPrimitive 呼び出しや Direct3DDevice8.DrawIndexedPrimitive 呼び出しで使用すると、D3DTSS_TEXCOORDINDEX 設定が再プログラムされることに注意すること。
最後に、テクスチャ座標のサイズ (D3DFVF_TEX0 〜 D3DFVF_TEX8) は、以下のように設定しなければならない。
- 各テクスチャ座標セットに対するテクスチャ トランスフォームおよびテクスチャ生成が無効の場合、出力テクスチャ座標のサイズは入力と一致しなければならない。テクスチャ トランスフォームが有効の場合、出力のサイズは D3DTTFF_COUNT1、D3DTTFF_COUNT2、D3DTTFF_COUNT3、または D3DTTFF_COUNT4 によって定義されるカウントと一致しなければならない。テクスチャ トランスフォームが無効でテクスチャ生成が有効の場合、出力のサイズは、テクスチャ生成モードの設定に一致しなければならない。現在のところ、すべてのモードで 3 つの float 型の値が生成される。
転送先頂点バッファの FVF コードと互換性がないために ProcessVertices が失敗した場合、デバッグ出力に互換性を持つコードが出力される (デバッグ ビルドのみ)。