次の方法で共有


固定関数頂点処理 (Direct3D 9)

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

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

最後のパラメーター Flags は、メソッドの特別な処理オプションを決定します。 このパラメーターは、既定の頂点処理の場合は 0 に、場合によっては処理を最適化するために D3DPV_DONOTCOPYDATA に設定できます。 また、D3DPV_DONOTCOPYDATA値と、宛先バッファーに適した 1 つ以上の D3DLOCK 値を組み合わせることもできます。 フラグを 0 に設定すると、頂点操作の影響を受けず、ターゲット頂点バッファーの頂点形式の頂点コンポーネントが頂点シェーダーからコピーされるか、0 に設定されます。 ただし、D3DPV_DONOTCOPYDATAを使用する場合、IDirect3DDevice9::P rocessVertices は、このデータが Direct3D によって生成されない限り、宛先バッファー内の色とテクスチャ座標の情報を上書きしません。 拡散色は、照明を有効にすると生成されます。つまり、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 コードのために失敗した場合、想定されるコードがデバッグ出力に出力されます (デバッグ ビルドのみ)。

頂点バッファー