方法:頂点バッファーの作成
頂点バッファーには頂点ごとのデータが格納されます。ここでは、静的頂点バッファー、つまり変化しない頂点バッファーを初期化する方法について説明します。静的ではないバッファーの初期化については、「解説」を参照してください。
静的頂点バッファーを初期化するには
- 頂点を記述する構造体を定義します。たとえば、位置データとカラー データを持つ頂点データでは、位置を記述する 1 つのベクトルおよびカラーを記述するもう 1 つのベクトルを構造体に設定します。
- 手順 1 で定義した構造体にメモリーを割り当てます (malloc または new を使用)。このバッファーに、ジオメトリを記述した実際の頂点データを格納します。
- D3D11_BUFFER_DESC 構造体に値を競って値して、バッファーの記述を作成します。D3D11_BIND_VERTEX_BUFFER フラグを BindFlags メンバーに渡し、手順 1 で定義した構造体のサイズを ByteWidth メンバーに渡します。
- D3D11_SUBRESOURCE_DATA 構造体に値を設定して、サブリソース データの記述を作成します。D3D11_SUBRESOURCE_DATA 構造体の pSysMem メンバーは、手順 2 で作成したリソース データを直接指している必要があります。
- 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 );
解説
時間と共に変化する頂点バッファーを初期化する方法をいくつか次に示します。
- D3D10_USAGE_STAGING を使用して、2 番目のバッファーを作成します。ID3D11DeviceContext::Map、ID3D11DeviceContext::Unmap を使用して、この 2 番目のバッファーにデータを設定します。ID3D11DeviceContext::CopyResource を使用して、ステージング バッファーから既定のバッファーにデータをコピーします。
- ID3D11DeviceContext::UpdateSubresource を使用して、メモリーからデータをコピーします。
- D3D11_USAGE_DYNAMIC を使用してバッファーを作成し、ID3D11DeviceContext::Map、ID3D11DeviceContext::Unmap を使用してこのバッファーにデータを設定します (Discard フラグと NoOverwrite フラグを適宜使用します)。
1 番目の方法と 2 番目の方法は、フレームごとの変更回数が 1 回未満のコンテンツで役立ちます。通常、GPU の読み取り速度は速くなりますが、CPU の更新速度は遅くなります。
3 番目の方法は、フレームあたりの変更回数が 2 回以上のコンテンツで役立ちます。通常、GPU の読み取り速度は遅くなりますが、CPU の更新速度は速くなります。