Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Mesh-Level of Detail (LOD)

Level of Detail (LOD) ist neben Occlusion Culling eine der wichtigsten Methoden zur Optimierung der Render-Performance in einem 3D-Projekt.

Auf dieser Seite erfahren Sie:

  • Wie Mesh-LOD die Performance Ihres 3D-Projekts verbessern kann.

  • Wie man Mesh-LOD in Godot einrichtet.

  • Wie Sie die Effektivität von Mesh LOD in Ihrem Projekt messen können (und welche Alternativen Sie prüfen können, wenn es Ihre Erwartungen nicht erfüllt).

Siehe auch

Wie Mesh-LOD in Aktion funktioniert, können Sie mit dem Occlusion Culling and Mesh LOD Demoprojekt sehen.

Einführung

In der Vergangenheit wurden in 3D-Spielen Meshes mit geringerer Geometriedichte manuell erstellt und dann die Abstandsschwellen konfiguriert, bei denen diese Meshes mit geringerer Detailtiefe gezeichnet werden sollten. Dieser Ansatz wird auch heute noch verwendet, wenn eine bessere Kontrolle erforderlich ist.

Bei Projekten mit einer großen Anzahl detaillierter 3D-Assets kann das manuelle Einrichten von LOD jedoch sehr zeitaufwändig sein. Daher wird die automatische Mesh-Dezimierung und LOD-Konfiguration immer beliebter.

Godot bietet eine Möglichkeit, beim Import automatisch weniger detaillierte Meshes für die LOD-Nutzung zu erzeugen und diese LOD-Meshes dann bei Bedarf automatisch zu verwenden. Dies ist für den Benutzer völlig transparent. Die Bibliothek meshoptimizer wird für die LOD-Mesh-Generierung hinter den Kulissen verwendet.

Mesh-LOD funktioniert mit jedem Node, der 3D Meshes zeichnet. Dazu gehören MeshInstance3D, MultiMeshInstance3D, GPUParticles3D und CPUParticles3D.

Visueller Vergleich

Hier ist ein Beispiel für LOD-Meshes, die beim Import erzeugt werden. Weniger detaillierte Meshes werden verwendet, wenn die Kamera weit vom Objekt entfernt ist:

Von der detailliertesten (links) zur am wenigsten detaillierten (rechts), schattierte Ansicht

Von der detailliertesten (links) zur am wenigsten detaillierten (rechts), schattierte Ansicht

Hier ist das gleiche Bild mit Drahtgitter-Rendering, um die Dezimierung besser zu erkennen:

Vom detailliertesten (links) zum am wenigsten detaillierten (rechts), Drahtgitteransicht

Vom detailliertesten (links) zum am wenigsten detaillierten (rechts), Drahtgitteransicht

Siehe auch

Wenn Sie den Detaillierungsgrad bei von Künstlern erstellten Meshes manuell konfigurieren müssen, verwenden Sie Reichweitenbasierte Sichtbarkeit (HLOD) anstelle des automatischen Mesh-LOD.

Erzeugen von Mesh-LOD

Standardmäßig wird das Mesh-LOD automatisch für importierte 3D-Szenen (glTF, .blend, Collada, FBX) erzeugt. Sobald LOD-Meshes generiert sind, werden sie automatisch beim Rendern der Szene verwendet. Sie müssen nichts manuell konfigurieren.

Die Erzeugung von Mesh-LODs erfolgt jedoch nicht automatisch für importierte 3D-Meshes (OBJ). Das liegt daran, dass OBJ-Dateien standardmäßig nicht als vollständige 3D-Szenen importiert werden, sondern nur als einzelne Mesh-Ressourcen, die in einen MeshInstance3D-Node (oder GPUParticles3D, CPUParticles3D, ...) geladen werden.

Um für eine OBJ-Datei ein Mesh-LOD zu generieren, wählen Sie sie im Dateisystem-Dock aus, gehen Sie zum Import-Dock, ändern Sie die Option Importieren als in Szene und klicken Sie dann auf Neuimport:

Ändern des Importtyps für eine OBJ-Datei im Importdock

Ändern des Importtyps für eine OBJ-Datei im Importdock

Dies erfordert einen Neustart des Editors, nachdem Sie auf Neuimport geklickt haben.

Bemerkung

Der Prozess der Mesh-LOD-Generierung ist nicht perfekt und kann gelegentlich zu Rendering-Problemen führen (insbesondere bei Skinned Meshes). Die Mesh-LOD-Generierung kann bei komplexen Meshes auch eine Weile dauern.

Wenn Mesh-LOD ein bestimmtes Mesh fehlerhaft aussehen lässt, können Sie die LOD-Generierung für dieses Mesh im Import-Dock deaktivieren. Dadurch wird auch der Import von Ressourcen beschleunigt. Dies kann global in den Importoptionen der 3D-Szene oder auf Mesh-Basis über den Dialog Erweiterte Importeinstellungen erfolgen.

Siehe Importieren von 3D-Szenen für weitere Informationen.

Vergleich von Mesh LOD-Darstellung und Performance

Um Mesh LOD im Editor zu Vergleichszwecken zu deaktivieren, verwenden Sie den erweiterten Debug-Zeichenmodus Mesh-LOD deaktivieren. Dies kann über das Menü in der oberen linken Ecke des 3D-Ansichtsfensters erfolgen (je nach Kameramodus mit Perspektive oder Orthogonal bezeichnet):

