Membuat Sumber Daya Buffer (Direct3D 10)

Membuat buffer memerlukan penentuan data yang akan disimpan buffer, menyediakan data inisialisasi, dan menyiapkan bendera penggunaan dan pengikatan yang sesuai. Untuk membuat tekstur, lihat Membuat Sumber Daya Tekstur (Direct3D 10).

Membuat Buffer Vertex

Langkah-langkah untuk membuat buffer vertex adalah sebagai berikut.

Membuat Deskripsi Buffer

Saat membuat buffer vertex, deskripsi buffer (lihat D3D10_BUFFER_DESC) digunakan untuk menentukan bagaimana data diatur dalam buffer, bagaimana alur dapat mengakses buffer, dan bagaimana buffer akan digunakan.

Contoh berikut menunjukkan cara membuat deskripsi buffer untuk satu segitiga dengan simpul yang berisi nilai posisi dan warna.

struct SimpleVertex
{
    D3DXVECTOR3 Position;  
    D3DXVECTOR3 Color;  
};

    D3D10_BUFFER_DESC bufferDesc;
    bufferDesc.Usage            = D3D10_USAGE_DEFAULT;
    bufferDesc.ByteWidth        = sizeof( SimpleVertex ) * 3;
    bufferDesc.BindFlags        = D3D10_BIND_VERTEX_BUFFER;
    bufferDesc.CPUAccessFlags   = 0;
    bufferDesc.MiscFlags        = 0;

Dalam contoh ini, deskripsi buffer diinisialisasi dengan hampir semua pengaturan default untuk penggunaan, akses CPU , dan bendera lain-lain. Pengaturan lainnya adalah untuk bendera ikat yang mengidentifikasi sumber daya sebagai buffer vertex saja, dan ukuran buffer.

Bendera penggunaan dan akses CPU penting untuk performa. Kedua bendera ini bersama-sama menentukan seberapa sering sumber daya diakses, jenis memori apa yang dapat dimuat sumber daya, dan prosesor apa yang perlu mengakses sumber daya. Penggunaan default sumber daya ini tidak akan sering diperbarui. Mengatur akses CPU ke 0 berarti bahwa CPU tidak perlu membaca atau menulis sumber daya. Diambil dalam kombinasi, ini berarti bahwa runtime dapat memuat sumber daya ke memori berkinerja tertinggi untuk GPU karena sumber daya tidak memerlukan akses CPU.

Seperti yang diharapkan, ada tradeoff antara performa terbaik dan aksesibilitas kapan saja oleh salah satu prosesor. Misalnya, penggunaan default tanpa akses CPU berarti bahwa sumber daya dapat tersedia untuk GPU secara eksklusif. Ini dapat mencakup pemuatan sumber daya ke dalam memori yang tidak dapat diakses langsung oleh CPU. Sumber daya hanya dapat dimodifikasi dengan UpdateSubresource.

Membuat Data Inisialisasi untuk Buffer

Buffer hanyalah kumpulan elemen dan ditata sebagai array 1D. Akibatnya, pitch memori sistem dan pitch ilis memori sistem keduanya sama; ukuran deklarasi data puncak. Aplikasi dapat menyediakan data inisialisasi saat buffer dibuat menggunakan deskripsi sub sumber daya, yang berisi penunjuk ke data sumber daya aktual dan berisi informasi tentang ukuran dan tata letak data tersebut.

Setiap buffer yang dibuat dengan penggunaan yang tidak dapat diubah (lihat D3D10_USAGE_IMMUTABLE) harus diinisialisasi pada waktu pembuatan. Buffer yang menggunakan salah satu bendera penggunaan lainnya dapat diperbarui setelah inisialisasi menggunakan CopyResource, CopySubresourceRegion, dan UpdateSubresource, atau dengan mengakses memori yang mendasarnya menggunakan metode Peta .

Membuat Buffer

Menggunakan deskripsi buffer dan data inisialisasi (yang bersifat opsional) memanggil CreateBuffer untuk membuat buffer vertex. Cuplikan kode berikut menunjukkan cara membuat buffer vertex dari array data vertex yang dideklarasikan oleh aplikasi.

struct SimpleVertexCombined
{
    D3DXVECTOR3 Pos;  
    D3DXVECTOR3 Col;  
};


