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 の組み合わせになる。

詳細については、「頂点フォーマットについて」を参照すること。