Platform SDK: DirectX

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

Direct3D レンダリング メソッドで使用する頂点フォーマット記述に D3DFVF_XYZ フラグを含め、D3DFVF_NORMAL フラグを含めていない場合、その頂点は「未トランスフォーム ライティング済みの頂点」として識別される (フラグの依存および排他関係の詳細については、「柔軟な頂点フォーマット フラグ」を参照すること)。

「未トランスフォーム ライティング済みの頂点」を使用すると、アプリケーションは Direct3D に頂点に対するライティング計算を実行しないように要求するが、Direct3D は以前に設定されたワールド行列、ビュー行列、および射影行列を使用して頂点をトランスフォームする。ライティング計算は実行されないので、頂点法線は必要ない。システムは、各頂点のディフューズ成分とスペキュラ成分をシェーディングに使用する。これらの色は任意に指定しても、独自のライティング公式を使用して計算してもよい。ディフューズ成分またはスペキュラ成分を含めない場合は、デフォルト カラーが使用される。ディフューズ色のデフォルト値は 0xFFFFFFFF で、スペキュラ色のデフォルト値は 0x0 である。

位置座標といくらかの色情報を含めるという点を除いては、その他の頂点タイプと同様、未ライティングの頂点フォーマットにテクスチャ座標セットを含めたり、無視することができる。

[C++]

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

#define D3DFVF_LVERTEX ( D3DFVF_XYZ | D3DFVF_RESERVED1 | D3DFVF_DIFFUSE | \
 D3DFVF_SPECULAR | D3DFVF_TEX1 )

ここで注意するのは、ヘルパー マクロには D3DLVERTEX 構造体を使用することをシステムに指示する D3DFVF_RESERVED1 フラグが含まれており、この構造体には dwReserved メンバが含まれていることである。D3DLVERTEX を使用するときにこのメンバが必要なのは、頂点フォーマットには通常予約済みのフィールドが含まれていないためである。D3DFVF_RESERVED1 フラグは、頂点の位置座標とディフューズ色頂点成分の間に未使用の DWORD が存在することをシステムに知らせる。

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

//
// この頂点の頂点フォーマット記述は、
// (D3DFVF_XYZ | D3DFVF_DIFFUSE |// D3DFVF_SPECULAR | D3DFVF_TEX3)
// になる。
//
typedef struct _LITVERTEX {
float x, y, z;        // 位置座標
    
DWORD dwDiffuseRGBA;  // ディフューズ色
    
DWORD dwSpecularRGBA; // スペキュラ色
    
float tu1,    // テクスチャ座標
tv1;
    
float tu2,
tv2;
    
float tu3,
tv3;
} LITVERTEX, *LPLITVERTEX;

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

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

[Visual Basic]

Visual Basic で記述されたアプリケーションでは、独自の頂点フォーマットを定義しても、ライティングのある頂点に D3DLVERTEX 型を使用してもよい。D3DLVERTEX 型にアプリケーションで必要なすべてのフィールドが含まれていない場合は、別の型を定義することができる。新しい構造体を宣言するときは、必ず頂点成分が正しい順序になるようにする。次のコードは、ディフューズ頂点色、スペキュラ頂点色、および 3 つのテクスチャ座標セットを持つ、未トランスフォームでライティング済みの有効な頂点を宣言する。

'
// この頂点の頂点フォーマット記述は、
// (D3DFVF_XYZ Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR Or D3DFVF_TEX3)(D3DFVF_XYZ Or D3DFVF_DIFFUSE Or
// になる。
'
Type LITVERTEX
x As Single ' 位置座標
y As Single
z As Single
    
DiffuseRGBA As Long ' ディフューズ色
    
SpecularRGBA As Long ' スペキュラ色
    
tu1 As Single ' テクスチャ座標
tv1 As Single
    
tu2 As Single
tv2 As Single
    
tu3 As Single
tv3 As Single
End Type

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

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