Microsoft DirectX 8.0 (C++) |
カスタム頂点フォーマットが定義されたので、次は頂点を初期化する。Vertices サンプル プロジェクトでは、この処理を行うために、必要な Microsoft® Direct3D® オブジェクトを作成した後、アプリケーション定義関数 InitVB を呼び出している。次のサンプル コードでは、3 つのカスタム頂点の値を初期化している。
CUSTOMVERTEX g_Vertices[] = { { 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, { 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, }, };
上記のサンプル コードでは、3 つの頂点に三角形のポイントを設定し、各頂点が放射する色を指定する。最初のポイントは (150, 50) にあり、赤色 (0xffff0000) を放射する。2 番目のポイントは (250, 250) にあり、緑色 (0xff00ff00) を放射する。3 番目のポイントは (50, 250) にあり、青緑色 (0xff00ffff) を放射する。3 つのポイントの深度値は 0.5 で、RHW は 1.0 である。この頂点フォーマットの詳細については、「トランスフォーム済み ライティング済みの頂点」を参照すること。
次のステップは、次のサンプル コードのように、IDirect3DDevice8::CreateVertexBuffer を呼び出して頂点バッファを作成することである。
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX), 0 /* 使用 */, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB ) ) ) return E_FAIL;
CreateVertexBuffer の最初の 2 つのパラメータは、新しい頂点バッファの必要なサイズと使用方法を Direct3D に指示する。次の 2 つのパラメータは、新しいバッファのベクトル フォーマットおよびメモリ領域を指定する。ベクトル フォーマットは、このサンプル コードで以前に指定された FVF である D3DFVF_CUSTOMVERTEX である。D3DPOOL_DEFAULT フラグは、頂点バッファを、このバッファに最も適したメモリ割り当てを行って作成するよう Direct3D に指示する。最後のパラメータは、作成する頂点バッファのアドレスである。
頂点バッファを作成すると、次のサンプル コードのように、このバッファにカスタム頂点のデータが設定される。
VOID* pVertices; if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, g_Vertices, sizeof(g_Vertices) ); g_pVB->Unlock();
頂点バッファは、まず、IDirect3DVertexBuffer8::Lock を呼び出すことによってロックされる。最初のパラメータは、ロックする頂点データへのバイト単位のオフセットである。第 2 パラメータは、ロックする頂点データのサイズをバイト数で示す。第 3 パラメータは、頂点データへのポインタを格納する BYTE ポインタのアドレスである。第 4 のパラメータは、頂点バッファにデータのロック方法を指示する。
頂点は、memcpy を使って頂点バッファにコピーされる。頂点が頂点バッファに格納された後、IDirect3DVertexBuffer8::Unlock を呼び出して、頂点バッファがアンロックされる。このロックとアンロックのメカニズムは、頂点バッファがデバイス メモリに存在する場合があるため必要になる。
頂点バッファに頂点が格納されたので、次はディスプレイをレンダリングする。これについては、「ステップ 3 : ディスプレイのレンダリング」で説明する。