Schließlich kann ich nach langem Nachforschen zu dem Schluss kommen, dass es, wie bereits gesagt, keine allgemein "beste" Methode gibt. Meine Recherche führte mich jedoch zu folgenden Erkenntnissen:
Abhängig von der Masche werden Sie schließlich verwenden:
- Spherified Cube: Jede LOD-Methode mit Quadtree-Implementierung funktioniert einwandfrei. Sie müssen sich nur um Sonderfälle wie Grenzen zwischen Flächen kümmern. In diesem Fall muss Ihr Quadtree in jeder Ebene einen Zeiger auf den Nachbarn in der angrenzenden Fläche haben.
- Sonstiges: Ich denke, dass ROAM (neuere Version 2.0 oder eine andere Erweiterung wie BDAM, CABTT oder RUSTIC) gut funktioniert. Diese Algorithmen sind jedoch schwer zu verarbeiten, erfordern mehr Speicher und sind etwas langsamer als andere Vorgehensweisen mit Cubes.
Es gibt viele LOD-Methoden, die gut passen, aber meine persönlichen Top 5 sind:
- Kontinuierliche entfernungsabhängige LOD (CDLOD)
- GPU-basierte Geomety-Clipmaps (GPUGCM)
- Chunked LOD
- Rendern von Terrains mit OpenGL-GPU-Tessellation (Buch: OpenGL Insight, Kapitel 10)
- Geometrisches MipMapping
Jedes bietet eine einzigartige Möglichkeit, Terrains zu rendern. CDLOD bietet beispielsweise eine sehr einfache Implementierung mithilfe von Shadern (GLSL oder HLSL), kann jedoch auch auf der CPU (für ältere Hardware) implementiert werden Das Beste für moderne GPUs. Daher ist GPUGCM das Beste, wenn Sie Ihre GPU komprimieren möchten. Beide funktionieren sehr gut mit datenbasiertem, prozeduralem oder gemischtem Rendering (Terrain basierend auf festen Daten oder Höhenkarten und Details, die mit prozeduralem Rendering hinzugefügt wurden) von großen Terrains.
Es gibt auch eine sphärische Erweiterung der grundlegenden geometrischen Clipmaps-Methode, die jedoch einige Probleme mit sich bringt, da die planaren Samples der Höhenkarte unter Verwendung von sphärischen Koordinaten parametrisiert werden müssen.
Chunked LOD hingegen ist perfekt für Legacy-Hardware, benötigt keine GPU-seitigen Berechnungen, ist perfekt für große Datenmengen, kann aber keine prozeduralen Daten in Echtzeit verarbeiten (möglicherweise mit einigen Änderungen).
Die Verwendung von Tessellation-Shadern ist eine andere, sehr neue Technik, da OpenGL 4.x herausgekommen ist. Meiner Meinung nach könnte dies die beste sein, aber wir sprechen über Planet Rendering. Wir stoßen auf ein Problem, das andere Methoden sehr einfach handhaben können und das es auch ist über Präzision.
Verwenden Sie Tessellation-Shader, es sei denn, Sie möchten nur eine Genauigkeit von 1 km zwischen Verticies. Das Problem bei wirklich großen Terrains mit dieser Methode ist, dass Jitter schwer zu lösen ist (oder zumindest für mich, da ich neu in Tessellation-Shadern bin).
Geomipmapping ist eine großartige Technik, nutzt den Quadtree und weist einen geringen projizierten Pixelfehler auf. Für das planetarische Rendern müssen Sie jedoch mindestens 16 Detailebenen festlegen, dh, Sie benötigen (zum Zusammenfügen von Posen) einige zusätzliche Patches Um verschiedene Level zu verbinden und sich um das Level deines Nachbarn zu kümmern, kann es mühsam sein, dies zu lösen, insbesondere wenn 6 Geländegesichter verwendet werden.
Es gibt eine andere Methode, die für sich ganz besonders ist: "Projective Grid Mapping for Planetary Terrain", die sich hervorragend zur Visualisierung eignet , aber ihre Nachteile hat, wenn Sie mehr wissen möchten, gehen Sie zum Link.
Probleme:
Jitter : Die meisten heutigen GPUs unterstützen nur 32-Bit-Gleitkommawerte, was für die Manipulation großer Positionen in Terrains mit planetarischem Maßstab nicht genau genug ist. Jitter tritt auf, wenn der Betrachter zoomt und sich dreht oder bewegt, und die Polygone beginnen, vor und zurück zu springen.
Die beste Lösung hierfür ist die Verwendung der Methode "Rendern relativ zum Auge mit der GPU". Diese Methode ist im Buch "3D-Engine-Design für virtuelle Globen" (ich bin sicher, Sie finden es auch im Internet) beschrieben, in dem Sie im Grunde alle Ihre Positionen mit Doppel-CPU festlegen müssen (Patches, Clipmaps, Objekte, Frustrum, Kamera usw.) und dann wird MV um den Betrachter herum zentriert, indem seine Übersetzung auf (0, 0, 0) T gesetzt wird, und die Doppelbilder werden in einer Festkommadarstellung unter Verwendung der Bruchbits (Mantisse) von zwei Floats, niedrig, codiert und hoch durch eine Methode (lesen Sie über die Implementierung von Using Ohlarik und die DSFUN90 Fortran-Bibliothek).
Obwohl der Vertex-Shader nur zwei zusätzliche Subtraktionen und eine Addition erfordert, verdoppelt GPU RTE die Menge des für Positionen erforderlichen Vertex-Pufferspeichers. Dies verdoppelt nicht unbedingt den Speicherbedarf, es sei denn, es werden nur Positionen gespeichert.
Tiefenpuffer-Präzision : Z-Fighting. Da wir in diesem Fall sehr großes Terrain rendern: Planeten, muss der Z-Puffer RIESIG sein, aber es spielt keine Rolle, welche Werte Sie für znear und zfar festlegen, es wird immer Probleme geben.
Da der Z-Puffer von einem Gleitkommaintervall abhängt und es sich auch um lineare Werte handelt (obwohl die perspektivische Projektion nicht linear ist), leiden die Werte in Augennähe unter Z-Fighting, da es an präzisen 32-Bit-Gleitkommas mangelt.
Die beste Lösung für dieses Problem ist die Verwendung eines "logarithmischen Tiefenpuffers"
http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
Ein logarithmischer Tiefenpuffer verbessert die Tiefenpuffergenauigkeit für entfernte Objekte, indem eine logarithmische Verteilung für zscreen verwendet wird. Es tauscht Präzision gegen nahe Objekte gegen Präzision gegen entfernte Objekte. Da wir mit einer LOD-Methode rendern, erfordern ferne Objekte eine geringere Genauigkeit, da sie weniger Dreiecke haben.
Zu erwähnen ist, dass alle aufgelisteten Methoden (mit Ausnahme des projektiven Gitters) aufgrund der Quadtree-Basis sehr gut in der Physik sind (Kollisionen meistens). Dies ist ein Muss, wenn Sie vorhaben, ein Spiel zu erstellen.
Überprüfen Sie abschließend einfach alle verfügbaren Optionen und wählen Sie die, die Ihnen am besten gefällt. Meiner Meinung nach leistet CDLOD eine großartige Arbeit. Vergessen Sie nicht, die Probleme mit dem Jitter und dem Z-Buffer zu lösen. Und das Wichtigste: Viel Spaß beim Erstellen!
Weitere Informationen zum LOD-Check diesem Link .
Für eine vollständige Demonstration über die Sphärisierung eines Würfels überprüfen diesen Link .
Weitere Informationen zum Lösen von Jittering und Z-Buffer-Genauigkeiten finden Sie unter diesem Buch .
Ich hoffe, Sie finden diese kleine Rezension hilfreich.