ID3D10InputLayout* g_pVertexLayout = NULL;
ID3D10Buffer*      g_pVertexBuffer[2] = { NULL, NULL };
ID3D10Buffer*      g_pIndexBuffer = NULL;


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


    D3D10_BUFFER_DESC bufferDesc;
    bufferDesc.Usage            = D3D10_USAGE_DEFAULT;
    bufferDesc.ByteWidth        = sizeof( SimpleVertexCombined ) * 3;
    bufferDesc.BindFlags        = D3D10_BIND_VERTEX_BUFFER;
    bufferDesc.CPUAccessFlags   = 0;
    bufferDesc.MiscFlags        = 0;
    
    D3D10_SUBRESOURCE_DATA InitData;
    InitData.pSysMem = verticesCombo;
    InitData.SysMemPitch = 0;
    InitData.SysMemSlicePitch = 0;
    hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pVertexBuffer[0] );

Membuat Penyangga Indeks

Membuat buffer indeks sangat mirip dengan membuat buffer vertex; dengan dua perbedaan. Buffer indeks hanya berisi data 16-bit atau 32-bit (bukan berbagai format yang tersedia untuk buffer vertex. Buffer indeks juga memerlukan bendera ikatan penyangga indeks.

Contoh berikut menunjukkan cara membuat buffer indeks dari array data indeks.

ID3D10Buffer *g_pIndexBuffer = NULL;

    // Create indices
    unsigned int indices[] = { 0, 1, 2 };

    D3D10_BUFFER_DESC bufferDesc;
    bufferDesc.Usage           = D3D10_USAGE_DEFAULT;
    bufferDesc.ByteWidth       = sizeof( unsigned int ) * 3;
    bufferDesc.BindFlags       = D3D10_BIND_INDEX_BUFFER;
    bufferDesc.CPUAccessFlags  = 0;
    bufferDesc.MiscFlags       = 0;

    D3D10_SUBRESOURCE_DATA InitData;
    InitData.pSysMem = indices;
    InitData.SysMemPitch = 0;
    InitData.SysMemSlicePitch = 0;
    hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pIndexBuffer );
    if( FAILED( hr ) )
        return hr;
  
    g_pd3dDevice->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 );

Membuat Buffer Konstanta

Direct3D 10 memperkenalkan buffer konstan. Buffer konstanta, atau buffer konstanta shader, adalah buffer yang berisi konstanta shader. Berikut adalah contoh pembuatan buffer konstanta, yang diambil dari Sampel HLSLWithoutFX10.

ID3D10Buffer*   g_pConstantBuffer10 = NULL;

struct VS_CONSTANT_BUFFER
{
    D3DXMATRIX mWorldViewProj;      //mWorldViewProj will probably be global to all shaders in a project.
                                    //It's a good idea not to move it around between shaders.
    D3DXVECTOR4 vSomeVectorThatMayBeNeededByASpecificShader;
    float fSomeFloatThatMayBeNeededByASpecificShader;
    float fTime;                    //fTime may also be global to all shaders in a project.
    float fSomeFloatThatMayBeNeededByASpecificShader2;
    float fSomeFloatThatMayBeNeededByASpecificShader3;
};

    D3D10_BUFFER_DESC cbDesc;
    cbDesc.ByteWidth = sizeof( VS_CONSTANT_BUFFER );
    cbDesc.Usage = D3D10_USAGE_DYNAMIC;
    cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
    cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
    cbDesc.MiscFlags = 0;
    hr = g_pd3dDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer10 );
    if( FAILED( hr ) )
       return hr;

    g_pd3dDevice->VSSetConstantBuffers( 0, 1, g_pConstantBuffer10 );

Perhatikan bahwa saat menggunakan antarmuka ID3D10Effect Interface , proses pembuatan, pengikatan, dan kompit buffer konstan ditangani oleh instans ID3D10Effect Interface . Dalam hal ini hanya perlu untuk mendapatkan variabel dari efek dengan salah satu metode GetVariable seperti GetVariableByName dan memperbarui variabel dengan salah satu metode SetVariable seperti SetMatrix. Untuk contoh penggunaan ID3D10Effect Interface untuk mengelola buffer konstan lihat Tutorial 7: Pemetaan Tekstur dan Buffer Konstan.

Sumber daya (Direct3D 10)