Optimieren eines Netzes für Voxelwürfellandschaften

12

Wenn ich in Unity 3D (prozedural generierte Voxellandschaften mit Würfeln) mit der Erstellung von minecraftish / lego-Weltlandschaften herumspiele, stelle ich fest, dass die für diese Landschaften erstellten Maschen viel Speicherplatz beanspruchen. Das Netz besteht derzeit nur aus Eckpunkten für die sichtbaren Seiten eines Würfels. Die Speichernutzung für ein komplexes Terrain kann 6-700 Megabyte betragen.

Diese Netze könnten optimiert werden, aber ich bemühe mich, einen anständigen Algorithmus zu finden, um dies zu tun.

Der Algorithmus muss berücksichtigen, dass Sie keine Blöcke mit unterschiedlichen Geländetypen "zusammenführen" möchten. Ich denke, ein wirklich einfacher Anfang könnte sein, einfach alle Blöcke entlang einer Achse zu verarbeiten und zusätzliche Sweeps für die anderen beiden Achsen durchzuführen.

Ich muss die Maschenform beibehalten, dh keine Zusammenführung von Scheitelpunkten bis zu dem Punkt, an dem der leere oder feste Raum geändert wird. Der Grund dafür ist, dass es möglicherweise Kreaturen / etc gibt, die noch durch das Netz navigieren müssen. Ich kann also nicht einfach ein wirklich detailarmes, verzerrtes Netz erstellen.

Irgendwelche Gedanken / Vorschläge / Tipps dazu?

James Livingston
quelle
2
Warum speichern Sie Scheitelpunkte für einen Würfel bekannter Größe? Mach es algorithmisch; oder verwenden Sie einen gemeinsam genutzten Scheitelpunktpuffer.
deceleratedcaviar
Warum Polygonnetz? Voxel kann so wie es ist sehr effizient gerendert werden . Für einen Voxelwürfel benötigen Sie 3 Floats (x, y, z), für eine Box benötigen Sie ca. 8 * 3 Floats (8 Vertices) und für den Fall, dass Sie implizite Kanten und Polygone haben. Vielleicht ist Unity nicht das Werkzeug für dieses Voxelproblem.
User712092

Antworten:

5

Meine Frage ist:

Warum brauchst du das Netz selbst, um Kreaturen zu bewegen?

Können Sie die Pfadberechnung nicht mit einer 3D-Matrix von IDs durchführen?

Ich denke, Minecraft verwendet eine 3D-Matrix mit 4-Bit-PR-Block. Außerdem werden nur Kreaturen mit einem bestimmten Radius um den Spieler simuliert.

Sie können Ihre Chunks in einer Oc-Tree-Struktur speichern, in der jeder Chunk komprimiert wird.

Wenn Sie die komprimierten Daten im RAM behalten, können Sie sie bei Bedarf recht schnell dekomprimieren.

Alt-Text

Nagler
quelle
Ich habe mich darauf verlassen, dass das Netz für die integrierte Kollisionserkennung mit Unity zur Verfügung steht, aber nichts hindert mich daran, nur Kollisionen / Pfade anhand einer benutzerdefinierten Datenstruktur zu testen. Ich muss jedoch noch ein sichtbares Netz für die Darstellung des Geländes erstellen, und das muss ich optimieren.
James Livingston
Ein weiterer Punkt ... wie Sie auf dem Screenshot sehen können ... gibt es nicht viel von diesem Gelände, das flach ist. Die Maschen sind im Allgemeinen raue Oberflächen von Würfeln, aber ich denke, es gibt etwas Raum für die Optimierung der Maschenflächen / -scheitelpunkte. Es scheint, als wäre ein Octree am besten für Daten geeignet, die viele ähnliche Datenblöcke anstelle von "zackigen" Daten enthalten. Oder stimmt das nicht?
James Livingston
@Gatorfrog: Denken Sie daran, dass der leere Raum auch Daten sind. Wenn es dann sicher zackig ist, wird es viele Bits geben, die signalisieren, dass es leer ist. Das Octree ist nur für Sie da, um herauszufinden, welche Chunks Sie dekomprimieren sollten, bevor Sie sie rendern. Der leere Raum wird nur ein Bündel von Nullen sein. Mein Dayjob beinhaltet die Arbeit mit einer sehr ausgefeilten Voxel-Rendering-Bibliothek. Mein nächster Beitrag wird beschreiben, was sie tun.
Nagler
Die Bibliothek, mit der ich arbeite, geht folgendermaßen vor: Erstellt Datenblöcke und speichert sie in einer Einfachdatei-Datenbank. Jeder Chunk hat eine ID. Jeder Würfel besteht aus vielen Stücken. Für jeden Chunk wird eine bestimmte Anzahl von Detailebenen erstellt. Wenn die höchste Detailstufe 100% der Voxel enthält, hat die zweithöchste 25% aller Voxel und wird dann für jede nachfolgende Stufe durch 4 geteilt. Chunks in Ihrer Nähe können mit höchster Detailgenauigkeit visualisiert werden.
Nagler
Alle Daten werden in komprimierter Form vom RAM zum VRAM gesendet, wo sie von in CUDA ausgeführten GPGPU-Komprimierungsalgorithmen aufgeblasen werden. Dies spart viel Speicherplatz. Also: Überprüfen Sie, wo sich der Spieler befindet, und erhalten Sie detaillierte Abschnitte. Die Dinge, die am weitesten entfernt sind, können mithilfe einer der unteren LODs leicht visualisiert werden.
Nagler
1

Wie wäre es mit einem Octree, um das Gelände zu speichern?

ZB Luft = kein Knoten, alle anderen Geländetypen hätten einen Knoten mit dem Geländetyp.

Beim Einfügen / Entfernen von Knoten können Sie überprüfen, ob alle acht untergeordneten Knoten in dem geänderten Baumpfad denselben Terain-Typ haben, und sie bei Bedarf zusammenführen. Auf diese Weise würden große Blöcke desselben Materials nur einen Knoten belegen.

Exilyth
quelle
0

Erstellen Sie die Cubes nur für Teile der Geometrie, die der Player sehen kann? Das wäre mein erster Schritt. Abhängig von der Größe Ihres Geländes muss nicht die gesamte Welt geladen / gezeichnet / sichtbar / was auch immer sein.

Tetrade
quelle
Ich erstelle das Netz nur für Seiten von Würfeln, neben denen leere Luft ist. Soweit ich keine Maschen gezeichnet habe, die der Spieler nicht sehen kann ... Ich habe darüber nachgedacht, irgendwelche Stücke auszuschließen, die keine sichtbaren Blöcke hatten, wie unterirdische Höhlen oder Löcher, die schräg in den Boden führten. An diesem Punkt könnte ich mich jedoch definitiv nicht auf meine Netze für Kollisionen / Pfade verlassen.
James Livingston