Cara: Membuat Buffer Vertex

Buffer vertex berisi data per puncak. Topik ini menunjukkan cara menginisialisasi buffer vertex statis, yaitu buffer vertex yang tidak berubah. Untuk bantuan menginisialisasi buffer non-statis, lihat bagian keterangan .

Untuk menginisialisasi buffer vertex statis

  1. Tentukan struktur yang menjelaskan puncak. Misalnya, jika data verteks Anda berisi data posisi dan data warna, struktur Anda akan memiliki satu vektor yang menjelaskan posisi dan yang lain yang menjelaskan warna.
  2. Alokasikan memori (menggunakan malloc atau baru) untuk struktur yang Anda tentukan di langkah pertama. Isi buffer ini dengan data vertex aktual yang menjelaskan geometri Anda.
  3. Buat deskripsi buffer dengan mengisi struktur D3D11_BUFFER_DESC . Teruskan bendera D3D11_BIND_VERTEX_BUFFER ke anggota BindFlags dan teruskan ukuran struktur dari langkah satu ke anggota ByteWidth .
  4. Buat deskripsi data sub sumber daya dengan mengisi struktur D3D11_SUBRESOURCE_DATA . Anggota pSysMem dari struktur D3D11_SUBRESOURCE_DATA harus menunjuk langsung ke data sumber daya yang dibuat di langkah kedua.
  5. Panggil ID3D11Device::CreateBuffer saat meneruskan struktur D3D11_BUFFER_DESC , struktur D3D11_SUBRESOURCE_DATA , dan alamat pointer ke antarmuka ID3D11Buffer untuk diinisialisasi.

Contoh kode berikut menunjukkan cara membuat buffer vertex. Contoh ini mengasumsikan bahwa g_pd3dDevice adalah objek ID3D11Device yang valid.

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

Keterangan

Berikut adalah beberapa cara untuk menginisialisasi buffer vertex yang berubah dari waktu ke waktu.

  1. Buat buffer ke-2 dengan D3D11_USAGE_STAGING; isi buffer kedua menggunakan ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap; gunakan ID3D11DeviceContext::CopyResource untuk menyalin dari buffer penahapan ke buffer default.
  2. Gunakan ID3D11DeviceContext::UpdateSubresource untuk menyalin data dari memori.
  3. Buat buffer dengan D3D11_USAGE_DYNAMIC, dan isi dengan ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap (menggunakan bendera Buang dan NoOverwrite dengan tepat).

#1 dan #2 berguna untuk konten yang berubah kurang dari sekali per bingkai. Secara umum, bacaan GPU akan cepat dan pembaruan CPU akan lebih lambat.

#3 berguna untuk konten yang berubah lebih dari sekali per bingkai. Secara umum, bacaan GPU akan lebih lambat, tetapi pembaruan CPU akan lebih cepat.

Buffer

Cara Menggunakan Direct3D 11