Platform SDK: DirectX |
レンダリング メソッドに渡す頂点記述に D3DFVF_XYZ (または D3DFVF_XYZBn フラグのいくつか) および D3DFVF_NORMAL フラグがある場合、「未トランスフォーム 未ライティングの頂点」タイプが指定されている。「未トランスフォーム 未ライティングの頂点」を使用すると、アプリケーションは Direct3D にその内部アルゴリズムを使用してすべてのトランスフォーム & ライティング処理を実行するよう効率的に要求できる (必要であれば、D3DRENDERSTATE_LIGHTING レンダリング ステートを FALSE に設定して、レンダリングするプリミティブに対して Direct3D ライティング エンジンを無効にできる)。
この頂点タイプは、アプリケーションで独自のトランスフォーム & ライティング エンジンを実装する必要がないので、ほとんどのアプリケーションで使用される。ただし、システムによって自動的に計算が実行されるため、各頂点に対していくらかの情報を指定しておく必要がある。
これらの条件以外では、その他の頂点成分を柔軟に使用 (または無視) できる。たとえば、ディフューズまたはスペキュラ色を未トランスフォームの頂点に含めることができる (これは DirectX 6.0 以前ではできなかった)。各頂点に個々の色を含めると、マテリアル カラーのみ使用したライティング計算を実行するよりも、ずっと繊細で柔軟なシェーディング エフェクトが得られる。ただし、この場合、D3DRENDERSTATE_COLORVERTEX レンダリング ステートを使用して個々の頂点色を有効にする必要がある。また、未トランスフォーム 未ライティングの頂点には、最大 8 つまでテクスチャ座標セットを含めることができる。
アプリケーションでは、頂点に対して従来の D3DVERTEX 構造体も使用できる。実際、この頂点フォーマットを識別するショートカット マクロが、d3dtypes.h ヘッダー ファイルに定義されている。
#define D3DFVF_VERTEX ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 )
D3DVERTEX 構造体がアプリケーションの要件に合わないときは、その要件を満たすように独自に定義できる。ただし、どの頂点成分がアプリケーションで必要であるかに注意し、必ず正しく順序付けた構造体を宣言して、必要な順序で頂点成分が表示されるようにしなければならない。次のコードは、位置座標、頂点法線、ディフューズ色、および 2 つのテクスチャ座標セットを含む有効な頂点フォーマット構造体を宣言する。
// // この頂点の頂点フォーマット記述は、 // (D3DFVF_XY | D3DFVF_NORMAL |// D3DFVF_DIFFUSE | D3DFVF_TEX2) // になる。 // typedef struct _UNLITVERTEX { float x, y, z; // 位置座標 float nx, ny, nz; // 法線 DWORD dwDiffuseRGBA; // ディフューズ色 float tu1, // テクスチャ座標 tv1; float tu2, tv2; } UNLITVERTEX, *LPUNLITVERTEX;
この構造体の頂点記述は、柔軟な頂点フォーマット フラグ D3DFVF_XYZ、D3DFVF_NORMAL、D3DFVF_DIFFUSE、および D3DFVF_TEX2 の組み合わせになる。IDirect3DDevice7::DrawPrimitive などのレンダリング メソッドは、頂点配列のアドレスを void 型のポインタとして受け取るので、レンダリング メソッドを呼び出すときは、頂点配列ポインタを LPVOID データ型にキャストしなければならない。
詳細については、「頂点フォーマットについて」を参照すること。
これらの条件以外では、その他の頂点成分を柔軟に使用 (または無視) できる。たとえば、ディフューズまたはスペキュラ色を未トランスフォームの頂点に含めることができる (これは DirectX 6.0 以前ではできなかった)。各頂点に個々の色を含めると、マテリアル カラーのみ使用したライティング計算を実行するよりも、ずっと繊細で柔軟なシェーディング エフェクトが得られる。ただし、この場合、D3DRENDERSTATE_COLORVERTEX レンダリング ステートを使用して個々の頂点色を有効にする必要がある。また、未トランスフォーム 未ライティングの頂点には、最大 8 つまでテクスチャ座標セットを含めることができる。Visual Basic アプリケーションでは、頂点に D3DVERTEX 型を使用できる。
D3DVERTEX 型がアプリケーションの要件に合わないときは、その要件を満たすように独自に定義ができる。ただし、どの頂点成分がアプリケーションで必要であるかに注意し、必ず正しく順序付けた構造体を宣言して、必要な順序で頂点成分が表示されるようにしなければならない。次のコードは、位置座標、頂点法線、ディフューズ色、および 2 つのテクスチャ座標セットを含む有効な頂点フォーマット構造体を宣言する。
' // この頂点の頂点フォーマット記述は、 // (D3DFVF_XYZ Or D3DFVF_NORMAL Or D3dFVF_DIFFUSE Or D3DFVF_TEX2)(D3DFVF_XYZ Or D3DFVF_NORMAL Or // になる。 ' Type UNLITVERTEX x As Single ' 位置座標 y As Single z As Single nx As Single ' 法線 ny As Single nz As Single DiffuseRGBA As Long ' ディフューズ色 tu1 As Single ' テクスチャ座標 tv1 As Single tu2 As Single ' テクスチャ座標 tv2 As Single End Type
この構造体の頂点記述は、柔軟な頂点フォーマット フラグ D3DFVF_XYZ、D3DFVF_NORMAL、D3DFVF_DIFFUSE、および D3DFVF_TEX2 の組み合わせになる。Direct3DDevice7.DrawPrimitive などのレンダリング メソッドは、頂点配列の第 1 要素を型 Any として受け取り、すべての種類の頂点フォーマットを格納する。
詳細については、「頂点フォーマットについて」を参照すること。