Entmystifizierung der Detailgenauigkeit

17

Erst kürzlich haben wir versucht, ein detailliertes System in Unity zu implementieren. Ich werde vier Netzebenen erzeugen, jede mit einer Höhenkarte, aber ich denke, das ist im Moment nicht so wichtig. Nachdem ich mich mit dieser Technik befasst habe, habe ich viele Fragen. Ich hoffe, dass dies nicht zu viel ist, um alles auf einmal zu fragen, aber ich wäre äußerst dankbar, wenn jemand mir helfen würde, diese Technik zu verstehen.

1 : Ich kann nicht verstehen, an welchem ​​Punkt in der Chunked LOD- Pipeline das Netz in Blöcke aufgeteilt wird. Befindet sich dies während der anfänglichen Netzerzeugung oder gibt es einen separaten Algorithmus, der dies ausführt.

2 : Ich verstehe, dass eine Quadtree-Datenstruktur zum Speichern der Chunked-LOD- Daten verwendet wird. Ich glaube, ich vermisse den Punkt ein wenig. Speichert der Quadtree Scheitelpunkt- und Dreiecksdaten für jede Unterteilungsebene?

3a : Wie wird die Kameraentfernung normalerweise berechnet? Beim Nachlesen von Quadtrees werden häufig Bounding-Boxes mit Achsenausrichtung erwähnt. Würde in diesem Fall jeder Chunk einen Kollisionsbegrenzungsrahmen haben, um zu erkennen, ob sich die Kamera oder der Player in der Nähe befindet? oder gibt es einen besseren weg dies zu tun? (Raycast vielleicht?)

3b : Berechnen die Chunks die Kameraentfernung selbst?

4 : Hat jeder Chunk die gleiche "Auflösung". Auf der obersten Ebene ist das Netz beispielsweise 32 x 32, und jeder unterteilte Knoten ist auch 32 x 32. Beispiel unten:

Beispiel für Chunked LOD

Caius Eugene
quelle
Wenn jemand einen besseren LOD-Ansatz für einen prozeduralen Planeten kennt, wäre das auch interessant.
Caius Eugene
Ich nehme an, Sie haben sich bereits Thatcher Ulrichs Original-SIGGRAPH-Artikel und das dazugehörige Programm angesehen? tulrich.com/geekstuff/chunklod.html
drxzcl
Ich habe, es ist bis zu einem gewissen Punkt sehr informativ, aber es geht nicht um die Art der Details oder Ansätze zur Implementierung. Vielen Dank
Caius Eugene
1
Hier gibt es eine Reihe von Optionen für die planetare LOD. vterrain.org/LOD/spherical.html
OriginalDaemon

Antworten:

12

1: Ich kann nicht verstehen, an welchem ​​Punkt in der Chunked LOD-Pipeline das Netz in Blöcke aufgeteilt wird. Befindet sich dies während der anfänglichen Netzerzeugung oder gibt es einen separaten Algorithmus, der dies ausführt.

Das ist egal. Beispielsweise können Sie das Chunking in Ihren Algorithmus zur Netzgenerierung integrieren. Sie können dies sogar dynamisch tun, sodass niedrigere Ebenen mithilfe eines plasmaartigen Verfeinerungsalgorithmus dynamisch hinzugefügt werden (z. B. wenn der Spieler näher rückt). Sie können auch ein hochauflösendes Netz aus Künstlereingabe- oder Höhenmessdaten generieren und es zum Zeitpunkt der Finalisierung des Assets in allen LOD-Abschnitten zusammenfassen. Oder Sie können mischen und zusammenpassen. Das hängt wirklich von Ihrer Anwendung ab.

2: Ich verstehe, dass eine Quadtree-Datenstruktur zum Speichern der Chunked-LOD-Daten verwendet wird. Ich glaube, ich vermisse den Punkt ein wenig. Speichert der Quadtree Scheitelpunkt- und Dreiecksdaten für jede Unterteilungsebene?

Nicht unbedingt. Der Baum speichert nur Informationen über die Geometrie und wie sie gerendert werden soll. Dies kann bedeuten, dass an jedem Baumknoten eine Scheitelpunkt- / Flächenliste vorhanden ist. Realistischer in der heutigen Zeit würden Sie die Handles der Netze / Instanzen im GPU-Speicher speichern.

