Baiklah, saya mengalami kesulitan memahami bagaimana buffer konstan terikat ke tahap pipeline dan diperbarui. Saya mengerti bahwa DirectX11 dapat memiliki hingga 15 buffer konstan shader per stage dan setiap buffer dapat menampung hingga 4.096 konstanta. Namun, saya tidak mengerti apakah ID3D11Buffer COM yang digunakan untuk berinteraksi dengan buffer konstan hanya mekanisme (atau pegangan) yang digunakan untuk mengisi slot buffer ini atau jika objek benar-benar referensi contoh tertentu dari data buffer yang didorong maju dan mundur antara GPU dan CPU.
Saya pikir kebingungan saya pada topik adalah penyebab masalah saya menggunakan dua buffer konstan yang berbeda.
Berikut ini beberapa contoh kode shader.
cbuffer PerFrame : register(b0) {
float4x4 view;
};
cbuffer PerObject : register(b1) {
float4x4 scale;
float4x4 rotation;
float4x4 translation;
};
Cara kode saya diatur, kamera akan menangani memperbarui data per frame yang relevan dan GameObjects akan memperbarui sendiri per objek data. Kedua kelas memiliki ID3D11Buffer mereka sendiri yang digunakan untuk melakukan ini (Menggunakan arsitektur hub, sehingga satu kelas GameObject akan menangani rendering semua GameObjects yang dipasang di dunia).
Masalahnya adalah saya hanya bisa mendapatkan satu yang diperbarui pada satu waktu, tergantung pada slot dan saya menganggap urutan pembaruan satu buffer terisi sementara yang lain mendapat nol keluar.
Ini pada dasarnya adalah kode saya. Kedua kelas menggunakan logika pembaruan yang identik.
static PerObjectShaderBuffer _updatedBuffer; // PerFrameShaderBuffer if Camera class
_updatedBuffer.scale = _rScale;
_updatedBuffer.rotation = _rRotation;
_updatedBuffer.translation = _rTranslation;
pDeviceContext->UpdateSubresource(pShaderBuffer, 0 , 0, &_updatedBuffer, 0, 0);
pDeviceContext->VSSetShader(pVShader->GetShaderPtr(), 0, 0);
pDeviceContext->PSSetShader(pPShader->GetShaderPtr(), 0, 0);
pDeviceContext->VSSetConstantBuffers(1, 1, &pShaderBuffer);
pDeviceContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &vStride, &_offset );
pDeviceContext->IASetPrimitiveTopology(topologyType);
pDeviceContext->Draw(bufSize, 0);
Pertanyaan utama saya adalah -
- Apakah saya perlu mengatur atau mengikat ShaderBuffer untuk memperbaruinya dengan panggilan UpdateSubresource? (Artinya memanipulasi hanya ketika itu dalam pipa) Atau apakah itu gumpalan data yang akan dikirim dengan panggilan VSSetConstantBuffer? (Artinya urutan pengikatan dan pemutakhiran data tidak masalah, saya dapat memperbaruinya dalam pipa atau entah bagaimana di cpu)
- Saat mengatur atau mengikat buffer, apakah saya perlu referensi slot 0 untuk memperbarui buffer PerFrame dan slot 1 untuk memperbarui buffer PerObject? Bisakah beberapa jenis kebingungan dengan panggilan ini dalam kode saya menyebabkan semua buffer ditimpa?
- Bagaimana D3D11 tahu buffer mana yang ingin saya perbarui atau petakan? Apakah itu tahu dari ID3D11Buffer COM yang digunakan?
Edit -
Mengubah tag register buffer konstan pada contoh di atas. Menggunakan (cb #) alih-alih (b #) memengaruhi buffer untuk memperbarui dengan benar karena beberapa alasan. Tidak yakin di mana saya mengambil sintaks asli atau apakah itu valid sama sekali, tetapi tampaknya itu menjadi masalah utama saya.