Cara: Membuat Buffer Konstanta

Buffer konstan berisi data konstanta shader. Topik ini menunjukkan cara menginisialisasi buffer konstan dalam persiapan untuk penyajian.

Untuk menginisialisasi buffer konstanta

  1. Tentukan struktur yang menjelaskan data konstanta shader vertex.

  2. Alokasikan memori untuk struktur yang Anda tentukan di langkah pertama. Isi buffer ini dengan data konstanta shader vertex. Anda dapat menggunakan malloc atau baru untuk mengalokasikan memori, atau Anda dapat mengalokasikan memori untuk struktur dari tumpukan.

  3. Buat deskripsi buffer dengan mengisi struktur D3D11_BUFFER_DESC . Teruskan bendera D3D11_BIND_CONSTANT_BUFFER ke anggota BindFlags dan teruskan ukuran struktur deskripsi buffer konstan dalam byte ke anggota ByteWidth .

    Catatan

    Bendera D3D11_BIND_CONSTANT_BUFFER tidak dapat digabungkan dengan bendera lain.

     

  4. Buat deskripsi data subsumber daya dengan mengisi struktur D3D11_SUBRESOURCE_DATA . Anggota pSysMem dari struktur D3D11_SUBRESOURCE_DATA harus menunjuk langsung ke data konstanta shader vertex yang Anda buat di langkah kedua.

  5. Panggil ID3D11Device::CreateBuffer saat melewati struktur D3D11_BUFFER_DESC , struktur D3D11_SUBRESOURCE_DATA , dan alamat pointer ke antarmuka ID3D11Buffer untuk diinisialisasi.

Contoh kode ini menunjukkan cara membuat buffer konstanta.

Contoh ini mengasumsikan bahwa g_pd3dDevice adalah objek ID3D11Device yang valid dan bahwa g_pd3dContext adalah objek ID3D11DeviceContext yang valid.

ID3D11Buffer*   g_pConstantBuffer11 = NULL;

// Define the constant data used to communicate with shaders.
struct VS_CONSTANT_BUFFER
{
    XMFLOAT4X4 mWorldViewProj;                              
    XMFLOAT4 vSomeVectorThatMayBeNeededByASpecificShader;
    float fSomeFloatThatMayBeNeededByASpecificShader;
    float fTime;                                            
    float fSomeFloatThatMayBeNeededByASpecificShader2;
    float fSomeFloatThatMayBeNeededByASpecificShader3;
} VS_CONSTANT_BUFFER;

// Supply the vertex shader constant data.
VS_CONSTANT_BUFFER VsConstData;
VsConstData.mWorldViewProj = {...};
VsConstData.vSomeVectorThatMayBeNeededByASpecificShader = XMFLOAT4(1,2,3,4);
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader = 3.0f;
VsConstData.fTime = 1.0f;
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader2 = 2.0f;
VsConstData.fSomeFloatThatMayBeNeededByASpecificShader3 = 4.0f;

// Fill in a buffer description.
D3D11_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = sizeof( VS_CONSTANT_BUFFER );
cbDesc.Usage = D3D11_USAGE_DYNAMIC;
cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbDesc.MiscFlags = 0;
cbDesc.StructureByteStride = 0;

// Fill in the subresource data.
D3D11_SUBRESOURCE_DATA InitData;
InitData.pSysMem = &VsConstData;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;

// Create the buffer.
hr = g_pd3dDevice->CreateBuffer( &cbDesc, &InitData, 
                                 &g_pConstantBuffer11 );

if( FAILED( hr ) )
   return hr;

// Set the buffer.
g_pd3dContext->VSSetConstantBuffers( 0, 1, &g_pConstantBuffer11 );
    

Contoh ini menunjukkan definisi Cbuffer HLSL terkait.

cbuffer VS_CONSTANT_BUFFER : register(b0)
{
    matrix mWorldViewProj;
    float4  vSomeVectorThatMayBeNeededByASpecificShader;
    float fSomeFloatThatMayBeNeededByASpecificShader;
    float fTime;
    float fSomeFloatThatMayBeNeededByASpecificShader2;
    float fSomeFloatThatMayBeNeededByASpecificShader3;
};

Catatan

Pastikan untuk mencocokkan tata letak memori VS_CONSTANT_BUFFER di C++ dengan tata letak HLSL. Untuk informasi tentang cara HLSL menangani tata letak dalam memori, lihat Aturan Pengemasan untuk Variabel Konstanta.

 

Buffer

Cara Menggunakan Direct3D 11