2016-06-10 18 views
1

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:

enter image description here

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)); 
} 
+0

'' 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) –

+0

Danke, habe das nicht gesehen . Außerdem gibt es S_OK zurück. – Daniel

+0

Haben Sie den Instanzpuffer mit der maximalen Instanzanzahl, die Sie jetzt haben, oder nur mit dem Größenergebnis aus der ersten Auswahl erstellt? – galop1n

Antwort

0

Wie @ galop1n wies darauf hin, das Problem zurückzuführen auf die Tatsache, dass ich nicht den Instanz-Puffer mit der maximalen Menge von Instanzen wurde zu schaffen, waren möglich.

Um das Problem zu lösen, habe ich einfach den Puffer in diesem Sinne erstellt.

D3D11_BUFFER_DESC ibd; 
ibd.Usage = D3D11_USAGE_DYNAMIC; 
ibd.ByteWidth = sizeof(SInstance) * maxInstances; 
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));