3a: Wie wird die Kameraentfernung normalerweise berechnet? Beim Nachlesen von Quadtrees werden häufig Bounding-Boxes mit Achsenausrichtung erwähnt. Wäre in diesem Fall für jeden Chunk ein Kollisionsbegrenzungsrahmen vorhanden, um zu erkennen, ob sich die Kamera oder der Player in der Nähe befindet? oder gibt es einen besseren weg dies zu tun? (Raycast vielleicht?)

Eine sehr kostengünstige und einfache Möglichkeit besteht darin, den Abstand zum Mittelpunkt des Blocks zu verwenden und ihn dann zu korrigieren. Sie wissen, dass dieser Abstand immer eine Unterschätzung ist: Wenn der Mittelpunkt auf Abstand liegt Z, bedeutet dies, dass die Hälfte des Abschnitts näher ist. Was wir jedoch nicht wissen, ist die Orientierung. Wenn wir ein Stück mit der Breite " wEdge-On" anzeigen , befindet sich das nächstgelegene Stück auf Distanz Z-w. Wenn wir jedoch den Block mit der Ecke voran betrachten, befindet sich das nächstgelegene Bit in einiger Entfernung Z-sqrt(2)*w. Wenn Sie mit dieser Unsicherheit leben können (Sie können es fast immer), sind Sie fertig. Beachten Sie, dass Sie den Betrachtungswinkel auch mithilfe der grundlegenden Trigonometrie korrigieren können.

Ich ziehe es vor, den absoluten Mindestabstand zwischen Kamera und Chunk zu berechnen, um Artefakte zu minimieren. In der Praxis bedeutet dies, einen Punkt-Quadrat-Abstandstest durchzuführen . Es ist ein bisschen mehr Arbeit, als die Abstände zu den Mittelpunkten zu berechnen, aber es ist nicht so, als würden Sie von jedem Frame eine Unmenge davon machen.

Wenn Sie Ihre Physik-Engine dazu nutzen können, tun Sie dies auf jeden Fall, aber Sie möchten wirklich mehr über "Entfernungsabfrage" als über "Kollision" nachdenken.

3b: Berechnen die Chunks die Kameraentfernung selbst?

Es hängt wirklich vom Design Ihres Motors ab. Ich würde empfehlen, die Blätter relativ leicht zu halten. Abhängig von Ihrer Plattform kann bereits der Aufwand für die Durchführung eines eigenen Updates durch einige tausend Terrain-Chunks für jeden Frame die Leistung erheblich beeinträchtigen.

4: Hat jeder Chunk die gleiche "Auflösung". Auf der obersten Ebene ist das Netz beispielsweise 32 x 32, und jeder unterteilte Knoten ist auch 32 x 32.

Sie müssen nicht, aber es ist praktisch, wenn alle Blöcke den gleichen Platz beanspruchen. Dann können Sie Ihre (GPU-) Speicherverwaltung in Einheiten von "Chunks" durchführen. Es ist auch einfacher, die Nähte zwischen zwei Blöcken unterschiedlicher Größe zu entfernen / zu verbergen, wenn eine Auflösung ein Vielfaches der anderen ist, da sie mehrere Scheitelpunkte gemeinsam haben. (zB: 32x32 und 64x64 ist einfacher zu verwalten als 32x32 und 57x57) (danke Guiber!). Wenn Sie einen guten Grund haben, die Größe der Blockgeometrie zu ändern, sollten Sie dies unbedingt tun.

drxzcl
quelle
2
Es ist auch einfacher, die Nähte zwischen zwei Blöcken unterschiedlicher Größe zu entfernen / zu verbergen, wenn eine Auflösung ein Vielfaches der anderen ist, da sie mehrere Scheitelpunkte gemeinsam haben. (zB: 32x32 und 64x64 ist einfacher zu verwalten als 32x32 und 57x57)
Alayric
Geniale Antwort: Es wurden viele Dinge geklärt. Insbesondere, dass ein Großteil der Implementierung auf die Leistungsfähigkeit des Motors zurückzuführen ist. Mit 3a bin ich immer noch nicht sicher, wann zu feuern eine Distanzabfrage, die beiden Implementierungen I Sound CPU schwer betrachtet habe, werde ich etwas mehr Forschung zu diesem Thema tun. Vielen Dank
Caius Eugene
Guiber, du hast recht! Ich
klaue
1
@CaiusEugene: Ich denke du überdenkst deine Entfernungsbestimmung. Ich habe der Antwort in Punkt 3a einen sehr billigen, sehr einfachen Algorithmus hinzugefügt, der Ihnen den Einstieg erleichtern soll.
drxzcl