方法: 頂点バッファーを作成する

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

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

  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. 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 );
    

注釈

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

  1. D3D11_USAGE_STAGINGを使用して 2 番目のバッファーを作成します。ID3D11DeviceContext::MapID3D11DeviceContext::Unmap を使用して 2 番目のバッファーに入力します。ID3D11DeviceContext::CopyResource を使用して、ステージング バッファーから既定のバッファーにコピーします。
  2. ID3D11DeviceContext::UpdateSubresource を使用して、メモリからデータをコピーします。
  3. D3D11_USAGE_DYNAMICを含むバッファーを作成し、ID3D11DeviceContext::MapID3D11DeviceContext::Unmap (破棄フラグと NoOverwrite フラグを適切に使用) で入力します。

#1 と #2 は、フレームごとに 1 回未満に変更されるコンテンツに役立ちます。 一般に、GPU の読み取りは高速になり、CPU の更新は遅くなります。

#3 は、フレームごとに複数回変更されるコンテンツに役立ちます。 一般に、GPU の読み取りは遅くなりますが、CPU の更新は高速になります。

Buffers

Direct3D 11 の使用方法