UE5-Nanite-Technologie in WebGPU
(github.com/Scthe)Nanite WebGPU
Zusammenfassung
- Nanite WebGPU ist ein Projekt, das Nanite mithilfe von WebGPU im Webbrowser implementiert.
- Es ist nur in Chrome nutzbar.
- Es umfasst eine Meshlet-LOD-Hierarchie, einen Software-Rasterizer, Billboard-Impostors und mehr.
- Es unterstützt Frustum- und Occlusion-Culling.
- Es unterstützt Texturen und Vertex-Normalen.
- Mit Deno funktioniert es auch offline.
Funktionen
-
Meshlet-LOD-Hierarchie
- Im Browser werden Meshes mit WebAssembly vorverarbeitet.
- Es bietet auch eine Funktion zum Exportieren von Dateien.
-
Software-Rasterizer
- WebGPU unterstützt kein
atomic<u64>. - Tiefe (
u16) und oktaedrisch kodierte Normalen (2 * u8) werden in 32 Bit komprimiert.
- WebGPU unterstützt kein
-
Billboard-Impostors
- Je nach Kameraposition werden 12 Bilder gemischt und angezeigt.
- Ansichten von oben und unten werden nicht verarbeitet.
-
Culling
- Pro Instanz: Frustum- und Occlusion-Culling.
- Pro Meshlet: Frustum- und Occlusion-Culling.
- Pro Dreieck: Hardware-Backface-Culling und z-Buffer.
-
Es kann zwischen GPU-basiertem Rendering und einer CPU-Implementierung umgeschaltet werden.
-
Es unterstützt gleichzeitig Texturmodelle und verschiedene Objekte.
-
Parameter können zur Laufzeit geändert werden.
-
Es liefert Statistiken: Speicher, Geometrie, Anzahl der Meshlets, Anzahl der Dreiecke usw.
-
Es unterstützt ein benutzerdefiniertes Dateiformat.
-
Es unterstützt Quantisierung von Vertex-Positionen und oktaedrisch kodierte Normalen.
-
Es verarbeitet Änderungen der Fenstergröße.
-
Mit Deno funktioniert es auch offline.
-
WebGPU- und WGSL-Code kann in das Projekt kopiert werden.
Ziele
- Einfachheit: Beginn mit OBJ-Dateien, wobei alles in der App verarbeitet wird.
- Experimente: Verschiedene Einstellungen können geändert werden, um die Performance zu testen.
Demo-Szenen
- Jinx: 120*120 Instanzen, 640m Dreiecke.
- Lucy und Drache: 70*70 Instanzen, 1.7b Dreiecke.
- Lucy: 110*110 Instanzen, 1.2b Dreiecke.
- Drache: 70*70 Instanzen, 1.2b Dreiecke.
- Kaninchen: 500*500 Instanzen, 1.2b Dreiecke.
- Impostor-Vorschau: Vergrößerte Impostor-Texturgröße.
Verwendung
- Mit den Tasten [W, S, A, D] bewegen, mit [Z, SPACEBAR] nach oben und unten.
- Durch Umschalten der Culling-Optionen lassen sich Bugs beheben.
- Mit der Schaltfläche Profile kann die Performance gemessen werden.
FAQ
-
Wichtigste Unterschiede zu Nanite in UE5
- Die Fehler-Metrik für die Vereinfachung ist simpel.
- Die Meshlet-Vereinfachung ist simpel.
- Kein zweistufiges Occlusion-Culling.
- Keine Arbeits-Queue in den Shadern.
- Kein Entfernen und Streaming ungenutzter LODs aus dem VRAM.
- Kein Visibility Buffer.
- Keine integrierten Schatten/Multiviews.
- Es kann nicht viele verschiedene Objekte verarbeiten.
- Kein GPU-Profiler.
-
Was Milliarden von Dreiecken bedeuten
- Dichte Meshes können sich negativ auf die Performance auswirken.
- Viele Instanzen verbrauchen viel VRAM.
- Die Anordnung der Szene beeinflusst die Performance.
-
Überraschende Aspekte von Nanite
- Das Ziel des DAG ist nicht, für weit entfernte Objekte wenige Dreiecke zu verwenden.
- Für Culling und Meshlet-Arbeit wird mehr Zeit aufgewendet als für Nanite selbst.
- Die Meshlet-LOD-Hierarchie funktioniert leicht.
- Wenn sich ein Mesh nicht sauber vereinfachen lässt, fällt die Performance ab.
-
Mesh-Vereinfachung
- Während des Vereinfachungsprozesses können viele Probleme auftreten.
- UE5 verwendet eigenen Code zur Mesh-Vereinfachung.
-
Fehler-Metrik
- Die Auswahl eines geeigneten Meshlets ist der Kern von Nanite.
-
Sollte man eine Nanite-Implementierung selbst schreiben?
- Die Verwendung von UE5 ist der einfachste Weg.
- Zu Lernzwecken lohnt sich eine eigene Implementierung.
-
Wert von Meshlet-Backface-Cone-Culling
- Bei dichten Meshes ist es effektiv.
- Es kann sich mit Occlusion-Culling überschneiden.
- Durch WebAssembly-Aufrufe kann es zu Performance-Einbußen kommen.
Zusammenfassung von GN⁺
- Nanite WebGPU ist ein interessantes Projekt, das Nanite im Webbrowser implementiert.
- Es optimiert die Performance durch verschiedene Culling-Techniken und einen Software-Rasterizer.
- Im Vergleich zu UE5 gibt es Unterschiede bei Vereinfachung und Fehler-Metrik.
- Für Lernzwecke lohnt sich eine eigene Implementierung, für reale Projekte könnte UE5 jedoch die bessere Wahl sein.
- Ein ähnliches Projekt mit vergleichbaren Funktionen ist Nanite in Unreal Engine 5.
1 Kommentare
Hacker-News-Kommentar
Die Third-Party-Implementierung von Nanite ist interessant
Auch Bevy hat mit Virtual Geometry eine Umsetzung der Nanite-Ideen
Es ist keine gute Idee, die Kompatibilität anhand des User-Agent-Strings zu bestimmen
Auf dem iPhone 12 Pro Max funktioniert WebGPU nicht
Um den Mangel an 64-Bit-Atomics in WebGPU zu umgehen, waren Kompromisse nötig
Name und Beschreibung sind verwirrend und könnten eine Markenverletzung darstellen
Vergleich der LOD-Systeme anderer Engines
Ich habe im three.js-Forum eine interessante Diskussion über die Implementierung virtueller Geometrie gelesen
Frage zur Behauptung, ein Software-Rasterizer sei schneller als ein Hardware-Rasterizer
Beim Ausführen der jinx-Demo auf einem M2 Max tritt ein WebGPU-Fehler auf