Ich habe eine Vielzahl von Bäumen gerendert durch die Verwendung von Instanzen in meiner Terrain-Generation App. Ich vergleiche eine Instanzliste mit meinem Kamerastumpf, um zu testen, ob sie sichtbar sind. Wenn sie sichtbar sind, werden sie an einen Instanzvektor gesendet. Jedes Bild, wenn Bäume sichtbar sind, aktualisiere ich den Bauminstanzpuffer. Dies funktioniert absolut gut und die Bäume wurden ohne Probleme jedes Bild gerendert, aber ich habe den Instanzpuffer jedes Frame neu erstellt, anstatt es aktualisiert.DirectX11 Update Dynamic Instance Buffer
I, die vor kurzem die Update-Funktion geändert, die ich dachte, würde stattdessen die Puffer aktualisieren:
void CModel::UpdateInstances(const std::vector<SInstance>& instances, ID3D11DeviceContext* context)
{
D3D11_MAPPED_SUBRESOURCE resource;
ZeroMemory(&resource, sizeof(resource));
mInstanceCount = instances.size();
size_t copySize = sizeof(SInstance) * mInstanceCount;
context->Map(mIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
memcpy(resource.pData, &instances[0], copySize);
context->Unmap(mIB, 0);
}
Das Problem ist, Arent die Bäume richtig gemacht, da es eine Menge von Flackern ist (was ich nicht konnte wirklich sehr gut erfassen), die ich nur als die Bäume überall teleporting beschreiben kann:
mit Verwendungs-Flag ‚D3D11_USAGE_DYNAMIC‘ einrichten Der Puffer richtig und Zugang fl ‚D3D11_CPU_ACCESS_WRITE‘ ag.
Ist es sofort offensichtlich, was ich falsch mache? dies ist als Referenz, wie der Puffer zuvor neu erstellt wurde:
void CModel::UpdateInstances(const std::vector<SInstance>& instances, ID3D11Device* device)
{
mInstanceCount = instances.size();
if (mIB)
SafeRelease(mIB);
D3D11_BUFFER_DESC ibd;
ibd.Usage = D3D11_USAGE_DYNAMIC;
ibd.ByteWidth = sizeof(SInstance) * mInstanceCount;
ibd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
ibd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
ibd.MiscFlags = 0;
ibd.StructureByteStride = 0;
D3D11_SUBRESOURCE_DATA isr;
isr.pSysMem = &instances[0];
isr.SysMemPitch = 0;
isr.SysMemSlicePitch = 0;
DXHRes(device->CreateBuffer(&ibd, &isr, &mIB));
}
'' Map'' gibt ein HRESULT zurück, das Sie nicht überprüfen. Sie müssen alle HRESULTs auf Fehler überprüfen mit '' SUCCEEDED'', '' FAILED'' oder [ThrowIfFailed] (https://github.com/Microsoft/DirectXTK/wiki/ThrowIfFailed) –
Danke, habe das nicht gesehen . Außerdem gibt es S_OK zurück. – Daniel
Haben Sie den Instanzpuffer mit der maximalen Instanzanzahl, die Sie jetzt haben, oder nur mit dem Größenergebnis aus der ersten Auswahl erstellt? – galop1n