方法:頂点バッファーの作成

頂点バッファーには頂点ごとのデータが格納されます。ここでは、静的頂点バッファー、つまり変化しない頂点バッファーを初期化する方法について説明します。静的ではないバッファーの初期化については、「解説」を参照してください。

静的頂点バッファーを初期化するには

  1. 頂点を記述する構造体を定義します。たとえば、位置データとカラー データを持つ頂点データでは、位置を記述する 1 つのベクトルおよびカラーを記述するもう 1 つのベクトルを構造体に設定します。
  2. 手順 1 で定義した構造体にメモリーを割り当てます (malloc または new を使用)。このバッファーに、ジオメトリを記述した実際の頂点データを格納します。
  3. D3D11_BUFFER_DESC 構造体に値を競って値して、バッファーの記述を作成します。D3D11_BIND_VERTEX_BUFFER フラグを BindFlags メンバーに渡し、手順 1 で定義した構造体のサイズを ByteWidth メンバーに渡します。
  4. D3D11_SUBRESOURCE_DATA 構造体に値を設定して、サブリソース データの記述を作成します。D3D11_SUBRESOURCE_DATA 構造体の pSysMem メンバーは、手順 2 で作成したリソース データを直接指している必要があります。
  5. D3D11_BUFFER_DESC 構造体、D3D11_SUBRESOURCE_DATA 構造体、および初期化する ID3D11Buffer インターフェイスのポインターのアドレスを指定して、ID3D11Device::CreateBuffer を呼び出します。

次のコード例は、頂点バッファーを作成する方法を示しています。この例では、g_pd3dDevice が有効な ID3D11Device オブジェクトであることを前提としています。

 ID3D11Buffer*      g_pVertexBuffer;  // Define the data-type that // describes a vertex. struct SimpleVertexCombined {     D3DXVECTOR3 Pos;       D3DXVECTOR3 Col;   };  // Supply the actual vertex data. SimpleVertexCombined verticesCombo[] = {     D3DXVECTOR3( 0.0f, 0.5f, 0.5f ),     D3DXVECTOR3( 0.0f, 0.0f, 0.5f ),     D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),     D3DXVECTOR3( 0.5f, 0.0f, 0.0f ),     D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),     D3DXVECTOR3( 0.0f, 0.5f, 0.0f ), };  // Fill in a buffer description. D3D11_BUFFER_DESC bufferDesc; bufferDesc.Usage            = D3D11_USAGE_DEFAULT; bufferDesc.ByteWidth        = sizeof( SimpleVertexCombined ) * 3; bufferDesc.BindFlags        = D3D11_BIND_VERTEX_BUFFER; bufferDesc.CPUAccessFlags   = 0; bufferDesc.MiscFlags        = 0;  // Fill in the subresource data. D3D11_SUBRESOURCE_DATA InitData; InitData.pSysMem = verticesCombo; InitData.SysMemPitch = 0; InitData.SysMemSlicePitch = 0;  // Create the vertex buffer. hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pVertexBuffer );     

解説 

時間と共に変化する頂点バッファーを初期化する方法をいくつか次に示します。

  1. D3D10_USAGE_STAGING を使用して、2 番目のバッファーを作成します。ID3D11DeviceContext::MapID3D11DeviceContext::Unmap を使用して、この 2 番目のバッファーにデータを設定します。ID3D11DeviceContext::CopyResource を使用して、ステージング バッファーから既定のバッファーにデータをコピーします。
  2. ID3D11DeviceContext::UpdateSubresource を使用して、メモリーからデータをコピーします。
  3. D3D11_USAGE_DYNAMIC を使用してバッファーを作成し、ID3D11DeviceContext::MapID3D11DeviceContext::Unmap を使用してこのバッファーにデータを設定します (Discard フラグと NoOverwrite フラグを適宜使用します)。

1 番目の方法と 2 番目の方法は、フレームごとの変更回数が 1 回未満のコンテンツで役立ちます。通常、GPU の読み取り速度は速くなりますが、CPU の更新速度は遅くなります。

3 番目の方法は、フレームあたりの変更回数が 2 回以上のコンテンツで役立ちます。通常、GPU の読み取り速度は遅くなりますが、CPU の更新速度は速くなります。

関連項目

バッファー