Wie werden in modernen Spielen Geometriedetails für Objektnetze wie Zeichen, Gelände und Blätter erstellt? Meine Frage besteht aus zwei Teilen:
- Wie sieht die Asset-Pipeline aus? Stellen Künstler ein High-Poly-Modell her, das später dezimiert wird? Wenn ja, welche Dezimierungsalgorithmen sind am beliebtesten? Werden LOD-Netze manchmal von Hand hergestellt?
- Wie wechseln Engines zur Laufzeit zwischen verschiedenen Objekt-LODs? Gibt es fließende oder progressive Übergänge?
Die Antwort könnte lauten: "Verschiedene Studios verwenden unterschiedliche Techniken." Wenn ja, geben Sie bitte einige der gängigsten Praktiken an. Es wäre auch großartig, wenn Sie mich auf Whitepapers / Folien verweisen könnten, die bestimmte Beispiele behandeln.
Antworten:
Bei der Geometrie-LOD wechseln die meisten Spiele einfach zwischen einer Reihe vordefinierter LOD-Netze. Zum Beispiel verwendet "Infamous: Second Son" 3 LOD-Netze ( Adrian Bentley - "inFAMOUS: Second Son Postmortem", GDC 2014 ) und "Killzone: Shadow Fall" 7 LOD-Netze pro Charakter ( Michal Valient - "Killzone: Shadow Fall") Demo postmortem ", Devstation2013 ). Die meisten von ihnen werden erzeugt, aber wichtigere (wie die Hauptfigur) können von Hand hergestellt werden. Netze werden häufig mit einer beliebten Simplygon-Middleware erstellt, manchmal werden sie jedoch auch von Grafikern in ihrem bevorzugten 3D-Paket erstellt.
Bei Spielen mit großem Zugabstand werden zusätzlich Imposter für Laub, Bäume und hohe Gebäude verwendet ( Adrian Bentley - "inFAMOUS: Second Son Engine Postmortem", GDC 2014 ). Sie verwenden auch hierarchische LODs, die einen Satz von Objekten durch einen ersetzen. Zum Beispiel werden in "Just Cause 2" Bäume zunächst einzeln als normale LOD-Netze gerendert, dann einzeln als Betrüger und schließlich als einzelnes zusammengeführtes Waldnetz ( Emil Persson, Joel de Vahl - "Besiedlung einer riesigen Spielwelt", Siggraph2013 ) und in Entfernte Teile der Welt von "Sunset Overdrive" werden durch einzelne, automatisch offline generierte Netze ersetzt ( Elan Ruskin - "Streaming Sunset Overdrives Open World", GDC2015 ).
Eine weitere Komponente eines LOD-Systems ist die Vereinfachung von Materialien und Shadern. Beispiel: "Killzone: Shadow Fall" deaktiviert den Tangensraum und die normale Zuordnung für die entfernten LODs ( Michal Valient - "Killzone: Shadow Fall-Demo nach dem Tod", Devstation2013 ). Dies wird normalerweise implementiert, indem eine Reihe von Shader-Features pro LOD global deaktiviert werden. Bei Engines mit Shader-Diagrammen, in denen Interpreten benutzerdefinierte Shader erstellen können, muss dies jedoch manuell erfolgen.
Bei den LOD-Übergängen wechseln manche Spiele einfach die Maschen und manche verwenden Dithering für reibungslose LOD-Übergänge. Beim LOD-Wechsel werden zwei Maschen gerendert: die erste wird allmählich ausgeblendet und die zweite wird eingeblendet ( Simon schreibt Blog - "Assassins Creed 3 - LoD Blending" ). Klassische progressive CPU-Mesh-Techniken werden nicht verwendet, da sie ein kostspieliges Mesh-Update und das Hochladen auf die GPU erfordern. Hardware Tessellation wird in einigen Titeln verwendet, jedoch nur zur Verfeinerung eines detailliertesten LOD, da es langsam ist und im Allgemeinen vordefinierte Geometrie-LODs nicht ersetzen kann.
Terrain-LODs werden separat behandelt, um ihre spezifischen Eigenschaften zu nutzen. Geländegeometrie LOD wird normalerweise mithilfe von Clipmaps implementiert ( Marcin Gollent - "Landschaftserstellung und -rendering in REDengine 3" ). Geländematerial-LODs werden entweder ähnlich wie Mesh-LODs oder mit einer Art virtueller Textur behandelt. Ka Chen - "Adaptives virtuelles Textur-Rendering in Far Cry 4" .
Wenn Sie sich für LOD-Pipelines für echte Spiele interessieren, stöbern Sie einfach in der Dokumentation einer der modernen Spiele-Engines: Unreal Engine 4 - "Erstellen und Verwenden von LODs" , CryEgnine - Static LOD und Unity-LOD .
quelle
LOD (Level of Detail) bedeutet das Verwalten von Objekten in unterschiedlichen Darstellungsmaßstäben, die in zwei Teile unterteilt sein können. Sie können jedoch eine davon verwenden, und das würde für die meisten Fälle ausreichen.
Ein- / Ausblenden von Ebenen (Gruppe von Objekten desselben Typs) abhängig von der Größe (Anzeigeskala).
Algebraische Geomery-basierte Methode, Generalization genannt (ein Algorithmus zur Vereinfachung von Polygonen). schau dir das folgende bild an
Die bekannteste und effizienteste Methode zum Verallgemeinern (Vereinfachen) eines Polygonnetzes ist das Descartes-Euler-Polyedersatz (Gleichung 4.5), die von den meisten räumlichen Datenbanken verwendet wird Zum Beispiel PostGIS-Module in PostgreSQL. Es werden einfach kleinere Seiten eines Polygons entfernt und es wird eine sehr abgerundete Seite erstellt. (Bild oben)
Um LOD in einem Spiel zu implementieren, müssen Sie den Maßstab Ihrer Karte (Szene) beim Vergrößern / Verkleinern speichern und verwalten. Die Skala ändert sich von Null nach Unendlich und Sie müssen dies in eine bestimmte Anzahl von Bereichen aufteilen, zum Beispiel in etwa wie folgt:
Dann müssen Sie definieren, welche Arten Ihrer Objekte (Ebenen) in jedem der oben genannten Bereiche sichtbar oder unsichtbar sein sollen. Zum Beispiel sollte ein kleiner Objekttyp wie ein Hydrantenventil nicht sichtbar sein, wenn sich der Benutzer im vierten Bereich befindet, da er bei dieser Skala sehr klein ist und nicht unterschieden werden kann, sodass es egal ist, ob Sie ihn auf der Zeichnung überspringen Bildschirm.
Wenn ein Benutzer die Vergrößerung durch Vergrößern und Verkleinern ändert, wechselt er durch die oben genannten Grenzen von einem zum anderen Bereich. In Ihrem Spiel werden diese Anzeigeskalen zum Verwalten der Detailebene verwendet, indem Objekte in der Szene angezeigt oder ausgeblendet werden. Dies ist eine diskrete Lösung, bei der Objekte während des Verkleinerns plötzlich verblassen. Wenn jedoch die Anzeigeskalen und Vergrößerungsbereiche sorgfältig definiert sind, spürt der Benutzer nichts.
Die obige Gruppe von 4 Bereichen ist nur ein Beispiel und Sie müssen durch Ausprobieren das Beste für Ihren eigenen Fall finden. Dafür gibt es keine Regel.
Manchmal verwenden die Spiele ihre eigenen LOD-Methoden, Subway Surfer for Instant, und zeigen ein kleines Rechteck ohne Textur, um ein Gebäude in der Ferne zu zeigen. Sie haben nicht über Ihr Projektionssystem gesprochen, was sehr wichtig ist. Sie haben auch nicht darüber gesprochen, welche Art von Spiel Sie erstellen.
Angenommen, Sie implementieren ein vollständiges 3D-Spiel mit openGl und möchten einige Mesh-Dateien filtern, bevor Sie sie auf Grafikhardware übertragen. Ich bin sicher, dies wird Ihnen dabei helfen, die Bindungs- / Entbindungsoperationen mit Pufferobjekten und Vertex-Arrays (VBO, VAO) zu reduzieren Umgang mit OpenGl.
In den meisten Fällen ist es nicht erforderlich, einen Generalisierungsalgorithmus zu implementieren, und das Filtern von Objekten funktioniert einfach und bringt Sie zu der Effizienz (Aktualisierungsrate), die Sie benötigen, es hängt jedoch von Fall zu Fall völlig davon ab. Obwohl es ein einfacher Algorithmus ist, bei dem nur die kleinen Seiten eines Polygons entfernt werden, müssen Sie einen Schwellenwert definieren, der das Produkt der Größe und einer konstanten Zahl ist, damit größere Seiten unter einem viel weiter entfernten Gesichtspunkt gefiltert werden.
Wenn Sie die Ebenenverwaltung vergessen und nur den Euler-Generalisierungsalgorithmus implementieren, erhalten Sie eine sehr übersichtliche und kontinuierliche Methode, bei der Sie die einzelnen Seiten und Linien nur anhand eines vordefinierten Schwellenwerts überprüfen und sie nur dann anzeigen, wenn sie groß genug sind, um auf dem Bildschirm unterschieden zu werden.
PS: Die Vergrößerung ist eine Gleitkommazahl> 0, die 1 / Skala entspricht, und die Skala ist normalerweise <1, da eine 1: 1-Skala bedeutet, dass Sie reale Längen in Ihrem Spiel haben.
quelle
Iman hat bereits eine vollständige Antwort vorbereitet, aber ich möchte etwas hinzufügen
LOD kann auf zwei verschiedene Arten durchgeführt werden
Zum Beispiel ist Mipmaping ein gutes, schnelles, aber schweres Mipmaping, das zur zweiten Gruppe oben gehört
Hier finden Sie eine gute Erklärung zu Mipmaping und Implementierungscode mit OpenGl.
quelle