Ich bin neu in Direct3D 11 und habe Schwierigkeiten zu verstehen, wie ich konstante (und andere) Puffer objektweise aktualisieren kann. Ich habe einen einfachen Code, in dem ich versuche, zwei Quadrate auf den Bildschirm zu zeichnen, aber an verschiedenen Positionen. Hier ist der Code, den ich benutze, um sie zu zeichnen.
// ------------------------------------------------------------------------------------------------------------------------------
void QuadShape::UpdateBuffers(ID3D11DeviceContext* pContext)
{
// Wir müssen über unsere Vertices Bescheid wissen + die konstanten Puffer setzen...
// HINWEIS: Wir müssen das nur tun, wenn sich die Pufferdaten tatsächlich ändern...
XMMATRIX translate = XMMatrixTranspose(XMMatrixTranslation(X, Y, 0));
XMStoreFloat4x4(&ConstData.World, translate);
D3D11_MAPPED_SUBRESOURCE mappedResource;
ZeroMemory(&mappedResource, sizeof(D3D11_MAPPED_SUBRESOURCE));
pContext->Map(ConstBuf, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
memcpy(mappedResource.pData, &ConstData, sizeof(ObjectConstBuffer));
pContext->Unmap(ConstBuf, 0);
}
// ------------------------------------------------------------------------------------------------------------------------------
void QuadShape::Draw(ID3D11DeviceContext* pContext)
{
UpdateBuffers(pContext);
pContext->DrawIndexed(_VertCount, _StartVert, 0);
}
Sie sehen, dass ich eine Translationsmatrix basierend auf der aktuellen X/Y-Position des Objekts berechne und diese in den konstanten Puffer des Objekts, bezeichnet als 'ConstBuf', mappe. Das Problem, das ich habe, ergibt sich daraus, dass alle Quadrate letztendlich an derselben Position gezeichnet werden, obwohl ich überprüft habe, dass die für jedes berechneten Matrizen tatsächlich unterschiedlich sind und dass die Puffer tatsächlich dynamisch sind.
Ich vermute, dass das Problem darin besteht, dass die gemappten Ressourcen einfach mit der letzten Matrix überschrieben werden, aber ich dachte, dass MAP_WRITE_DISCARD dies vermeiden sollte. Ich bin verwirrt, wie kann ich einen anderen konstanten Puffer pro Objekt verwenden und sie an einer anderen Position anzeigen lassen?