2011-01-15 3 views
0

Ich las über DynamicVertexBuffer, und wie es besser für Daten sein soll, die sich häufig ändern. Ich habe eine Welt, die aus Würfeln besteht, und ich muss die Ecken der Würfel in diesem Puffer speichern, um sie auf den Bildschirm zu ziehen.Verwenden von DynamicVertexBuffer in XNA 4.0

Allerdings haben nicht alle Würfel Scheitelpunkte (einige sind Luft, die transparent ist) und nicht alle Flächen der Würfel müssen auch gezeichnet werden (sie sind einander zugewandt), also wie behalte ich die Scheitelpunkte im Auge wo im Puffer gespeichert? Außerdem müssen bestimmte Flächen zuletzt gezeichnet werden, nämlich diejenigen mit Transparenz (wie Glas oder Blätter), und diese Flächen müssen auch in einer Reihenfolge von vorne nach hinten gezeichnet werden, um die Alpha-Vermischung nicht zu stören.

Wenn alle diese Scheitelpunkte willkürlich in diesem Puffer gespeichert sind, woher weiß ich, welche Scheitelpunkte wo sind?

Auch die Anzahl der Scheitelpunkte kann sich ändern, aber der DynamicVertexBuffer scheint mir nicht sehr dynamisch zu sein, da ich seine Größe überhaupt nicht ändern kann. Muss ich den Puffer jedes Mal neu erstellen, wenn ich Flächen hinzufügen oder entfernen muss?

Antwort

3

Klingt so, als ob Sie sich dem falsch nähern - vorausgesetzt, Sie haben mehr als eine unbedeutende Anzahl von Würfeln in Ihrer Welt. Sie sollten die Welt (und ihre Würfel) in einer benutzerdefinierten Datenstruktur speichern, mit der Sie schnell bestimmen können, welche Würfel (und Gesichter) basierend auf den Regeln Ihrer Welt von einem bestimmten Punkt aus sichtbar sind, wenn Sie in eine bestimmte Richtung schauen.

Dann erzeugen Sie jedes Mal, wenn Sie eine Szene rendern, Stapel von Vertexpuffern nur dieser Flächen. Verwenden Sie daher keine Vertex-Puffer als Grundlage für die Speicherung der gesamten Geometrie Ihrer Welt. Vertex-Puffer sind ein Rendering-Tool, kein Weltdiagramm-Tool.

Diese Art von großen Sichtbarkeitsproblemen sind viel schneller im Code ausgeführt als von der GPU. Wenn Sie zum Beispiel am Ursprung sitzen und + x sehen, können Sie sofort alle Würfel in der -ve x -Richtung ignorieren, dies ist ein sehr einfaches Beispiel.

Für ein vollständigeres Beispiel Suche auf Oct-Tree-Rendering. Diese Art von Rendering würde Ihrem Welt-Layout sehr gut entsprechen.

Endgültige Tipp - wenn ich sage, erzeugen Chargen von Vertex Buffern - ich meine Sie Würfel zusammen auf Weisen, die Änderungen im Zustand der GPU (z. B. die gleiche Textur, der gleiche Shader usw.) zu minimieren. Das Minimieren von Änderungen am Zustand der GPU ist der Schlüssel zum Optimieren des Renderings - sobald Sie so weit wie möglich gegangen sind, indem Sie Gesichter von dem Rendern ausschließen.

+0

Ich glaube, du meintest "ignoriere alle Gesichter in der -ve x Richtung". Wie auch immer, danke für diese Info. Die Texturen stammen alle aus der gleichen Textur, also ist das kein Problem. Aber sag, dass ich der Welt einen Würfel hinzufüge, und dieser Würfel wird irgendwo platziert, damit er gerendert werden muss. Wo füge ich die Eckpunkte hinzu? Wie kann ich die GPU über diesen neuen Würfel informieren, ohne die Größe des Ortes zu ändern, an dem alle anderen Knoten gespeichert sind? Ich werde Octree Rendering nachschlagen, ich habe Quadtrees und Octrees erwähnt. – Bevin

+0

Ich meine, alle Würfel in der -ve x Richtung zu ignorieren, vorausgesetzt, dass Würfel eine höhere Ebene der Datenstruktur als Flächen sind. Wenn Sie einen Cube ignorieren können, können Sie automatisch alle 6 Flächen ignorieren. Es ist also schneller, Würfel zuerst zu entfernen. Wenn Sie dann potentiell sichtbare Cubes gesetzt haben, versuchen Sie, Flächen zu entfernen. –

+1

Sie denken immer noch über Vertexpuffer, die über Frames hinweg persistent sind. In den meisten Motoren sind sie nicht. Sie füllen die Vertex-Puffer von Grund auf jeden Frame. Sicher können Sie Speicherplatz zuweisen - aber Sie erstellen die Daten neu. Die potenziell sichtbare Gruppe von Gesichtern ändert sich bei jedem Bild. Wenn Sie darüber nachdenken, könnten Sie eine Welt mit Millionen von Würfeln haben, aber jedes Bild, das Sie so wenig wie möglich darstellen wollen - vielleicht nur Hunderte -, besteht darin, die Größe der Eckenpuffer so klein wie möglich zu machen Rahmen. –