เอาล่ะฉันมีเวลายากที่จะเข้าใจว่าบัฟเฟอร์คงที่จะถูกผูกไว้กับขั้นตอนท่อและปรับปรุง ฉันเข้าใจว่า DirectX11 สามารถมีบัฟเฟอร์คงที่ได้ถึง 15 shader ต่อสเตจและแต่ละบัฟเฟอร์สามารถเก็บค่าคงที่ได้มากถึง 4096 ค่า อย่างไรก็ตามฉันไม่เข้าใจว่า ID3D11Buffer COM ที่ใช้ในการโต้ตอบกับบัฟเฟอร์คงที่เป็นเพียงกลไก (หรือที่จับ) ที่ใช้สำหรับเติมช่องบัฟเฟอร์เหล่านี้หรือถ้าวัตถุอ้างอิงตัวอย่างของข้อมูลบัฟเฟอร์ที่ถูกผลักไปมา ระหว่าง GPU และ CPU
ฉันคิดว่าความสับสนของฉันในหัวข้อเป็นสาเหตุของปัญหาที่ฉันใช้บัฟเฟอร์คงที่สองแบบ
นี่คือตัวอย่างโค้ด shader
cbuffer PerFrame : register(b0) {
float4x4 view;
};
cbuffer PerObject : register(b1) {
float4x4 scale;
float4x4 rotation;
float4x4 translation;
};
วิธีการจัดระเบียบรหัสของฉันกล้องจะจัดการอัปเดตข้อมูลที่เกี่ยวข้องต่อเฟรมและ GameObjects จะอัปเดตข้อมูลต่อวัตถุของตัวเอง ทั้งสองคลาสมี ID3D11Buffer ของตัวเองที่ใช้ในการทำสิ่งนี้ (ใช้สถาปัตยกรรมฮับดังนั้นคลาส GameObject หนึ่งคลาสจะจัดการการเรนเดอร์ของ GameObjects ที่มีอยู่ทั้งหมดในโลก)
ปัญหาคือฉันสามารถได้รับการอัพเดตครั้งละหนึ่งรายการเท่านั้นขึ้นอยู่กับสล็อตและฉันคิดว่าคำสั่งการอัปเดตหนึ่งบัฟเฟอร์จะได้รับการเติมในขณะที่อีกอันหนึ่งจะถูกลบออก
นี่คือรหัสของฉัน ทั้งสองคลาสใช้ตรรกะการอัพเดตที่เหมือนกัน
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);
คำถามหลักของฉันคือ -
- ฉันจำเป็นต้องตั้งค่าหรือผูก ShaderBuffer เพื่ออัปเดตด้วยการโทร UpdateSubresource หรือไม่ (ความหมายจัดการมันเฉพาะเมื่อมันอยู่ในท่อ) หรือมันเป็นหยดของข้อมูลที่จะถูกส่งด้วยการโทร VSSetConstantBuffer? (ความหมายของลำดับการเชื่อมโยงและการอัปเดตข้อมูลไม่สำคัญว่าฉันสามารถอัปเดตในไพพ์ไลน์หรืออย่างใดในซีพียู)
- เมื่อตั้งค่าหรือผูกบัฟเฟอร์ฉันต้องอ้างอิงสล็อต 0 เพื่ออัพเดตบัฟเฟอร์ PerFrame และสล็อต 1 เพื่ออัปเดตบัฟเฟอร์ PerObject หรือไม่ ความสับสนในการโทรนี้ในรหัสของฉันอาจทำให้บัฟเฟอร์ทั้งหมดถูกเขียนทับได้หรือไม่?
- D3D11 รู้ได้อย่างไรว่าบัฟเฟอร์ใดที่ฉันต้องการอัปเดตหรือแมป มันรู้จาก ID3D11Buffer COM ไหม?
แก้ไข -
เปลี่ยนแท็ก register register คงที่ในตัวอย่างด้านบน การใช้ (cb #) แทน (b #) ส่งผลกระทบต่อบัฟเฟอร์ไม่ให้อัปเดตอย่างถูกต้องด้วยเหตุผลบางประการ ไม่แน่ใจว่าฉันเลือกไวยากรณ์ดั้งเดิมหรือที่ใดก็ได้ แต่มันดูเหมือนจะเป็นปัญหาหลักของฉัน