関数の頂点処理を修正しました (Direct3D 9)

固定関数の頂点パイプラインで、頂点バッファー内の頂点を処理すると、デバイスの現在の変換マトリックスが適用されます。 必要に応じて、照明、クリップ フラグの生成、エクステントの更新などの頂点操作も適用できます。 固定関数の頂点処理を使用する場合、変換先の頂点バッファー内の要素の変更は 、D3DPV_DONOTCOPYDATA フラグによって制御されます。 このフラグは、固定関数の頂点処理にのみ適用されます。 IDirect3DDevice9 インターフェイスは、頂点を処理するために IDirect3DDevice9::P rocessVertices メソッドを公開します。 頂点シェーダーから入力データ ストリームのセットに頂点を処理し、 IDirect3DDevice9::P rocessVertices メソッドを呼び出して、インターリーブされた頂点データの単一ストリームを宛先頂点バッファーに生成します。 メソッドは、メソッドがターゲットとする頂点の位置と量、変換先の頂点バッファー、および処理オプションを記述する 5 つのパラメーターを受け取ります。 呼び出しの後、宛先バッファーには処理された頂点データが含まれます。

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

最後のパラメーター Flags は、 メソッドの特別な処理オプションを決定します。 このパラメーターは、既定の頂点処理の場合は 0 に、場合によっては処理を最適化するために D3DPV_DONOTCOPYDATA に設定できます。 また、D3DPV_DONOTCOPYDATA値と、宛先バッファーに適した 1 つ以上の D3DLOCK 値を組み合わせることもできます。 フラグを 0 に設定した場合、頂点操作の影響を受けなかったターゲット頂点バッファーの頂点形式の頂点コンポーネントは、頂点シェーダーからコピーされるか、0 に設定されます。 ただし、D3DPV_DONOTCOPYDATAを使用する場合、このデータが Direct3D によって生成されない限り、 IDirect3DDevice9::P rocessVertices はターゲット バッファー内の色とテクスチャの座標情報を上書きしません。 拡散色は、照明が有効になっているときに生成されます。つまり、D3DRS_LIGHTINGが TRUE に設定されます。 反射色は、照明が有効で、反射が有効になっている場合、つまり、D3DRS_SPECULARENABLEとD3DRS_LIGHTINGが TRUE に設定されている場合に生成されます。 また、霧が有効になっている場合は、反射色も生成されます。 テクスチャ座標は、テクスチャ変換またはテクスチャ生成が有効な場合に生成されます。 IDirect3DDevice9::P rocessVertices は、現在のレンダリング状態を使用して、どの頂点処理を行う必要があるかを決定します。

変換先頂点バッファーの FVF の使用設定

IDirect3DDevice9::P rocessVertices メソッドでは、ターゲット頂点バッファーの D3DFVF に対して特定の設定が必要です。 FVF の使用設定は、頂点処理の現在の設定と互換性がある必要があります。

関数の頂点の固定処理の場合、 IDirect3DDevice9::P rocessVertices には次の FVF 設定が必要です。

  • 位置の種類は常に D3DFVF_XYZRHW 。そのため、D3DFVF_XYZと D3DFVF_XYZB5 を介したD3DFVF_XYZB1は無効です。
  • D3DFVF_NORMAL、D3DFVF_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::D rawPrimitive 呼び出し中に発生しますが、アプリケーション プログラマには表示されないことに注意してください。 この場合、Direct3D はテクスチャ座標の新しいセットを生成します。 テクスチャ座標の新しいセットは、テクスチャ ステージをステップ実行し、テクスチャ生成、テクスチャ変換、テクスチャ座標インデックスの設定を分析して、そのステージに一意のテクスチャ座標セットが必要かどうかを判断することによって派生します。 新しいセットが必要になるたびに、順に割り当てられます。 最大要件と一般的な要件はステージごとに 1 セットですが、D3DTSS_TEXCOORDINDEXを介した非変換テクスチャ座標の共有が原因で少なくなる可能性があることに注意してください。

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

  • そのステージに対してテクスチャの生成が有効になっています。
  • そのステージに対してテクスチャ変換が有効になっています。
  • 変換されていない入力テクスチャ座標は、初めてD3DTSS_TEXCOORDINDEXを介して参照されます。

Direct3D でテクスチャ座標が生成されている場合、アプリケーションは次のアクションを実行する必要があります。

  1. 適切な FVF 使用法で宛先頂点バッファーを使用します。
  2. 後処理されたテクスチャ座標の配置に従って、テクスチャ ステージのD3DTSS_TEXCOORDINDEXを再プログラミングします。 D3DTSS_TEXCOORDINDEX設定の再プログラミングは、処理された頂点バッファーが後続の IDirect3DDevice9::D rawPrimitive および IDirect3DDevice9::D rawIndexedPrimitive 呼び出しで使用されるときに行われることに注意してください。

最後に、テクスチャ座標の次元 (D3DFVF_TEX8 を通じてD3DFVF_TEX0) を次のように設定する必要があります。

  • テクスチャ座標セットごとに、テクスチャ変換とテクスチャ生成が無効になっている場合、出力テクスチャ座標の次元は入力と一致する必要があります。 テクスチャ変換が有効になっている場合、出力次元は、D3DTTFF_COUNT1、D3DTTFF_COUNT2、D3DTTFF_COUNT3、またはD3DTTFF_COUNT4設定によって定義された数と一致する必要があります。 テクスチャ変換が無効でテクスチャ生成が有効になっている場合、出力次元はテクスチャ生成モードの設定と一致する必要があります。現在、すべてのモードで 3 つの float 値が生成されます。

IDirect3DDevice9::P rocessVertices が互換性のない宛先頂点バッファー FVF コードのために失敗すると、想定されるコードがデバッグ出力に出力されます (デバッグ ビルドのみ)。

頂点バッファー