Microsoft DirectX 8.0 (C++)

ステップ 2 : 頂点バッファの設定

カスタム頂点フォーマットが定義されたので、次は頂点を初期化する。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 : ディスプレイのレンダリング」で説明する。