方法: 頂点バッファーを作成する
頂点バッファー には、頂点ごとのデータが含まれます。 このトピックでは、静的 な頂点バッファー、つまり変更されない頂点バッファーを初期化する方法について説明します。 非静的バッファーの初期化については、「解説」セクション を 参照してください。
静的な頂点バッファーを初期化するには
- 頂点を記述する構造体を定義します。 たとえば、頂点データに位置データとカラー データが含まれている場合、構造体には位置を表すベクトルと、色を表すベクトルが 1 つ含まれます。
- 手順 1 で定義した構造体にメモリを (malloc または new を使用して) 割り当てます。 このバッファーに、ジオメトリを記述する実際の頂点データを入力します。
- D3D11_BUFFER_DESC構造体を入力してバッファーの説明 を 作成します。 D3D11_BIND_VERTEX_BUFFER フラグを BindFlags メンバーに渡し、手順 1 の構造体のサイズを ByteWidth メンバーに渡します。
- D3D11_SUBRESOURCE_DATA構造体を入力して、サブリソース データの説明を作成します。 D3D11_SUBRESOURCE_DATA構造体の pSysMem メンバーは、手順 2 で作成したリソース データを直接指している必要があります。
- ID3D11Device::CreateBuffer を呼び出し、D3D11_BUFFER_DESC構造体、D3D11_SUBRESOURCE_DATA構造体、および初期化する ID3D11Buffer インターフェイスへのポインターのアドレスを渡します。
次のコード例は、頂点バッファーを作成する方法を示しています。 この例では、 g_pd3dDevice が有効な ID3D11Device オブジェクトであることを前提としています。
ID3D11Buffer* g_pVertexBuffer;
// Define the data-type that
// describes a vertex.
struct SimpleVertexCombined
{
XMFLOAT3 Pos;
XMFLOAT3 Col;
};
// Supply the actual vertex data.
SimpleVertexCombined verticesCombo[] =
{
XMFLOAT3( 0.0f, 0.5f, 0.5f ),
XMFLOAT3( 0.0f, 0.0f, 0.5f ),
XMFLOAT3( 0.5f, -0.5f, 0.5f ),
XMFLOAT3( 0.5f, 0.0f, 0.0f ),
XMFLOAT3( -0.5f, -0.5f, 0.5f ),
XMFLOAT3( 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 );
注釈
時間の経過と伴って変化する頂点バッファーを初期化する方法をいくつか次に示します。
- D3D11_USAGE_STAGINGを使用して 2 番目のバッファーを作成します。ID3D11DeviceContext::Map、ID3D11DeviceContext::Unmap を使用して 2 番目のバッファーに入力します。ID3D11DeviceContext::CopyResource を使用して、ステージング バッファーから既定のバッファーにコピーします。
- ID3D11DeviceContext::UpdateSubresource を使用して、メモリからデータをコピーします。
- D3D11_USAGE_DYNAMICを含むバッファーを作成し、ID3D11DeviceContext::Map、ID3D11DeviceContext::Unmap (破棄フラグと NoOverwrite フラグを適切に使用) で入力します。
#1 と #2 は、フレームごとに 1 回未満に変更されるコンテンツに役立ちます。 一般に、GPU の読み取りは高速になり、CPU の更新は遅くなります。
#3 は、フレームごとに複数回変更されるコンテンツに役立ちます。 一般に、GPU の読み取りは遅くなりますが、CPU の更新は高速になります。
関連トピック