固定機能頂点処理 (Direct3D 9)

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

1、2、および 3 番目のパラメーター、SrcStartIndex、DestIndex、および VertexCount は、それぞれ、読み込む最初の頂点のインデックス、デスティネーション バッファー内で頂点を配置する位置のインデックス、処理してデスティネーション バッファー内に配置する頂点の合計数を表します。4 番目のパラメーター、pDestBuffer には、ソースの頂点を受け取る頂点バッファー オブジェクトの IDirect3DVertexBuffer9 インターフェイスのアドレスを設定します。SrcStartIndex パラメーターは、メソッドが頂点処理を開始する位置のインデックスを指定します。

最後のパラメーターである Flags は、メソッドの特別な処理オプションを決定します。既定の頂点処理の場合は、このパラメーターを 0 に設定するか、場合によっては D3DPV_DONOTCOPYDATA に設定して処理を最適化することができます。また、D3DPV_DONOTCOPYDATA 値を、デスティネーション バッファーに適した 1 つ以上の D3DLOCK 値と組み合わせることもできます。Flags を 0 に設定すると、デスティネーション頂点バッファーの頂点フォーマットを持つ、頂点処理の影響を受けない頂点コンポーネントも頂点シェーダーからコピーされるか、0 に設定されます。ただし、D3DPV_DONOTCOPYDATA を使用する場合、IDirect3DDevice9::ProcessVertices は、デスティネーション バッファー内のカラーおよびテクスチャー座標情報が Direct3D によって生成されていないときには、このデータを上書きしません。ライティングが有効である (D3DRS_LIGHTING が TRUE に設定されている) 場合は、ディフューズ色が生成されます。ライティングが有効で、かつスペキュラも有効である (D3DRS_SPECULARENABLE と D3DRS_LIGHTING が TRUE に設定されている) 場合は、スペキュラ色が生成されます。スペキュラ色はフォグが有効な場合にも生成されます。テクスチャー座標は、テクスチャー変換またはテクスチャー生成が有効になっている場合に生成されます。IDirect3DDevice9::ProcessVertices は、現在のレンダリング ステートを使用して実行する頂点処理を決定します。

デスティネーション頂点バッファー用の FVF 使用の設定

IDirect3DDevice9::ProcessVertices メソッドでは、デスティネーション頂点バッファーの D3DFVF に特定の設定を行う必要があります。FVF 使用の設定は、頂点処理の現在の設定と一致している必要があります。

固定機能頂点処理では、IDirect3DDevice9::ProcessVertices で次の FVF 設定を行う必要があります。

  • 位置タイプは常に D3DFVF_XYZRHW です。したがって、D3DFVF_XYZ および D3DFVF_XYZB1D3DFVF_XYZB5 は無効です。
  • D3DFVF_NORMALD3DFVF_RESERVED0、および D3DFVF_RESERVED2 フラグを設定することはできません。
  • 次の条件の OR 演算が TRUE を返す場合は、D3DFVF_DIFFUSE フラグを設定する必要があります。
    • ライティングが有効 (D3DRS_LIGHTING が TRUE) である。
    • ライティングが無効で、入力頂点ストリーム内にディフューズ色が存在し、かつ D3DPV_DONOTCOPYDATA が設定されていない。
  • 次の条件の OR 演算が TRUE を返す場合は、D3DFVF_SPECULAR フラグを設定する必要があります。
    • ライティングが有効で、かつスペキュラ色が有効 (D3DRS_SPECULARENABLE が TRUE) である。
    • ライティングが無効で、入力頂点ストリーム内にスペキュラ色が存在し、かつ D3DPV_DONOTCOPYDATA が設定されていない。
    • 頂点フォグが有効である (D3DRS_FOGVERTEXMODE が D3DFOG_NONE に設定されていない)。

さらに、テクスチャー座標のカウントは次のように設定する必要があります。

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

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

  • そのステージでテクスチャー生成が有効である。
  • そのステージでテクスチャー変換が有効である。
  • 未変換の入力テクスチャー座標が D3DTSS_TEXCOORDINDEX を使用して初めて参照される。

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

  1. 適切な FVF 使用を指定してデスティネーション頂点バッファーを使用する。
  2. ポストプロセッシング済みのテクスチャー座標の配置に応じてテクスチャー ステージの D3DTSS_TEXCOORDINDEX を再プログラムする。D3DTSS_TEXCOORDINDEX 設定の再プログラムは、処理された頂点バッファーがその後 IDirect3DDevice9::DrawPrimitive および IDirect3DDevice9::DrawIndexedPrimitive 呼び出しで使用されるときに発生することに注意してください

最後に、テクスチャー座標のサイズ (D3DFVF_TEX0D3DFVF_TEX8) は、次のように設定する必要があります。

  • 各テクスチャー座標セットでテクスチャー変換およびテクスチャー生成が無効になっている場合は、出力テクスチャー座標のサイズは入力と一致する必要があります。テクスチャー変換が有効な場合は、出力のサイズは D3DTTFF_COUNT1、D3DTTFF_COUNT2、D3DTTFF_COUNT3、または D3DTTFF_COUNT4 の設定で定義されたカウントと一致する必要があります。テクスチャー変換が無効で、テクスチャー生成が有効な場合は、出力のサイズはテクスチャー生成モードの設定と一致する必要があります。現在、すべてのモードで 3 つの浮動小数点値が生成されます。

デスティネーション頂点バッファーの FVF コードとの不一致が原因で IDirect3DDevice9::ProcessVertices が失敗する場合は、デバッグ出力に期待されるコードが出力されます (デバッグ ビルドのみ)。