Platform SDK: DirectX

トランスフォーム済み ライティング済みの頂点

頂点フォーマット記述に D3DFVF_XYZRHW フラグを含めた場合、アプリケーションで「トランスフォーム済み ライティング済みの頂点」を使用することがシステムに通知される。これは、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 の条件を除けば、この頂点フォーマットは、「未トランスフォーム ライティング済みの頂点」と同じである。これまでの説明を以下にまとめる。

[C++]

C++ で記述されたアプリケーションでは、「トランスフォーム済み ライティング済みの頂点」に対して従来の D3DTLVERTEX 構造体も使用できる。d3dtypes.h ヘッダー ファイルには、D3DTLVERTEX 構造体で宣言する頂点フォーマットを記述するために使用できる、次のヘルパー マクロが定義されている。

#define D3DFVF_TLVERTEX ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | \
  D3DFVF_TEX1 ) 

必要なフィールドが D3DTLVERTEX 構造体に含まれていないことがある。このような場合、必要なフィールドを含む別の構造体を定義できるが、必ず頂点成分を正しい順序で配置すること。次のコードは、ディフューズ頂点色、スペキュラ頂点色、およびテクスチャ座標セットを 1 つだけ持つ、トランスフォーム済みでライティングのある有効な頂点を宣言する。

//
// この頂点の頂点フォーマット記述は、
// (D3DFVF_XYZRHW | D3DFVF_DIFFUSE |// D3DFVF_SPECULAR | D3DFVF_TEX1)
// になる。
//
typedef struct _TRANSLITVERTEX {
    float x, y;   // スクリーン座標
    
    float z;      // Z バッファ深度
    
    float rhw;    // 同次 W の逆数
    
    DWORD dwDiffuseRGBA;  // ディフューズ色
    
    DWORD dwSpecularRGBA; // スペキュラ色
    
    float tu1,    // テクスチャ座標
  tv1;
} TRANSLITVERTEX, *LPTRANSLITVERTEX; 

この構造体の頂点記述は、柔軟な頂点フォーマット フラグ D3DFVF_XYZRHW、D3DFVF_DIFFUSE、D3DFVF_SPECULAR、および D3DFVF_TEX1 の組み合わせになる。IDirect3DDevice7::DrawPrimitive などのレンダリング メソッドは、頂点配列のアドレスを void 型のポインタとして受け取るので、レンダリング メソッドを呼び出すときは、頂点配列ポインタを LPVOID データ型にキャストしなければならない。

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

[Visual Basic]

Visual Basic アプリケーションでは、「トランスフォーム済み ライティング済みの頂点」に対して従来の D3DTLVERTEX 型も使用できる。必要なフィールドが D3DTLVERTEX 型に含まれていないことがある。このような場合、必要なフィールドを含む別の構造体を定義できるが、必ず頂点成分を正しい順序で配置すること。次のコードは、ディフューズ頂点色、スペキュラ頂点色、およびテクスチャ座標セットを 1 つだけ持つ、トランスフォーム済みでライティングのある有効な頂点を宣言する。

'
' この頂点の頂点フォーマット記述は、
' (D3DFVF_XYZRHW Or D3DFVF_DIFFUSE Or (D3DFVF_XYZRHW Or D3DFVF_DIFFUSE Or
' D3DFVF_SPECULAR Or D3DFVF_TEX1) である。
'
Type TRANSLITVERTEX
x As Single ' スクリーン座標
y As Single
    
z As Single ' z バッファ深度
    
rhw As Single ' 同次 W の逆数
    
DiffuseRGBA As Long ' ディフューズ色
    
dwSpecularRGBA As Long ' スペキュラ色
    
tu1 As Single ' テクスチャ座標
tv1 As Single
End Type

この構造体の頂点記述は、柔軟な頂点フォーマット フラグ D3DFVF_XYZRHW、D3DFVF_DIFFUSE、D3DFVF_SPECULAR、および D3DFVF_TEX1 の組み合わせになる。Direct3DDevice7.DrawPrimitive などのレンダリング メソッドは、頂点配列の第 1 要素を型 Any として受け取り、すべての種類の頂点フォーマットを格納する。

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