固定機能頂点処理

固定機能頂点処理

固定機能頂点パイプラインでは、頂点バッファでの頂点処理に、デバイスの現在のトランスフォーム行列を適用できる。オプションで、ライティング、クリップ フラグの生成、範囲の更新などの頂点処理も適用できる。固定機能による頂点処理を使用する場合、転送先頂点バッファの要素の修正処理は D3DPV_DONOTCOPYDATA フラグによって制御される。このフラグは、固定機能による頂点処理のみに適用できる。IDirect3DDevice9 インターフェイスは、頂点処理用の IDirect3DDevice9::ProcessVertices メソッドを公開する。頂点シェーダの頂点を入力データ ストリーム セットに処理し、IDirect3DDevice9::ProcessVertices メソッドを呼び出してインターリーブされた頂点データのストリームを 1 つ生成する。このメソッドは、メソッドがターゲットとする頂点の位置と量、転送先頂点バッファ、および処理オプションを記述する 5 つの引数を受け取る。呼び出し後、処理された頂点データは転送先バッファに格納される。

第 1 引数 SrcStartIndex、第 2 引数 DestIndex、第 3 引数 VertexCount は、それぞれ、最初にロードされる頂点のインデックス、頂点が配置される転送先頂点バッファのインデックス、処理して転送先バッファに配置する頂点の総数を示す。第 4 引数 pDestBuffer には、転送元頂点を受け取る頂点バッファ オブジェクトの IDirect3DVertexBuffer9 インターフェイスのアドレスを設定する。SrcStartIndex パラメータは、メソッドが頂点の処理を開始するインデックスを指定する。

最後の引数 Flags は、メソッドの特殊な処理オプションを指定する。この引数を 0 に設定すると、デフォルトの頂点処理が実行され、D3DPV_DONOTCOPYDATA を設定すると、何らかの状況において処理が最適化される。Flags を 0 に設定したときは、頂点処理の影響を受けない転送先頂点バッファの頂点フォーマットの頂点の成分は、頂点シェーダからコピーするか、0 に設定される。ただし、D3DPV_DONOTCOPYDATA を使用すると、Microsoft® Direct3D® によって色および座標情報が生成されない限り、ProcessVertices は色および座標情報を上書きしない。ライティングが有効、つまり D3DRS_LIGHTING が TRUE のときは、ディフューズ色が生成される。ライティングが有効でスペキュラが有効、つまり D3DRS_SPECULARENABLE および D3DRS_LIGHTING が TRUE のときは、スペキュラ色が生成される。スペキュラ色は、フォグが有効のときも生成される。テクスチャ座標は、テクスチャ トランスフォームまたはテクスチャ生成が有効のときに生成される。IDirect3DDevice9::ProcessVertices は、現在のレンダリング ステートを使って、実行する頂点処理を決定する。

転送先頂点バッファの FVF 使用設定

IDirect3DDevice9::ProcessVertices メソッドでは、転送先頂点バッファの D3DFVF に対して特殊な設定が必要となる。柔軟な頂点フォーマット (FVF) の使用設定には、頂点処理の現在の設定との互換性がなければならない。

固定機能による頂点処理の場合、IDirect3DDevice9::ProcessVertices は次のような FVF 設定を必要とする。

  • 位置座標のタイプは常に D3DFVF_XYZRHW であり、D3DFVF_XYZ および D3DFVF_XYZB1 ~ D3DFVF_XYZB5 は無効である。
  • D3DFVF_NORMAL、D3DFVF_RESERVED0、および D3DFVF_RESERVED2 フラグは設定しない。
  • 次の条件の論理和演算子が TRUE を返す場合、D3DFVF_DIFFUSE フラグを設定する必要がある。
    • ライティングが有効、つまり D3DRS_LIGHTING が TRUE である。
    • ライティングが無効であり、入力頂点ストリームにディフューズ色があり、D3DPV_DONOTCOPYDATA が設定されていない。
  • 次の条件の論理和演算子が TRUE を返す場合、D3DFVF_SPECULAR フラグを設定する必要がある。
    • ライティングが有効でスペキュラ色が有効、つまり D3DRS_SPECULARENABLE が TRUE である。
    • ライティングが無効であり、入力頂点ストリームにスペキュラ色が存在し、D3DPV_DONOTCOPYDATA が設定されていない。
    • 頂点フォグが有効、つまり D3DRS_FOGVERTEXMODE が D3DFOG_NONE に設定されていない。

