(DirectX 11) Dynamische Vertex - /Index-Buffer-Implementierung mit konstanter Szene Inhalt ändert

Wurde uns nicht in die un-managed DirectX 11 für die erste Zeit (Geduld mit mir) und es gibt ein Problem, das, obwohl schon mehrfach gefragt, über die Foren noch immer lässt mich mit Fragen.

Ich bin mit der Entwicklung der app, in dem Objekte Hinzugefügt, um die Szene im Laufe der Zeit. Auf jedem render loop will ich sammeln alle vertices in der Szene und Rendern Sie Sie wiederverwenden einer einzelnen vertex-und index-buffer für performance und best practice. Meine Frage ist in Bezug auf die Nutzung von dynamischen vertex-und index-buffer. Ich habe nicht in der Lage, vollständig zu verstehen und Ihre korrekte Verwendung der Szene, wenn sich der Inhalt ändert.

vertexBufferDescription.Usage               = D3D11_USAGE_DYNAMIC;
vertexBufferDescription.BindFlags           = D3D11_BIND_VERTEX_BUFFER;
vertexBufferDescription.CPUAccessFlags      = D3D11_CPU_ACCESS_WRITE;
vertexBufferDescription.MiscFlags           = 0;
vertexBufferDescription.StructureByteStride = 0;

Sollte ich die Puffer, wenn die Szene initialisiert und irgendwie aktualisieren Ihre Inhalte in jedem frame? Wenn ja, was Bytegröße muss ich einstellen im Puffer Beschreibung? Und was muss ich initialisieren Sie es mit?

Oder, sollte ich es schaffen das erste mal die Szene, die gerendert wird (Bild 1) mit dem aktuellen vertex-count als seine Größe? Wenn das so ist, wenn ich ein anderes Objekt der Szene, kann ich nicht neu erstellen zu müssen die Puffer und die änderung der Puffer-Beschreibung ist ByteWidth der neuen vertex-count? Wenn meine Szene hält an der Aktualisierung der Scheitelpunkte auf jedem frame, die Verwendung einer einzigen dynamischen Puffer würde Locker seinen Zweck so...

Ich habe die Prüfung beim initialisieren des Puffers auf das erste mal die Szene, die gerendert wird, und von dort aus mit Map/Unmap auf jedem frame. Ich beginne, indem Sie ein Vektor-Liste mit all den Szene-Objekte und aktualisieren Sie die Ressource, zum Beispiel so:

void Scene::Render() 
{
    (...)

    std::vector<VERTEX> totalVertices;
    std::vector<int> totalIndices;
    int totalVertexCount = 0;
    int totalIndexCount = 0;

    for (shapeIterator = models.begin(); shapeIterator != models.end(); ++shapeIterator)
    {
            Model* currentModel = (*shapeIterator);

            //totalVertices gets filled here...
    }

     //At this point totalVertices and totalIndices have all scene data

    if (isVertexBufferSet)
    {
        //This is where it copies the new vertices to the buffer.
        //but it's causing flickering in the entire screen...
        D3D11_MAPPED_SUBRESOURCE resource;
        context->Map(vertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
        memcpy(resource.pData, &totalVertices[0], sizeof(totalVertices));
        context->Unmap(vertexBuffer, 0);
    }
    else
    {
        //This is run in the first frame. But what if new vertices are added to the scene?
        vertexBufferDescription.ByteWidth = sizeof(VERTEX) * totalVertexCount;
        UINT stride = sizeof(VERTEX);
        UINT offset = 0;

        D3D11_SUBRESOURCE_DATA resourceData;
        ZeroMemory(&resourceData, sizeof(resourceData));
        resourceData.pSysMem = &totalVertices[0];

        device->CreateBuffer(&vertexBufferDescription, &resourceData, &vertexBuffer);
        context->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
        isVertexBufferSet = true;
    }

Ende die render-Schleife, während die Verfolgung der buffer-position der vertices für jedes Objekt, die ich abschließend aufrufen von Draw():

    context->Draw(objectVertexCount, currentVertexOffset);
}

Meine aktuelle Umsetzung ist-was meinen ganzen Szene zu flackern. Aber keine Speicherverluste. Frage mich, ob es hat etwas zu tun mit der Art und Weise bin ich mit der Map/Unmap-API?

Auch, wenn in diesem Szenario wäre es ideal, invoke buffer->Release()?
Tips oder Beispielcode wäre Super! Vielen Dank im Voraus!

  • Kopieren Sie die Eckpunkte zu einem vertex-buffer in jedem frame scheint wie eine sehr ineffiziente Sache zu tun, es sei denn, jeder vertex verändert sich in jedem frame das scheint unwahrscheinlich, für die meisten Dinge. es ist viel mehr normal, erstellen Sie den Puffer einmal.
  • In der Zwischenzeit habe ich es geschafft, zu beheben das flackern Problem. Der memcpy falsch war, und ich die Menge der bytes, die kopiert werden, die übergeben wird auf falsch. Es hat zu werden, sizeof(VERTEX) * totalVertices.Größe().
  • Sind Sie richtig. Ich vergaß zu erwähnen, dass ich die Steuerung der Szene den schmutzigen Zustand genau zu lassen, die Puffer wie die meisten der Zeit. Ich bin mir nur nicht sicher, ob vertex/index buffer Schöpfung konnte nicht durchgeführt werden, init (), anstatt auf dem ersten Bild, wie in dem Beispielcode.
InformationsquelleAutor VOliveira | 2013-03-20
Schreibe einen Kommentar