Microsoft DirectX 8.0 (C++) |
ライトを使用するための条件の 1 つは、各サーフェスが法線を持っていることである。これを処理するために、Lights サンプル プロジェクトでは別のカスタム頂点タイプを使用する。新しいカスタム頂点フォーマットには、3D 位置座標とサーフェスの法線が含まれる。サーフェスの法線は、Microsoft® Direct3D® によって内部的にライティングの計算に使用される。
struct CUSTOMVERTEX { D3DXVECTOR3 position; // 頂点の 3D 位置座標。 D3DXVECTOR3 normal; // 頂点のサーフェスの法線。 }; // カスタム FVF。 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
これで正しいベクトル フォーマットが定義されたので、Lights サンプル プロジェクトではアプリケーション定義関数 InitGeometry を呼び出して円柱を作成する。最初のステップは、次のサンプル コードのように、円柱のポイントを格納する頂点バッファを作成することである。
// 頂点バッファを作成する。 if( FAILED( g_pd3dDevice->CreateVertexBuffer( 50*2*sizeof(CUSTOMVERTEX), 0 /* 使用 */, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB ) ) ) return E_FAIL;
次のステップは、頂点バッファに円柱の点を設定することである。次のサンプル コードでは、各ポイントが位置座標と法線によって定義されていることに注意すること。
for( DWORD i=0; i<50; i++ ) { FLOAT theta = (2*D3DX_PI*i)/(50-1); pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) ); pVertices[2*i+0].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) ); pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) ); pVertices[2*i+1].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) ); }
上記のサンプル コードで頂点バッファに円柱の頂点を設定したら、頂点バッファをレンダリングすることができる。ただし、円柱をレンダリングする前に、このシーンのマテリアルとライトを設定しなければならない。これについては、「ステップ 2 : マテリアルおよびライトの設定」で説明する。