また、テクスチャ座標のカウント数は、以下の方法で設定する。

  • すべてのアクティブ テクスチャ ステージに対して、テクスチャ トランスフォームとテクスチャ生成が無効の場合、D3DPV_DONOTCOPYDATA は設定されず、出力テクスチャ座標の数とタイプは、入力テクスチャ座標の数とタイプと一致しなければならない。D3DPV_DONOTCOPYDATA が設定されていて、テクスチャ トランスフォームとテクスチャ生成が無効な場合、出力テクスチャ座標は無視される。
  • いずれかのアクティブ テクスチャ ステージに対して、テクスチャ トランスフォームまたはテクスチャ生成が有効になっている場合、出力される頂点は入力された頂点よりも多くのテクスチャ座標を必要とすることがある。これは、テクスチャ生成によって生成されたり、テクスチャ トランスフォームによって派生したテクスチャ座標による、テクスチャ座標の増加によるものである。IDirect3DDevice9::DrawPrimitive 呼び出しでも同様の増加が発生するが、この場合はアプリケーション プログラマからは見えないことに注意する。このケースでは、Direct3D によって新しいテクスチャ座標セットが生成される。テクスチャ ステージが進み、テクスチャ生成、テクスチャ トランスフォーム、テクスチャ座標インデックスの設定を分析して、そのステージに固有のテクスチャ座標セットが必要かどうかを判定するにつれて、新しいテクスチャ座標セットが生成される。新しいセットが必要になるたびに、追加された順に割り当てられる。最大の、そして一般的な必要数は 1 ステージあたり 1 セットであるが、D3DTSS_TEXCOORDINDEX を介して未トランスフォームのテクスチャ座標を共有することによって、これより少ない場合もある。

つまり、テクスチャがそのステージにバインドされていて、以下の条件のいずれかが TRUE の場合、各テクスチャ ステージには、新しいテクスチャ座標セットが生成される。

  • そのステージのテクスチャ生成が有効である。
  • そのステージのテクスチャ トランスフォームが有効である。
  • 未トランスフォームの入力テクスチャ座標が、D3DTSS_TEXCOORDINDEX を介して初めて参照される。

Direct3D がテクスチャ座標を生成するとき、アプリケーションでは次のアクションを実行する必要がある。

  1. 適切な FVF 使用で転送先頂点バッファを使用する。
  2. 処理後のテクスチャ座標の配置に応じて、テクスチャ ステージの D3DTSS_TEXCOORDINDEX を再処理する。処理した頂点バッファを、その後の IDirect3DDevice9::DrawPrimitive 呼び出しや IDirect3DDevice9::DrawIndexedPrimitive 呼び出しで使うと、D3DTSS_TEXCOORDINDEX 設定が再処理されるので注意する。

最後に、テクスチャ座標のサイズ (D3DFVF_TEX0 ~ D3DFVF_TEX8) は、以下のように設定しなければならない。

  • 各テクスチャ座標セットに対するテクスチャ トランスフォームおよびテクスチャ生成が無効の場合、出力テクスチャ座標のサイズは入力と一致しなければならない。テクスチャ トランスフォームが有効の場合、出力のサイズは D3DTTFF_COUNT1、D3DTTFF_COUNT2、D3DTTFF_COUNT3、または D3DTTFF_COUNT4 によって定義されるサイズと一致しなければならない。テクスチャ トランスフォームが無効でテクスチャ生成が有効の場合、出力のサイズは、テクスチャ生成モードの設定に一致しなければならない。現在のところ、すべてのモードで 3 つの float 型の値が生成される。

転送先頂点バッファの FVF コードと互換性がないために IDirect3DDevice9::ProcessVertices が失敗した場合、デバッグ出力に互換性を持つコードが出力される (デバッグ ビルドのみ)。