Được rồi, tôi đang gặp khó khăn trong việc nắm bắt các bộ đệm liên tục bị ràng buộc với giai đoạn đường ống và được cập nhật. Tôi hiểu rằng DirectX11 có thể có tới 15 bộ đệm liên tục shader mỗi giai đoạn và mỗi bộ đệm có thể chứa tới 4096 hằng số. Tuy nhiên, tôi không hiểu liệu ID3D11Buffer COM được sử dụng để tương tác với các bộ đệm không đổi chỉ là một cơ chế (hoặc tay cầm) được sử dụng để lấp đầy các vị trí bộ đệm này hoặc nếu đối tượng thực sự tham chiếu một trường hợp cụ thể của dữ liệu bộ đệm được đẩy qua lại giữa GPU và CPU.
Tôi nghĩ rằng sự nhầm lẫn của tôi về chủ đề này là nguyên nhân của một vấn đề tôi đang sử dụng hai bộ đệm liên tục khác nhau.
Dưới đây là một số ví dụ mã shader.
cbuffer PerFrame : register(b0) {
float4x4 view;
};
cbuffer PerObject : register(b1) {
float4x4 scale;
float4x4 rotation;
float4x4 translation;
};
Cách thức tổ chức mã của tôi, máy ảnh sẽ xử lý cập nhật dữ liệu liên quan trên mỗi khung hình và GameObject sẽ tự cập nhật dữ liệu của từng đối tượng. Cả hai lớp đều có ID3D11Buffer riêng được sử dụng để thực hiện việc này (Sử dụng kiến trúc trung tâm, do đó, một lớp GameObject sẽ xử lý kết xuất tất cả các GameObject được kích hoạt trên thế giới).
Vấn đề là tôi chỉ có thể nhận được một bản cập nhật tại một thời điểm, tùy thuộc vào vị trí và tôi cho rằng thứ tự cập nhật một bộ đệm được điền trong khi bộ đệm khác bị xóa.
Đây thực chất là mã của tôi. Cả hai lớp sử dụng logic cập nhật giống hệt nhau.
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);
Câu hỏi chính của tôi là -
- Tôi có cần phải thiết lập hoặc liên kết ShaderBuffer để cập nhật nó với lệnh gọi UpdateSubresource không? (Có nghĩa là chỉ thao tác với nó khi nó đang trong đường ống) Hoặc đó là một đốm dữ liệu sẽ được gửi bằng lệnh gọi VSSetConstantBuffer? (Có nghĩa là thứ tự ràng buộc và cập nhật dữ liệu không thành vấn đề, tôi có thể cập nhật nó trong đường ống hoặc bằng cách nào đó trên cpu)
- Khi cài đặt hoặc liên kết bộ đệm, tôi có cần tham chiếu vị trí 0 để cập nhật bộ đệm PerFrame và vị trí 1 để cập nhật bộ đệm PerObject không? Có thể một số loại nhầm lẫn với cuộc gọi này trong mã của tôi khiến tất cả các bộ đệm bị ghi đè?
- Làm thế nào để D3D11 biết bộ đệm nào tôi muốn cập nhật hoặc bản đồ? Nó có biết từ COM ID3D11Buffer được sử dụng không?
Biên tập -
Thay đổi các thẻ đăng ký bộ đệm không đổi trong ví dụ trên. Việc sử dụng (cb #) thay vì (b #) đã ảnh hưởng đến bộ đệm cập nhật chính xác vì một số lý do. Không chắc chắn nơi tôi đã chọn cú pháp ban đầu hoặc nếu nó hợp lệ, nhưng nó dường như là vấn đề chính của tôi.