Microsoft DirectX 8.0 (C++) |
頂点フォーマット記述に D3DFVF_XYZRHW フラグを含めた場合、アプリケーションで「トランスフォーム済み ライティング済みの頂点」を使用することがシステムに通知される。これは、Microsoft® Direct3D® でワールド行列、ビュー行列、または射影行列を使用して頂点をトランスフォームせず、ライティング計算も実行しないことを意味している。つまり、Direct3D は、アプリケーションでこれらの処理が実行済みであると見なしている。これにより、既存の 3D アプリケーションを Direct3D に移植するとき、トランスフォーム済み ライティング済みの頂点がそのまま使える。要するに、Direct3D は、「トランスフォーム済み ライティング済みの頂点」をまったく変更しない。ドライバに直接渡してラスタ化を実行する。
未トランスフォームの頂点とライティングに関連付けられている頂点フォーマット フラグ (D3DFVF_XYZ と D3DFVF_NORMAL) は、D3DFVF_XYZRHW がある場合は使用できない。フラグの依存および排他関係の詳細については、「柔軟な頂点フォーマット フラグ」を参照すること。
頂点位置座標を指定するときは、トランスフォーム済みのものを指定しなければならない。x と y の値はスクリーン座標内に存在している必要があり、z は Z バッファで使用されるピクセルの深度値でなければならない。z 値は 0.0 〜 1.0 の値である。0.0 はユーザーに最も近い位置座標で、1.0 は可視領域内の最も遠い位置座標である。「トランスフォーム済み ライティング済みの頂点」は、位置座標のすぐ後に RHW 値 (同次 W の逆数) を含んでいなければならない。RHW は、射影空間内で頂点が存在する同次ポイント (x、y、z、w) からの W 座標の逆数である。この値は、z 軸に沿った、視点から頂点までの距離になることが多い。
位置座標と RHW の条件を除けば、この頂点フォーマットは、「未トランスフォーム ライティング済みの頂点」と同じである。これまでの説明を以下にまとめる。
独自の頂点フォーマットを定義するときは、どの頂点の成分がアプリケーションで必要であるかに注意し、必ず正しく順序付けた構造体を宣言して、必要な順序で頂点の成分が表示されるようにしなければならない。次のサンプル コードは、ディフューズ頂点カラー、スペキュラ頂点カラー、およびテクスチャ座標セットを 1 つだけ持つ、トランスフォーム済みでライティングのある有効な頂点を宣言する。
// // この頂点の頂点フォーマット記述は、 // (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1) になる。 // typedef struct _TRANSLITVERTEX { float x, y; // スクリーン座標 float z; // Z バッファ深度 float rhw; // 同次 W の逆数 DWORD Diffuse; // ディフューズ色 DWORD Specular; // スペキュラ色 float tu1, tv1; // テクスチャ座標 } TRANSLITVERTEX, *LPTRANSLITVERTEX;
この構造体の頂点記述は、柔軟な頂点フォーマット フラグ D3DFVF_XYZRHW、D3DFVF_DIFFUSE、D3DFVF_SPECULAR、および D3DFVF_TEX1 の組み合わせになる。
詳細については、「頂点フォーマットについて」を参照すること。