Tamam, sabit tamponların bir boru hattı aşamasına nasıl bağlandığını ve güncellendiğini kavramakta zorlanıyorum. DirectX11'in aşama başına 15'e kadar gölgelendirici sabit arabelleğe sahip olabileceğini ve her bir arabellek 4096 sabit tutabildiğini anlıyorum. Ancak, sabit arabelleklerle etkileşimde kullanılan ID3D11Buffer COM'un yalnızca bu arabellek yuvalarını doldurmak için kullanılan bir mekanizma (veya tanıtıcı) olup olmadığını veya nesnenin gerçekten ileri geri itilen bir arabellek verisine başvurup başvurmadığını anlamıyorum. GPU ve CPU arasında.
Konuyla ilgili kafa karışıklığımın, iki farklı sabit tampon kullandığım bir sorunun nedeni olduğunu düşünüyorum.
İşte bazı örnek gölgelendirici kodu.
cbuffer PerFrame : register(b0) {
float4x4 view;
};
cbuffer PerObject : register(b1) {
float4x4 scale;
float4x4 rotation;
float4x4 translation;
};
Kodumun düzenlenme şekli, kamera, kare başına ilgili verilerin güncellenmesini yönetecek ve GameObjects nesne başına kendi verilerini güncelleyecektir. Her iki sınıf da bunu yapmak için kullanılan kendi ID3D11Buffer'ına sahiptir (Bir hub mimarisi kullanarak, bir GameObject sınıfı, dünyadaki tüm örneklenmiş GameObjects'in oluşturulmasını işleyecektir).
Sorun, yuvaya bağlı olarak sadece bir kerede bir güncelleme alabilirsiniz ve güncelleme sırası bir tampon doldurulur diğeri sıfır alır varsayalım.
Bu aslında benim kodum. Her iki sınıf da aynı güncelleme mantığını kullanır.
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);
Ana sorularım -
- UpdateSubresource çağrısıyla güncellemek için ShaderBuffer'ı ayarlamam veya bağlamam gerekir mi? (Anlamı sadece boru hattındayken manipüle eder) Yoksa VSSetConstantBuffer çağrısı ile gönderilecek bir veri bloğu mu? (Veri bağlama ve güncelleme sırası önemli değil, boru hattında veya bir şekilde cpu'da güncelleyebilirim)
- Arabelleği ayarlarken veya bağlarken, PerFrame arabelleğini güncellemek için slot 0'a ve PerObject arabelleğini güncellemek için slot 1'e başvurmam gerekir mi? Kodumdaki bu çağrı ile ilgili bir tür karışıklık tüm arabelleklerin üzerine yazılmasına neden olabilir mi?
- D3D11, hangi arabelleği güncellemek veya eşlemek istediğimi nasıl biliyor? Kullanılan ID3D11Buffer COM biliyor mu?
Düzenle -
Yukarıdaki örnekte sabit arabellek yazmacı etiketleri değiştirildi. (B #) yerine (cb #) kullanılması, arabelleklerin bir nedenle doğru şekilde güncellenmesini etkiliyordu. Orijinal sözdizimini nereden aldığımdan veya hiç geçerli olmadığından emin değilim, ancak ana sorunum gibi görünüyor.