Deaktivieren von Mesh-LOD im linken oberen Menü des 3D-Viewports

Deaktivieren von Mesh-LOD im linken oberen Menü des 3D-Viewports

Aktivieren Sie Frame-Zeit anzeigen im gleichen Menü, um die FPS in der oberen rechten Ecke anzuzeigen. Aktivieren Sie außerdem Informationen anzeigen im selben Menü, um die Anzahl der gerenderten Primitive (Vertices+ Indizes) in der unteren rechten Ecke anzuzeigen.

Wenn Mesh-LOD in Ihrer Szene korrekt funktioniert und Ihre Kamera weit genug vom Mesh entfernt ist, sollten Sie feststellen, dass die Anzahl der gezeichneten Primitive sinkt und die FPS steigen, wenn Mesh-LOD aktiviert bleibt (es sei denn, Sie haben einen CPU-Bottleneck).

Um die Mesh-LOD-Dezimierung in Aktion zu sehen, ändern Sie den Debug-Zeichenmodus im oben angegebenen Menü auf Drahtgitter anzeigen und passen Sie dann die Projekteinstellung Rendern > Mesh-LOD > LOD-Änderung > Schwellenpixel an.

Konfigurieren der Performance und Qualität von Mesh-LOD

Sie können einstellen, wie aggressiv Mesh-LOD-Übergänge im Root-Viewport sein sollen, indem Sie die Projekteinstellung Rendern > Mesh-LOD > LOD-Änderung > Schwellen-Pixel ändern. Um diesen Wert zur Laufzeit zu ändern, setzen Sie mesh_lod_threshold im Root-Viewport wie folgt:

get_tree().root.mesh_lod_threshold = 4.0

Jedes Ansichtsfenster hat seine eigene mesh_lod_threshold-Property, die unabhängig von anderen Viewports eingestellt werden kann.

Der Default-Mesh-LOD-Schwellenwert von 1 Pixel ist so eingestellt, dass er wahrnehmbar verlustfrei ist; er bietet einen erheblichen Performance-Gewinn bei einem nicht wahrnehmbaren Qualitätsverlust. Höhere Werte führen dazu, dass die LOD-Übergänge früher stattfinden, wenn sich die Kamera entfernt, was zu höherer Performance, aber geringerer Qualität führt.

Wenn Sie objektspezifische Anpassungen am Mesh-LOD vornehmen müssen, können Sie einstellen, wie aggressiv die LOD-Übergänge sein sollen, indem Sie die LOD-Bias-Property auf jedem Node, der von GeometryInstance3D erbt, anpassen. Werte über 1.0 bewirken, dass LOD-Übergänge später als üblich stattfinden (was zu höherer Qualität, aber geringerer Performance führt). Werte unter 1.0 bewirken, dass LOD-Übergänge früher als üblich stattfinden (was zu geringerer Qualität, aber höherer Performance führt).

Darüber hinaus verfügen ReflectionProbe-Nodes über eine eigene Mesh-LOD-Schwellenwert-Property, die angepasst werden kann, um die Rendering-Performance zu verbessern, wenn die ReflectionProbe aktualisiert wird. Dies ist besonders wichtig für ReflectionProbes, die den Aktualisierungsmodus Immer verwenden.

Bemerkung

Beim Rendern der Szene verwendet die Mesh-LOD-Auswahl eine Screen-Space-Metrik. Das bedeutet, dass automatisch das Sichtfeld der Kamera und die Auflösung des Viewports berücksichtigt werden. Ein höheres Kamera-Sichtfeld und eine geringere Viewport-Auflösung machen die LOD-Auswahl aggressiver; die Engine zeigt stark dezimierte Modelle früher an, wenn sich die Kamera entfernt.

Im Gegensatz zu Reichweitenbasierte Sichtbarkeit (HLOD) müssen Sie also nichts Spezielles in Ihrem Projekt tun, um die Sichtweite der Kamera und die Auflösung des Ansichtsfensters zu berücksichtigen.

Verwendung von Mesh-LOD mit MultiMesh und Partikeln

Für die LOD-Auswahl wird der Punkt der AABB des am dichtesten an der Kamera befindlichen Nodes als Basis verwendet. Dies gilt für jede Art von Mesh LOD (auch für einzelne MeshInstance3D), aber dies hat einige Auswirkungen auf Nodes, die mehrere Meshes gleichzeitig anzeigen, wie MultiMeshInstance3D, GPUParticles3D und GPUParticles3D. Vor allem bedeutet dies, dass alle Instanzen zu einem bestimmten Zeitpunkt mit demselben LOD-Level gezeichnet werden.

Wenn Sie eine falsche LOD-Auswahl mit GPUParticles3D bemerken, stellen Sie sicher, dass die AABB-Sichtbarkeit des Nodes konfiguriert ist, indem Sie den GPUParticles3D-Node auswählen und GPUParticles3D > AABB generieren oben im 3D-Ansichtsfenster verwenden.

Wenn Sie Instanzen in einem MultiMesh haben, die weit voneinander entfernt sind, sollten sie in einem separaten MultiMeshInstance3D-Node platziert werden. Dadurch wird auch die Performance des Renderings verbessert, da Frustum und Occlusion Culling einzelne Nodes ausblenden können (während sie einzelne Instanzen in einem MultiMesh nicht ausblenden können).