Nanite ist das virtualisierte Geometriesystem der Unreal Engine 5, das ein neues internes Mesh-Format und eine neue Rendering-Technologie verwendet, um pixelgenaue Details und eine hohe Objektanzahl zu rendern. Es arbeitet auf intelligente Weise nur an den Details, die wahrgenommen werden können und nicht mehr. Das Datenformat von Nanite ist ebenfalls stark komprimiert und unterstützt feinkörniges Streaming mit automatischer Detailstufe.
Vorteile von Nanite
Mehrere Größenordnungen höhere Geometriekomplexität, mehr Dreiecke und Objekte als bisher in Echtzeit möglich
Frame-Budgets werden nicht mehr durch Polycounts, Draw Calls und Mesh-Speicherverbrauch eingeschränkt
Jetzt ist es möglich, Quellmaterial in Filmqualität direkt zu importieren, z. B. ZBrush-Skulpturen und Photogrammetrie-Scans
Verwende High-Poly-Detaillierung, anstatt Details in Normal-Map-Texturen zu baken
Der Detaillierungsgrad (Level of Detail, LOD) wird automatisch gehandhabt und muss nicht mehr manuell für die LODs der einzelnen Meshs eingestellt werden
Qualitätsverluste sind selten oder gar nicht vorhanden, insbesondere bei LOD-Übergängen
Auch wenn die Vorteile ein echter Game-Changer sein können, gibt es auch weiterhin praktische Grenzen, die bestehen bleiben. Zum Beispiel sollten die Anzahl der Instanzen, die Dreiecke pro Mesh, die Materialkomplexität, die Ausgabeauflösung und die Performance für jede Kombination aus Inhalt und Hardware sorgfältig bemessen werden. Nanite wird seine Fähigkeiten weiter ausbauen und die Performance in zukünftigen Versionen der Unreal Engine verbessern.
Unterschiede zwischen einem Nanite-Mesh und einem statischen Mesh
Ein Nanite-Mesh ist ein statisches Mesh, in dem Nanite aktiviert ist. Ein Nanite-Mesh ist im Kern immer noch ein Dreieck-Mesh mit einem hohen Detaillierungsgrad und angewandter Komprimierung der Daten. Darüber hinaus verwendet Nanite ein völlig neues System, um dieses Datenformat auf äußerst effiziente Weise darzustellen.
Damit ein statisches Mesh die Vorteile von Nanite nutzen kann, muss es nur mit einem Flag aktiviert werden. Das Erstellen von Inhalten für Nanite unterscheidet sich nicht von herkömmlichen Meshs, mit dem Unterschied, dass Nanite viel mehr Dreiecke und Instanzen verarbeiten kann als herkömmlich gerenderte Geometrie. Bewege die Kamera nahe genug heran, und Nanite zeichnet die ursprünglich importierten Quelldreiecke.
Nanite-Meshs unterstützen mehrere UVs und Scheitelpunkte. Materialien werden Abschnitten des Meshs zugewiesen, so dass diese Materialien verschiedene Schattierungsmodelle und dynamische Effekte verwenden können, die in den Shadern ausgeführt werden können. Die Materialzuweisung kann wie bei jedem anderen Statischen Mesh dynamisch ausgetauscht werden, und Nanite benötigt keinen Prozess zum Baken der Materialien.
Virtual Textures sind für die Verwendung mit Nanite nicht erforderlich, werden aber dringend empfohlen. Virtuelle Texturen sind ein orthogonales Feature der Unreal Engine mit ähnlichen Zielen für Texturdaten, die Nanite mit Mesh-Daten erreicht.
Die Arbeit mit Nanite sollte den Arbeitsabläufen für statische Meshs ähnlich sein, aber es gibt viele Dinge, die noch nicht unterstützt werden. Mehr dazu findest du im Abschnitt Unterstützte Funktionen auf dieser Seite.
Wie funktioniert Nanite?
Nanite fügt sich so nahtlos wie möglich in bestehende Workflows der Engine ein und verwendet dabei einen neuartigen Ansatz zum Speichern und Rendern von Mesh-Daten.
Während des Imports werden die Meshs analysiert und in hierarchische Cluster von Dreiecksgruppen unterteilt.
Während des Renderings werden die Cluster nebenbei in verschiedenen Detaillierungsgraden ausgetauscht, je nach Kameraperspektive, und verbinden sich perfekt und ohne Risse mit benachbarten Clustern innerhalb desselben Objekts. Die Daten werden auf Abruf gestreamt, so dass nur die sichtbaren Details im Speicher abgelegt werden müssen. Nanite läuft in einem eigenen Rendering-Durchgang, der die traditionellen Draw Calls komplett umgeht. Visualisierungsmodi können zum Untersuchen der Nanite-Pipeline verwendet werden.
Da Nanite auf die Fähigkeit angewiesen ist, Mesh-Daten auf Abruf schnell von der Festplatte zu streamen. Solid State Drives (oder SSDs) werden für die Speicherung zur Laufzeit empfohlen.
Für welche Arten von Meshs sollte Nanite verwendet werden?
Nanite sollte generell aktiviert werden, wo immer es möglich ist. Jedes statische Mesh, das diese Funktion aktiviert hat, wird in der Regel schneller gerendert und benötigt weniger Platz im Arbeitsspeicher und auf der Festplatte.
Genauer gesagt ist ein Mesh dann ein besonders guter Kandidat für Nanite, wenn es:
Viele Dreiecke enthält, oder Dreiecke hat, die auf dem Bildschirm sehr klein sind
Hat viele Instanzen in der Szene
In hohem Maße andere Nanite-Geometrie verdeckt
Schattenwurf mit virtuellen Shadow-Maps
Ein Beispiel für eine Ausnahme von diesen Regeln ist eine Himmelskugel: Ihre Dreiecke werden auf dem Bildschirm groß sein, sie verdeckt nichts und es gibt nur eine in der Szene. In der Regel sind diese Ausnahmen selten und die Performance-Einbußen bei der Verwendung von Nanite sind relativ gering. Daher wird empfohlen, sich keine allzu großen Gedanken darüber zu machen, wo Nanite nicht aktiviert werden sollte, wenn Nanite den Anwendungsfall unterstützt.
Einige Anwendungsfälle werden von Nanite derzeit nicht unterstützt. Mehr dazu findest du im Abschnitt Unterstützte Funktionen auf dieser Seite.
Nanite-Unterstützung für Meshs aktivieren
Nanite kann für unterstützte Geometrie auf folgende Weise aktiviert werden:
Die Umwandlung von Geometrie in Nanite erfordert eine gewisse Bearbeitungszeit für jedes Mesh. Bei großen Projekten ist die Verwendung eines gemeinsamen abgeleiteten Daten-Caches (ADC) besonders hilfreich, wenn es viele Nanite Assets gibt. Weitere Informationen findest du in der Dokumentation Shared DDC.
Importieren eines Mesh
Wenn du ein Mesh importierst, das für uns mit Nanite bestimmt ist, aktiviere das Kästchen für Nanite erstellen.
Es wird empfohlen, die Eigenschaft Generate Lightmap UVs zu deaktivieren, wenn du keine vorberechnete Beleuchtung mit Lightmass verwendest.
Wenn diese Option aktiviert ist, verlängert die hochdetaillierte Geometrie den Zeitaufwand beim Importieren und Erstellen von Statisches Mesh-Daten erheblich. Die Eigenschaft fügt außerdem einen zusätzlichen UV-Kanal hinzu, der bei sehr dichten Meshs eine beträchtliche Menge an Daten enthält. Wenn Ihr Projekt keine gebakte Beleuchtung benötigt, entfallen die Kosten.
Nanite für Assets aktivieren
Wenn dein Projekt bereits mit Inhalten gefüllt ist, für die du Nanite aktivieren möchtest, hast du zwei Möglichkeiten: Du kannst die Assets mit dem Inhaltsbrowser stapelweise aktivieren oder einzelne Assets über ihre eigenen Editoren aktivieren.
Nanite für Meshs stapelweise aktivieren
Verwende für Batchs von Statisches oder Skelett-Mesh-Assets, für die du Nanite einschalten möchtest, den Inhaltsbrowser, um sie alle auszuwählen. Klicke mit der rechten Maustaste und wähle im Kontextmenü Nanite > Enable.
Nanite für einzelne Meshs aktivieren
Öffne den Editor eines beliebigen Meshs, das Nanite unterstützt, z. B. statische Meshs und Geometry Collections (Chaos-Physik-gesteuerte Fraktur-Meshs), und aktiviere Nanite über das Details-Panel.
Suche im Statisches-Mesh-Editor nach den Nanite-Einstellungen und aktiviere das Kontrollkästchen Nanite-Unterstützung aktivieren.
Suche im Editor für Geometriesammlungen den Abschnitt Nanite und aktiviere das Kästchen Nanite aktivieren.
Unterstützte Eigenschaften von Nanite
In diesem Abschnitt wird beschrieben, wie du am besten mit Nanite in einem Unreal-Engine-Projekt arbeitest, und es wird erläutert, was unterstützt wird und was nicht und welche Einschränkungen möglich sind.
Geometrie
Nanite kann auf statischen Meshs und Geometry Collections aktiviert werden.
Ein Nanite-aktiviertes Mesh kann mit den folgenden Komponententypen verwendet werden:
Statisches Mesh
Skelett-Mesh
Instanziertes statisches Mesh
Spline-Mesh
Hierarchisch instanziertes statisches Mesh
Geometriesammlung
Vegetations-Painter
Landschaftsgras
Nanite unterstützt die Deformation von starren Meshs nur begrenzt. Nanite unterstützt die dynamische Verschiebung, Drehung und ungleichmäßige Skalierung dieser Meshs, unabhängig davon, ob es sich um dynamische oder Statisches Meshs handelt. Das bedeutet, dass jede beliebige Position eines Nanite-Mesh auf eine Art und Weise verschoben werden kann, die mehr als in einer einzigen 4x3-Matrix-Multiplikation ausgedrückt werden kann, die gleichmäßig auf das gesamte Mesh angewendet wird.
Die Verformung wird begrenzt durch:
(Beta) Welt-Positionsversatz (WPO) in Materialien.
Nanite-Meshs, die WPO-Verschiebung verwenden, werden in kleinere Cluster aufgeteilt, wobei jeder dieser Cluster seine eigenen Grenzen hat und auf der GPU individuell ausgeblendet wird. Klammert den WPO, um zu verwalten, wie viele Cluster des Nanite-Mesh ausgeblendet werden.
Vegetation mit WPO ist weniger problematisch, da das Laub voller Löcher ist und sich nicht wirklich verdecken kann.
Verformung wird nicht unterstützt mit:
Morph-Ziele
Die maximale Anzahl der Instanzen, die in der Szene vorhanden sein können, ist auf 16 Millionen Instanzen festgelegt. Das schließt alle Instanzen ein, die gestreamt werden, nicht nur die, die für die Verwendung mit Nanite aktiviert wurden. Nur gestreamte Instanzen werden in die Gesamtzahl eingerechnet.
Tangenten pro Scheitelpunkt werden nicht im Statischen Mesh gespeichert, wenn es für Nanite aktiviert ist. Stattdessen wird der Tangentenraum implizit im Pixelshader abgeleitet. Tangentendaten werden nicht gespeichert, um die Datengröße zu reduzieren. Dieser Unterschied im Tangentenraum könnte bei diesem Ansatz zu Unterbrechungen an den Kanten führen. Dieses Problem hat sich jedoch nicht als signifikant erwiesen, und es ist geplant, Scheitelpunkttangenten in einer zukünftigen Version zu unterstützen.
Materialien
Nanite unterstützt Materialien, deren Überblendmodus auf Undurchsichtig und Maskiert festgelegt ist. Wenn ein nicht unterstützter Materialtyp erkannt wird, wird dem Nanite-aktivierten Mesh ein Standardmaterial zugewiesen und im Output-Log wird eine Warnung mit zusätzlichen Informationen eingetragen.
Anmerkungen zu zusätzlichen Materialmerkmalen:
Nanite-aktivierte Meshs können Aufkleber erhalten, die auf ihre Oberfläche projiziert werden, aber sie unterstützen keine Mesh Decals, für die Materialien einen Translucent-Überblendmodus verwenden müssen.
Das Kontrollkästchen Wireframe wird nicht unterstützt.
Der Scheitelpunkt-Interpolator-Knoten und Benutzerdefinierte UVs werden unterstützt, aber dreimal pro Pixel ausgewertet.
Benutzerdefinierte Ausdrucksknoten oder Knoten, die diese verwenden (z. B. die
ParallaxOcclusionMapping-Materialfunktion) können mit Nanite zu Artefakten führen. Dies wird erwartet, da Nanite noch keine analytische Ableitung hat.
Rendering
Die folgenden Rendering-Funktionen werden derzeit nicht unterstützt:
Ansichtsspezifische Filterung von Objekten mit:
Minimaler Bildschirmradius
Entfernungsausblendung
Vorwärtsrendern
Stereo-Rendering für Virtuelle Realität
Splitscreen
Multisampling Anti-Aliasing (MSAA)
Beleuchtungskanäle
Raytracing gegen Nanite-Meshs
Das Fallback-Mesh wird standardmäßig für Nanite-fähige Meshs verwendet. Verringere den Parameter Fallback Relativer Fehler im Statisches-Mesh-Editor, um mehr Dreiecke des Quell-Meshs zu verwenden.
(Experimentell) Die anfängliche Unterstützung für natives Raytracing von Nanite-Meshs wird mit der Konsolenvariablen
r.RayTracing.Nanite.Mode 1aktiviert. So bleiben alle Details erhalten und es wird deutlich weniger GPU-Speicher benötigt als bei fehlerfreien Fallback-Meshs.
Einige Visualisierungsansichtsmodi unterstützen noch nicht die Anzeige von Nanite-Meshs
Bei einigen Visualisierungsmodi im Statischen-Mesh-Editor ist Vorsicht geboten, wenn du sehr detaillierte Geometrie betrachtest. Die Anzeige von Normalen und UV kann zu Problemen mit der Performance des Editors führen.
Unterstützte Plattformen
Nanite wird derzeit auf PlayStation 5, Xbox Series S|X und PCs mit Grafikkarten unterstützt, die diesen Spezifikationen entsprechen und die neuesten Treiber mit DirectX 12 mit Shader Model 6 (SM6) verwenden:
NVIDIA: Karten der Maxwell-Generation oder neuer
AMD: Karten der GCN-Generation oder neuer
Alle neueren Versionen von Windows 10 (neuer als Version 1909.1350) und Windows 11 mit Unterstützung für DirectX 12 Agility SDK werden unterstützt.
Windows 10 Version 1909 – Die Revisionsnummer sollte größer oder gleich .1350 sein.
Windows 10 Version 2004 und 20H2 – Die Revisionsnummer sollte größer oder gleich .789 sein.
DirectX 12 mit Shader Model 6.6 Atomics oder Vulkan (VK_KHR_shader_atomic_int64).
Apple Silicon M2 oder neuer.
Linux mit einer NVIDIA GeForce 2080 oder neuer.
Neueste Grafikkarten-Treiber
PlayStation 4 und Xbox One unterstützen Nanite ebenfalls, aber die Unterstützung auf diesen Plattformen gilt derzeit als experimentell. Es ist zu erwarten, dass die Performance von Nanite auf diesen Plattformen mit sehr anspruchsvollen Inhalten nicht den Anforderungen eines auslieferbaren Spiels entspricht.
Weitere Informationen zu den von Epic Games empfohlenen Hardware- und Software-Spezifikationen findest du unter Hardware- und Softwarespezifikationen.
Nanite Fallback-Mesh und Präzisionseinstellungen
Statisches und Skelett-Meshs enthalten zusätzliche Eigenschaften, die die Genauigkeit der Nanite-Darstellung und des aus dem Voll-Detail-Mesh generierten Fallback-Mesh steuern.
Diese Einstellungen befinden sich im Details-Panel des Mesh-Editors unter der Sektion Nanite-Einstellungen.
Die Nanite Einstellungen umfassen die folgenden Eigenschaften:
| Eigenschaft | Beschreibung |
|---|---|
Nanite-Unterstützung aktivieren | Aktiviert dieses Mesh zur Verwendung mit Nanite und zur Erzeugung eines Fallback-Meshs in Situationen, in denen Nanite nicht verwendet werden kann. |
Gebiet erhalten | Aktiviert Nanite-Meshs, die durch die Vereinfachung an Oberfläche verlieren würden, um die verlorene Fläche auf die verbleibenden Dreiecke umzuverteilen, indem die offenen Begrenzungskanten ausgedehnt werden. Dies ist vor allem für Vegetation nützlich, da Blätter durch die Vereinfachung zu unzusammenhängenden Dreiecken und Quads werden. Diese Einstellung bewirkt, dass jedes Blatt vergrößert wird. Bei Geometriebändern, wie z. B. Grashalmen, hat es den Effekt, dass sie dicker werden. Diese Einstellung sollte für alle Vegetations-Meshs aktiviert werden und für nichts anderes. |
Explizite Tangenten | Wenn diese Option True ist, werden die ursprünglichen Modelltangenten gespeichert und pro Asset verwendet. Diese Einstellung bedeutet, dass Tangenten explizit auf der Festplatte gespeichert werden, anstatt implizit zur Laufzeit abgeleitet zu werden. Die Einstellung „Tangent Precision“ ist jetzt für zusätzliche Kontrolle von Scheitelpunkt-Tangenten verfügbar. Die Aktivierung der Einstellung erhöht den Speicherplatz um etwa 10 %, kann aber empfehlenswert sein, wenn implizite Tangenten nicht präzise genug sind. |
Lerp UVs | Gibt an, ob UVs beim Vereinfachen interpoliert werden. Dies sollte wann immer möglich aktiviert werden. Für reale UV-Koordinaten erlaubt dies die Berechnung der optimalen UVs mit dem geringsten Fehler für neue Scheitelpunkte bei der Vereinfachung, vorausgesetzt, die UVs werden als normale Textur-Koordinaten verwendet und interpolieren über die Fläche der Dreiecke. Dies sollte deaktiviert werden, wenn in den UVs gespeicherte Daten zum Interpolieren nicht gültig sind. Beispielsweise, wenn Indizes in UVs gespeichert werden. Die lineare Interpolation eines Index macht keinen Sinn und würde den Shader abbrechen, wenn er versucht, sie zu verwenden. Wenn diese Option deaktiviert ist, werden Fehler durch UVs nicht mehr berücksichtigt, wenn Nanite den zu rendernden LOD auswählt, da Fehler aufgrund willkürlicher Scheitelpunktattribute, die nicht interpolierbar sind, nicht allgemein begründet werden können. |
Positionsgenauigkeit | Wählt die Genauigkeit, die dieses Mesh beim Generieren der Scheitelpunktpositionen eines Nanite-Mesh verwenden soll. Auto bestimmt die entsprechende Genauigkeit basierend auf der Größe des Meshs. Die Präzision kann überschrieben werden, um die Präzision zu verbessern oder den Platzbedarf auf der Festplatte zu optimieren. |
Präzision von Normalen | Wählt die Genauigkeit, die dieses Mesh bei der Generierung der Scheitelpunktnormalen eines Nanite-Mesh verwenden soll. Auto bestimmt die entsprechende Genauigkeit basierend auf der Größe des Meshs. Die Präzision kann überschrieben werden, um die Präzision zu verbessern oder den Platzbedarf auf der Festplatte zu optimieren. |
Minimale Residenz (Stammgeometrie) | Legt die Größe der Arbeitsspeicherbytes fest, die dieses Mesh immer im Speicher behalten soll, und lässt den Rest per Stream einfließen. Höhere Werte benötigen mehr Speicherplatz, aber bei einigen Meshs kann dies das Auftreten von Streaming-Pop-In-Problemen verringern. |
Dreieckprozentsatz beibehalten | Der Prozentsatz der Dreiecke, die aus dem Quell-Mesh übernommen werden sollen. Verringere diesen Prozentsatz, um die Größe auf der Festplatte zu optimieren. |
Trim Relativer Fehler | Legt den maximalen relativen Fehler fest, der für das Nanite-Mesh entfernt werden darf. Alle Details im Quell-Mesh, die weniger visuelle Auswirkungen haben als dieser relative Fehlerbetrag, werden entfernt. Der relative Fehler hat keine Einheitsgröße und bezieht sich auf die Größe des Meshs. Standardmäßig speichert Nanite alle Dreiecke des Quell-Mesh. |
Fallback-Ziel | Bestimmt, welches Zielsystem bei der Generierung eines Fallback-Mesh verwendet werden soll. Auto: Erstellt automatisch ein Fallback-Mesh basierend auf den Projekt-Einstellungen. Fallback Triangle Percent: Legt den Prozentsatz der Dreiecke fest, die beim Verkleinern des Quell-Meshs für Nanite übrig bleiben. Fallback Relativer Fehler: Verringert, bis der spezifizierte Fehler relativ zur Mesh-Größe erreicht wird. Alle Details im generierten Fallback-Mesh mit einer geringeren visuellen Auswirkung als dieser relative Fehlerbetrag werden entfernt. |
Quellimport Dateiname | Der Dateipfad für den Import eines hochauflösenden Mesh, das mit Nanite verwendet werden soll. Die hochauflösende Version des Mesh wird anstelle von LOD0 von Systemen verwendet, die von einer detaillierteren Geometrie profitieren können, wie z. B. Nanite und Geometriemodellierung in Unreal Engine. |
UV-Kanal für Verschiebung | Gibt an, welcher UV-Kanal beim Sampling von Verschiebungskarten verwendet werden soll |
Verschiebungskarten | Hinzufügen und Bearbeiten von Verschiebungskarten. |
Max. Kantenlängenfaktor | Steuert den maximal zulässigen Abstand zwischen jedem Scheitelpunkt des Mesh auf dem Bildschirm. Dies kann verwendet werden, um eine übermäßige Vereinfachung von Meshs zu verhindern, die verformt werden sollen, wie bei Animationen mit Welt-Positionsversatz und Spline-Meshs. Dieser Wert sollte standardmäßig auf 0 belassen werden, sofern dies nicht explizit erforderlich ist, um Probleme durch übermäßige Vereinfachung zu beheben. |
Scheitelpunktpräzision
Nanite quantisiert die Positionen der Scheitelpunkte des Meshs, um die Speicherdichte zu maximieren und den Platzbedarf auf der Festplatte zu minimieren. Die Quantisierungsschrittgröße ist eine Zweierpotenz, die mit der Eigenschaft Positionsgenauigkeit an die Anforderungen der einzelnen Meshs angepasst werden kann. Standardmäßig wählt Auto die passende Genauigkeit auf der Grundlage der Größe des Meshs und seiner Dreiecksdichte. Du kannst sie manuell überschreiben, indem du eine Präzisionsgröße auswählst, um die Genauigkeit zu verbessern oder den Speicherplatz auf der Festplatte zu optimieren.
Die Quantisierung ist eine Form der verlustbehafteten Komprimierung. Eine verlustbehaftete Komprimierung ist besonders schwierig, wenn du mit modularen Mesh-Teilen oder anderen Meshs arbeitest, die gemeinsame Grenzen haben. Vor allem, wenn diese Grenzen perfekt ausgerichtet sein müssen, damit keine Löcher oder Risse in der Geometrie entstehen.
Um die Konsistenz sicherzustellen, erfolgt die Quantisierung in nicht normalisierten Koordinaten, die um den Ursprung des Meshs zentriert sind. Dies stellt sicher, dass die Quantisierung keine Risse verursacht, wenn das Mesh die gleiche Genauigkeitseinstellung verwendet und die Verschiebung zwischen den Mesh-Mittelpunkten ein Vielfaches dieser Genauigkeit ist.
Daten trimmen
Es kann vorkommen, dass du die Menge der von Nanite gespeicherten Daten reduzieren musst, um sie für die Größe der Festplatte zu optimieren. Nanite enthält Einstellungen, mit denen du die Detaildaten eines gespeicherten Nanite-Mesh jederzeit während der Produktion trimmen kannst. Das bedeutet, dass du die Qualität im Vorfeld sicher überschreiten und später entsprechend anpassen kannst.
Um die Detaildaten zu beschneiden, solltest du die Eigenschaften Dreieckprozentsatz beibehalten und Trim Relativer Fehler verwenden. Du kannst sie dir als Option zur Vordezimierung vorstellen, bevor sie als Nanite-Mesh gespeichert werden. Im Fall von Nanite müssen die Details nicht gleichmäßig über das Mesh verteilt sein. Dabei werden die niedrigstwertigen Daten zuerst entfernt, was mehr einer verlustbehafteten Komprimierung ähnelt.
Verwende Dreiecksprozentsatz beibehalten, um den Prozentsatz der Dreiecke festzulegen, die aus dem Quell-Mesh übernommen werden sollen.
Verwende Trimmen Relativer Fehler, um den maximalen relativen Fehler festzulegen, der beim Trimmen der Daten aus dem Quell-Mesh zulässig ist. Jedes Dreieck, das beim Entfernen einen relativen Fehler verursachen würde, der unter diesem Wert liegt, wird entfernt. Oder anders ausgedrückt: Alle Details, die weniger visuelle Auswirkungen haben als dieser relative Wert, werden entfernt. Der relative Fehler hat keine Einheitsgröße und bezieht sich auf die Größe des Meshs.
Die Standardeinstellungen für diese beiden Eigenschaften sind so, dass standardmäßig nichts getrimmt wird und Nanite alle Dreiecke des Quell-Mesh speichert.
Das Trimmen der Daten ist wichtig, um die Größe auf der Festplatte zu verkleinern (d. h. die Downloadgröße), nicht um die Performance zu verbessern. Mehr zu diesem Thema findest du im Abschnitt Datengröße weiter unten.
Fallback-Mesh
Viele Teile der Unreal Engine benötigen Zugriff auf den traditionellen Scheitelpunkt-Buffer, der von traditionell gerenderten Meshs bereitgestellt wird. Wenn du Nanite für ein Statisches Mesh aktivierst, wird eine grobe Darstellung (Fallback-Mesh genannt) des hochdetaillierten Mesh erstellt. Das Fallback-Mesh wird verwendet, wenn Nanite-Rendering nicht unterstützt wird. Es wird auch in Situationen verwendet, in denen es nicht ideal wäre, das hochdetaillierte Mesh zu verwenden, z. B. wenn komplexe Kollisionen erforderlich sind, Lightmaps für gebakte Beleuchtungen verwendet werden müssen und für Hardware-Raytracing-Reflexionen mit Lumen.
Die Eigenschaft Fallback Triangle Percent gibt an, wie viel Prozent der Dreiecke aus dem ursprünglichen Quell-Mesh für die Erstellung des Fallback-Mesh verwendet werden. Du kannst den Prozentsatz der Dreiecke, die erhalten bleiben sollen, zwischen 0 und 100 Prozent festlegen, wobei bei einem hohen Prozentsatz mehr Details des ursprünglichen Mesh erhalten bleiben.
Fallback Relativer Fehler legt die maximale Höhe des relativen Fehlers fest, der beim Entfernen von Details aus dem Quell-Mesh zulässig ist. Alle Dreiecke, die beim Entfernen einen relativen Fehler verursachen würden, der unter diesem Wert liegt, werden entfernt, wobei Details mit geringerer visueller Auswirkung zuerst entfernt werden. Der relative Fehler hat keine Einheitsgröße und bezieht sich auf die Größe des Meshs.
Wenn du zum Beispiel möchtest, dass dein Mesh überhaupt nicht dezimiert wird, würdest du einen Fallback-Dreiecksprozentsatz von 100 und einen Fallback-Relativfehler von 0 verwenden.
Im folgenden Vergleich wird das hochdetaillierte Nanite-Mesh, das aus dem Original-Mesh erstellt wurde, mit den Standardeinstellungen eines generierten Nanite-Fallback-Meshs verglichen.
Mit dem Fallback-Relativfehler gibst du an, wie viele Details aus dem ursprünglichen Mesh beibehalten werden, und mit dem Fallback-Prozentsatz legst du fest, wie viele dieser Details verwendet werden.
Im folgenden Vergleich behält das Fallback-Mesh 100 Prozent des Fallback-Dreiecksprozentsatz bei, passt aber den Fallback-Relativfehler an, um mehr Dreiecke aus dem ursprünglichen Quell-Mesh zu verwenden. Wenn du diese Werte anpasst, kannst du die Nanite-Details für Nanite-Dreiecke im Viewport als Indikator für die Änderung ihrer Werte verwenden.
Fallback-Mesh-Visualisierung
Im Statisches-Mesh-Editor kannst du zwischen dem vollständig detaillierten Nanite-Mesh und dem Nanite-Fallback-Mesh umschalten, indem du die Option Nanite-Fallback des Viewports im Dropdown-Menü Anzeigen verwendest. Alternativ kannst du auch die Tastenkombination Strg + N verwenden, um schnell zwischen den beiden Visualisierungsoptionen umzuschalten.
Benutzerdefinierte Fallback-Mesh-LODs für Nanite-aktivierte Meshs verwenden
Das Fallback-Mesh wird für Engine-Funktionen wie komplexe Kollisionen pro Poly, Raytracing, Light-Baking usw. verwendet. Es wird auch für Plattformen verwendet, die Nanite nicht unterstützen. Bei der Generierung des Fallback-Meshs verwendet ein Nanite-aktiviertes Mesh immer den LOD0-Slot des Quell-Meshs für die automatische Generierung des Fallback-Meshs. Es kann jedoch vorkommen, dass es wünschenswert ist, ein manuell festgelegtes Fallback-Mesh oder eine Reihe von traditionellen LODs zu verwenden, anstatt ein automatisch generiertes Mesh.
Dieses Maß an Kontrolle würde es Ihnen erlauben, Nanite in einem Projekt zu verwenden, aber auch direkt die Geometrie zu kontrollieren, die in Ray Tracing-Reflexionen zu sehen ist, oder auf Plattformen, die Nanite nicht unterstützen.
Gehe folgendermaßen vor, um dein eigenes Fallback-Mesh festzulegen oder eine Reihe von LODs zu verwenden:
Setze den Wert Fallback-Dreiecksprozentsatz auf 0, damit das Fallback-Mesh so klein wie möglich ist, da es bei diesem Vorgehen ignoriert wird.
Füge dem Mesh einen oder mehrere LODs hinzu, indem du dieses traditional LOD setup verwendest.
Verwende die Dropdown-Liste LOD-Import, um LOD-Level 1 aus dem Abschnitt LOD-Einstellungen zu importieren.
Setze Minimaler LOD auf 1 im Abschnitt LOD-Einstellungen. Dadurch wird das Nanite-generierte Fallback-Mesh ignoriert.
Ein Sonderfall ist die komplexe Kollision. Verwende die Eigenschaft LOD für Kollision unter Allgemeine Einstellungen, um festzulegen, welcher LOD für Kollisionen verwendet werden soll. Jeder LOD kann für Kollisionen verwendet werden, auch LOD0.
Dieses spezielle Vorgehen ist möglicherweise nicht praktikabel, um Nanite-Projekte automatisch mit Plattformen kompatibel zu machen, die kein Nanite unterstützen, und sollte für dein Projekt getestet und ausgewertet werden.
Nanite kann sehr effizient mit einer großen Anzahl von Instanzen umgehen, aber wenn Nanite deaktiviert ist, kann es zu einer überwältigenden Anzahl von Draw Calls für die traditionelle Render-Pipeline kommen. Du kannst die Machbarkeit in deinem Projekt testen, indem du r.Nanite 0 verwendest, um die Nanite-Unterstützung ein- und auszuschalten.
Weitere Informationen findest du im Abschnitt Konsolenvariablen und -befehle auf dieser Seite.
Arbeiten mit Nanite-aktivierten Inhalten
In den meisten Fällen skaliert Nanite sehr gut innerhalb der Bildschirmauflösung. Dabei kommen zwei Techniken zum Einsatz: feinkörniger Detaillierungsgrad und Occlusion-Culling. Das bedeutet, dass die Anzahl der Dreiecke, die Nanite tatsächlich auf den Bildschirm zu zeichnen versucht, unabhängig von der geometrischen Komplexität der Quell-Daten in der Szene konsistent und proportional zur Anzahl der Pixel ist.
Nanite folgt dem Designprinzip, dass es nicht zweckmäßig ist, viel mehr Dreiecke zu zeichnen als es Pixel gibt.
Es gibt jedoch einige Inhalte, bei denen die Skalierungstechniken von Nanite nicht ausreichen. Das bedeutet aber nicht, dass sie für diese Inhalte überhaupt nicht verwendet werden sollte oder dass sie nicht schneller gerendert werden kann als die herkömmliche Pipeline. Es bedeutet nur, dass für diese Art von Inhalten die Skalierung mit Pixeln – und nicht die Komplexität der Szene – nicht mehr gilt. Nutze die Funktionen des Profilings der Unreal Engine, um diese Art von Situationen zu überwachen, wenn sie auftreten.
Aggregatgeometrie
Aggregatgeometrie ist Geometrie, die viele unzusammenhängende Teile hat, die in der Ferne zu einem Volumen werden, wie Haare, Laub an Bäumen und Gras. Diese Art von Geometrie hebelt den Detaillierungsgrad und die Occlusion-Culling-Techniken von Nanite aus. Nanite ist eine hierarchische Detaillierungsgradstruktur, die darauf beruht, kleine Dreiecke in größere Dreiecke zu vereinfachen und das gröbere zu wählen, wenn es feststellt, dass der Unterschied geringer ist, als er wahrgenommen werden kann. Für durchgehende Oberflächen funktioniert das gut, aber nicht für Aggregatgeometrien, die aus der Ferne mehr wie eine teilweise undurchsichtige Wolke als eine feste Oberfläche aussehen. Daher ist es wahrscheinlicher, dass Nanite die Aggregatgeometrie nicht annähernd so aggressiv reduzieren kann wie typische feste Oberflächen, was dazu führt, dass mehr Dreiecke für die gleiche Anzahl von Pixeln gezeichnet werden müssen.
Eine weitere Optimierung, die Aggregatgeometrie aushebelt, ist Occlusion-Culling. Obwohl sie sehr feinkörnig ist, ist sie nicht pixelgenau. Geometrie, die mit Lücken gefüllt ist – und schlimmer noch, Ebenen über Ebenen von Geometrie, die mit Lücken gefüllt sind – führen zu übermäßigem Überzeichnen, weil viele Tiefenschichten aufgebaut werden müssen, bevor der Bereich auf dem Bildschirm alles dahinter verdeckt. Du kannst dir das vorstellen, indem du dir einen Bereich von 8x8 Pixeln auf dem Bildschirm vorstellst und überlegst, wie viele Tiefenschichten gezeichnet werden müssen, bis jedes Pixel gefüllt ist. Übermäßiges Überzeichnen bedeutet, dass Nanite versucht, mehr Dreiecke zu zeichnen, um die gleiche Anzahl von Pixeln abzudecken, wodurch die Darstellung langsamer wird.
Laub ist der offensichtlichste Fall, in dem es zu Problemen mit dem Occlusion-Culling kommt, aber selbst dann bedeutet das nicht, dass Nanite überhaupt nicht auf Laub-Meshs verwendet werden sollte. Mehr erfährst du im Abschnitt Laub mit Nanite weiter unten. Es ist sinnvoll, mit verschiedenen Anwendungsfällen zu experimentieren und zu ermitteln, was für deine Projekte gut funktioniert. Verwende Werkzeuge zur Profilerstellung, um die gute Performance von Nanite mit diesen Mesh-Typen zu bestätigen.
Eng gestapelte Oberflächen
Occlusion-Culling mit herkömmlichen Meshs macht Kitbashing-Arbeitsabläufe aufgrund praktischer Einschränkungen in großem Maßstab fast unmöglich. Die feinkörnige Natur des Occlusion-Culling mit Nanite macht es möglich, diese Art von Arbeitsabläufen während der Entwicklung mit weniger Bedenken zu nutzen. Wie oben im Abschnitt Aggregatgeometrie erklärt, kann Überzeichnen dadurch entstehen, dass verdeckte Oberflächen sehr nah an den sichtbaren Oberflächen darunter liegen. Wenn die Geometrie weit unter der sichtbaren Oberfläche liegt, kann Nanite sie relativ einfach aufspüren und per Culling beseitigen, so dass sie meist als kostenlos angesehen werden kann. Wenn es jedoch gestapelte Geometrie gibt, die in der Nähe der obersten Oberfläche eng beieinander liegt, ist Nanite nicht in der Lage zu bestimmen, was oben und was unten ist, so dass beide gleichzeitig gezeichnet werden.
Dieses spezielle Problem mit dem Ausblenden ist ein Worst-Case-Szenario, bei dem Nanite nicht weiß, welche Oberfläche oben liegt, und stattdessen einfach alle Ebenen zeichnet. Diese Ungenauigkeit hängt von der Bildschirmgröße und der Entfernung ab. Während 10 Zentimeter Abstand zwischen den Ebenen in der Nähe der Oberfläche gut aussehen können, kann der Unterschied in der Entfernung kleiner als ein Pixel sein, was zum Überzeichnen führt.
Wenn duu im folgenden Beispiel die Kamera nach unten auf den Bereich bewegst, in dem der Charakter steht, zeigt die Nanite-Visualisierung Overdraw, wie diese gestapelten Oberflächen gerendert werden. Hellere Bereiche zeigen an, dass in diesen Bereichen mehr überzeichnet wird als in anderen.
Die Überzeichnungsvisualisierung ist die effektivste Möglichkeit, Überzeichnungsprobleme zu entdecken. Ein gewisses Maß an Überzeichnung ist zwar zu erwarten, aber zu viel davon führt dazu, dass die Kosten für das Ausblenden und die Rasterung von Nanite höher werden und die Skalierung von Nanite unabhängig von der Komplexität der Szene weniger effektiv wird.
Facettierte und hartkantige Normalen
Ein Problem, auf das du achten musst, ist der Import von sehr detaillierten Meshs mit facettierten Normalen, was bedeutet, dass die Normalen zwischen zwei verschiedenen Polygonen nicht geglättet wurden. Dieses Problem ist weit verbreitet und kann leicht übersehen werden. Deshalb sollte man vorsichtig sein, um dieses Problem zu vermeiden, denn wenn nur wenige Scheitelpunkte in einem Mesh geteilt werden, kann dies sowohl die Performance als auch die Datengröße erheblich verteuern. Idealerweise sollte die Anzahl der Scheitelpunkte für ein Mesh kleiner sein als die Anzahl der Dreiecke, die es hat. Wenn das Verhältnis 2:1 oder höher ist, gibt es wahrscheinlich ein Problem, vor allem, wenn dies zu einer hohen Anzahl von Dreiecken führt. Ein Verhältnis von 3:1 bedeutet, dass das Mesh komplett facettiert ist, d. h. jedes Dreieck hat seine eigenen drei Scheitelpunkte, von denen keines mit einem anderen Dreieck geteilt wird. Meistens liegt das daran, dass die Normalen nicht gleich sind, weil sie nicht geglättet wurden.
Mehr Scheitelpunkte bedeuten also mehr zu speichernde Daten. Das bedeutet auch, dass mehr Scheitelpunkte umgewandelt werden müssen und Verhältnisse von mehr als 2:1 zu langsamen Rendering-Pfaden führen. Bei der Modellierung von harten Oberflächen sollte es keine Probleme geben, und es gibt keinen Grund, sie nicht zu verwenden. Allerdings sind versehentliche vollständig facettierte, sehr dichte Meshs weitaus teurer als beabsichtigt. Eine weitere Sache, auf die du achten solltest, sind importierte Normalen auf dichten, organischen Oberflächen, die in anderen DCC-Paketen erstellt wurden. Diese haben harte Normal-Schwellenwerte, die bei Meshs mit niedrigeren Polygonen sinnvoll sein mögen, aber bei Nanite unnötige Kosten verursachen können.
In den beiden Meshs unten hat das linke Mesh zum Beispiel facettierte Normalen, während das rechte geglättete Normalen hat. Wenn du diese mit der Nanite-Dreiecke-Visualisierung vergleichst, gibt es deutliche Unterschiede in der Anzahl der Dreiecke, die Nanite zum Zeichnen verwendet. Die facettierte auf der linken Seite zeichnet deutlich mehr Dreiecke als die geglättete auf der rechten Seite.
Nanite-fähiges Mesh mit facettierten (Links) und geglätteten (Rechts) Normalen | Nanite-Dreiecksvisualisierung von Nanite-fähigen Meshs mit facettierten (links) und geglätteten (rechts) Normalen |
Klicke auf das Bild für die volle Größe. | Klicke auf das Bild für die volle Größe. |
Nanite Skelett-Mesh
Diese Funktion von Nanite ist derzeit experimentell.
Nanite Skelett-Meshs umfassen Unterstützung für Folgendes:
Eine neue Skelett-Mesh-API macht es einfacher, diese zu rendern.
Ein Draw-Aufruf für ein komplettes Mesh.
Schattierung mit virtuellen Shadow-Maps.
Keine Geometrie-LODs. Nanite Skelett-Mesh verwendet Animations-LODs.
Instanzierung mit Animationsbanken.
Laub mit Nanite
Vegetation mit Nanite gilt als Beta und wird aktiv erforscht und entwickelt. Dieser Abschnitt bietet eine Anleitung zur Verwendung von Vegetations-Geometrie in Nanite.
Bei Assets wie Bäumen mit standardmäßigen Nanite-Einstellungen kann es vorkommen, dass die Baumkronen mit zunehmender Entfernung immer dünner werden. Diese Fälle sind eine besondere Form der Aggregatgeometrie, bei der jedes nicht zusammenhängende Teil (ein Laubblatt oder ein Grashalm) offene Kanten an seiner Grenze hat. Die Aktivierung von Gebiet erhalten ist nützlich, um diese Ausdünnung zu verhindern, wenn Nanite aktiviert ist. Wenn Nanite die Geometrie in der Ferne vereinfacht, indem es die Anzahl der Dreiecke reduziert, muss es schließlich damit beginnen, einige dieser unzusammenhängenden Elemente vollständig zu entfernen. Wenn Nanite nicht über mehr Informationen verfügt, sieht das Ergebnis dünn aus, weil die Oberfläche zu groß geworden ist. Fläche erhalten verteilt die verlorene Fläche auf die verbleibenden Dreiecke, indem es die offenen Begrenzungskanten ausdehnt. Die Dehnung von symmetrischen Formen wie Laubblättern hat denselben Effekt wie die Vergrößerung. In nicht symmetrischen Fällen wie Bändern, z. B. Grashalmen, hat es den Effekt, dass sie dicker werden.
Wir empfehlen, Gebiet erhalten für alle Vegetations-Meshs zu verwenden, aber nicht für Meshs, die nicht als Szenenvegetation verwendet werden sollen.
Die Nanite-Cluster-Visualisierung bietet einen klareren Blick darauf, wie die Einstellung „Gebiet erhalten“ verlorenes Gebiet umverteilt.
Im Folgenden findest du einige Empfehlungen für die Verwendung und das Authoring von Laub-Assets unter Berücksichtigung von Nanite. Wir experimentieren noch und lernen selbst, was die besten Vorgehensweisen sind. Bisher haben wir herausgefunden, dass Vegetation mit Nanite anders erstellt werden sollte als bisher, aber wenn du seine Stärken ausspielst, kannst du mit Nanite schnellere und hochwertigere Ergebnisse erzielen.
Verwende Gebiet erhalten (aktiviert im Statisches-Mesh-Editor).
Verwende Geometrie anstelle von maskierten Karten.
Maskierte Materialien sind im Vergleich zu undurchsichtigen Materialien relativ teuer. Die schnellsten Ergebnisse erzielt man wahrscheinlich, wenn man sie gar nicht verwendet.
Der traditionelle Kartenansatz (viele Elemente werden mit einer einzigen Karte dargestellt) kann mit Nanite langsamer sein als ohne Nanite. Erwarte nicht, dass die Aktivierung von Nanite auf kartenbasiertem Laub immer eine Performance-Verbesserung bedeutet.
Maskierte Pixel kosten fast so viel wie gezeichnete Pixel.
Es hat sich gezeigt, dass Geometrie-Laub mit Nanite schneller ist als mit Karten, sowohl mit Nanite-Karten als auch mit Karten ohne Nanite. Es sieht auch besser aus.
Das Paket Megascans: Grass auf Fab bietet gute Beispiele zum Testen. Das Paket bietet sowohl maskierte High-Poly-Geometrie, bei der jedes Element unabhängig ist, als auch maskierte Low-Poly-Karten, bei denen viele Elemente durch eine einzige Karte dargestellt werden.
Bei Verwendung von Weltpositionsversatz (WPO) bedeuten mehr Scheitelpunkte höhere Kosten. Die WPO-Logik muss begrenzt und überwacht werden.
Die im Abschnitt Aggregate Geometry auf dieser Seite erläuterten Probleme gelten weiterhin. Dichte Wälder (wie in den Beispielen oben) werden viel langsamer gerendert als die gleiche Szene, in der alle Meshs durch massive Formen mit der gleichen Dreiecksanzahl ersetzt wurden.
Verwenden von „Max Welt-Positionsversatz Verschiebung“ mit Nanite
In Ihren Materialien und Material-Instanzen können Sie mit der Einstellung Max Welt-Positionsversatz Verschiebung eine Grenze für den erlaubten Versatz von WPO festlegen. Dies kann besonders für Nanite-Meshs nützlich sein, da diese in kleinere Cluster aufgeteilt werden, die jeweils ihre eigenen Grenzen haben und auf der GPU individuell ausgeblendet werden. Das Klammern von WPO-Werten eignet sich gut, um dies zu verwalten.
Du findest die Einstellung Max Welt-Positionsversatz Verschiebung in der Kategorie Details > Welt-Positionsversatz des Materials oder unter Objektmaterial Overrides in einer Materialinstanz.
Weitere Informationen findest du in den Materialeigenschaften.
Statisches Verschiebungsmapping in Nanite
Diese Funktion von Nanite ist derzeit experimentell.
Der Statisches-Mesh-Editor umfasst die Option, Nanite-fähigen Meshs durch einen adaptiven Offline-Tesselator Details hinzuzufügen. Der Tesselator generiert ein optimiertes Nanite-Mesh mittels gebakter Verschiebungskarten. Dieser texturgesteuerte Ansatz ist nicht-destruktiv und erlaubt es Ihnen, das Ausmaß der Tesselierung und Verschiebung durch skalierbare Parameter zu steuern.
Führe im Details-Panel unter den Nanite-Einstellungen Folgendes aus:
Lege den Wert für Trim Relativer Fehler auf einen Wert ungleich 0 fest, um die Tessellierungsmenge zu steuern.
Ein guter Standard ist 0,04, aber du solltest diesen Wert über 0,02 lassen. Dieser Wert zielt auf ein Fehlerlevel beim Tessellieren des Mesh ab. Ein zu kleiner Wert verwendet einfach viele Dreiecke und erhöht die Build-Zeiten.
Füge Verschiebungskarten hinzu.
Erweitere das Element Index und füge eine Textur hinzu, die für die Verschiebung verwendet werden soll.
Wenn Ihr Mesh mehr als einen Material-Slot hat, wird jeder „Displacement Maps Index“ zu dem entsprechenden Material-Slot gemappt. Beispielsweise würde der Material-Slot 0 dem „Displacement Maps Index“ 0 zugeordnet, Material-Slot 1 dem Index 1 und so weiter.
Lege eine Größenordnung fest, um das Ausmaß der Verschiebung zu steuern.
Klicke auf Änderungen übernehmen.
Nanite-Tessellierung
Diese Funktion von Nanite ist derzeit experimentell.
Die Nanite-Tessellierung ist eine dynamische, programmierbare Verschiebung, die es Nanite-Meshs erlaubt, während der Laufzeit mithilfe einer Verschiebungskarte oder eines prozeduralen Materials modifiziert zu werden. Im Gegensatz zum Welt-Positionsversatz, der nur auf die ursprünglichen Mesh-Scheitelpunkte angewendet werden kann, tesselliert die Nanite-Verschiebung das Mesh während der Laufzeit in zusätzliche Dreiecke, um es an die Details der Verschiebungskarte anzupassen. Es werden nur so viele Dreieck-Details generiert, die für die aktuelle Pixeldichte erforderlich sind.
Zu den Vorteilen der Nanite-Tessellierung gehören:
Verwendung von Quell-Meshs, die weniger Details in der Authoring-Pipeline umfassen.
Materialgesteuerte und animierte Verschiebung.
Erstellung detaillierter Nanite-Landschaften.
Bild für Großansicht anklicken.
Um die Nanite-Tessellierung zu aktivieren, musst du die folgenden Konsolenvariablen in ConsoleVariables.ini oder der .ini-Konfigurationsdatei deines Projekts festlegen:
// This is read-only and must be set in the config file for the project.
r.Nanite.AllowTessellation=1
// This can be dynamically toggled at runtime.
r.Nanite.Tessellation=1Sobald diese Variablen festgelegt sind, kannst du die Tesselierung mithilfe des Material-Editors einrichten, indem du den folgenden Schritte ausführst:
Wähle den Haupt-Materialknoten.
Markiere im Details-Panel in den Einstellungen für Nanite das Kontrollkästchen für Tesselierung aktivieren.
Verbinde ein Textur-Sample mit dem Verschiebung-Input des Hauptmaterialknotens.
Der Wertebereich für den Input „Displacement“ liegt bei 0 bis 1.
Es gibt zwei Einstellungen, die für die Verwendung der Tessellierung in einem Material konfiguriert werden müssen:
Magnitude: Dies ist die Höhe der Verschiebung, gemessen von Minimum bis Maximum, die dem Bereich 0 bis 1 des Pins „Displacement“ entspricht. Sie bestimmt auch die Grenzen, die für das Ausblenden verwendet werden. Lege diese also nur so groß wie nötig fest.
Dieser Wert hat erhebliche Auswirkungen auf die Performance und kann andere unbeabsichtigte Effekte haben. Weitere Informationen findest du im Abschnitt „Wissenswertes“ weiter unten.
Center: Dies legt fest, welcher Verschiebungswert keiner Änderung gegenüber dem Basis-Mesh entspricht. Wenn also Mittelgrau die Mitte ist und du gleiche die Verschiebung innerhalb und außerhalb des Mesh möchtest, verwende 0,5. Wenn du nur nach außen pushen möchtest, lege dies auf 0 fest.
Zusätzlich kannst du in einem Material die Nanite-Tessellierung optimieren, indem du im Details-Panel Verschiebung Abblenden aktivierst. Sie hat zwei Einstellungen:
Start Fade Size (Pixels): Wie groß die maximale Verschiebung in Pixeln auf dem Bildschirm sein soll, wenn die Verschiebung ausgeblendet wird. Dieser Wert sollte eine höhere Zahl sein als der Wert „End Fade Size“.
End Fade Size (Pixels): Wie groß die maximale Verschiebung in Pixeln auf dem Bildschirm sein soll, wenn das Ausblenden abgeschlossen werden soll und Verschiebung deaktiviert werden soll. Dieser Wert sollte kleiner sein als „Start Fade Size“.
Wissenswertes:
Funktioniert nur mit Nanite-Meshs. Tesselierung und Verschiebung werden auf Nicht-Nanite-Meshs oder in Fällen, in denen Nanite nicht unterstützt wird, ignoriert.
Die Verschiebung verändert die Schattierung nicht (im Gegensatz zu Offline-Renderern). Du musst eine entsprechende Normal-Map bereitstellen oder ein Normale aus den Verschiebungsableitungen ableiten. Aus Gründen der Qualität und Komprimierung empfehlen wir, eine zusätzliche Normal-Map zu haben.
Nur skalierbare Verschiebung. Vektor-Verschiebung wird derzeit nicht unterstützt.
Die Verschiebung erfolgt entlang der nicht normalisierten interpolierten Scheitelpunktnormalen. Derzeit gibt es keine Option zur Steuerung der Verschiebungsrichtung im Shader. Sie befindet sich immer entlang der Normalen.
Die Verschiebung findet im lokalen Raum statt und vor jeder Art von Objektskalierung. Dies bedeutet, dass das im Material angegebene Ausmaß der Verschiebung in Objektraumeinheiten vor der Skalierung des Mesh angegeben ist. Das ist oft, was du möchtest, aber vielleicht auch nicht. Wenn du beispielsweise einen Ziegelstein auf einem Würfel haben möchtest, den Sie als Wand skaliert haben. Wir werden wahrscheinlich in Zukunft eine Option für den Welt-Bereich hinzufügen, um diese Fälle zu behandeln.
Tesselierung und Verschiebung funktionieren auch in der Landschaft, solange Nanite dafür erstellt wurde. Leider haben die Meshs, die die Landschaft generiert, automatisch einen beträchtlichen Maßstab zugewiesen. Verwende daher einen viel kleineren „Magnitude“-Wert für Landschaftsmaterialien. Etwa 64x kleiner. Dies wird in Zukunft wahrscheinlich mit der im vorherigen Punkt genannten Option behoben.
Halte den Wert der Einstellung „Magnitude“ so klein wie nötig. Versuche stattdessen, den gesamten Bereich (0 bis 1) des Output „Displacement“ zu nutzen. Lege „Magnitude“ nicht auf 100 fest und skaliere dann zum Ausgleich den Wert herunter, den du an den Output „Displacement“ übergibst. Der Grund dafür ist, dass der Wert „Magnitude“ zum Begrenzen von Patches für das Ausblenden verwendet wird. Wenn „Magnitude“ groß ist, kann dies schwerwiegende Auswirkungen auf die Performance haben, insbesondere bei virtuellen Shadow-Maps.
Aktuell gibt es keine Lösung für eine rissfreie Verschiebung, so wie es Unreal Engine 4 mit Hardware-Tessellierung geboten hat. Dies bedeutet, dass UV-Nähte, harte Kantennormalen oder jedes andere Scheitelpunktattribut, das die Verschiebung beeinflusst und nicht glatt ist, Risse verursachen.
Die Tessellierung kann mit Welt-Positionsversatz kombiniert werden. WPO wird in diesem Fall vor der Tesselierung auf die Basis-Mesh-Scheitelpunkte angewendet. Die Verschiebung wirkt sich wie immer auf die zerteilten Dreiecksscheitelpunkte nach der Tesselierung aus.
Die Tesselierung ist mit „Pixel Depth Offset“ nicht kompatibel. PDO wird ignoriert, wenn die Tesselierung aktiviert ist.
Die Tesselierung kann mit Opazitätsmaske kombiniert werden, aber aus Performance-Gründen wird die Maskierung nicht pro Pixel, sondern mit einer zerteilten Dreiecksrate durchgeführt. Für die meisten Anwendungsfälle sollte das ausreichend sein, allerdings arbeitet es nicht gut mit Dithering, da das pro Pixel durchgeführt werden muss.
Es ist möglich, dass Texturkomprimierungsartefakte bei Verschiebungskarten offensichtlich sind und wie Treppenstufen aussehen. Die Texturkomprimierungseinstellung Alpha, die BC4 verwendet, funktioniert in vielen Fällen einwandfrei. Im Alpha eines RGBA mit Standard/DXT5/BC3 gespeichert, solltest du ähnliche Ergebnisse erhalten. Manchmal ist es unkomprimiert erforderlich, aber Fließkomma ist wahrscheinlich übertrieben. Channel-Packing, insbesondere das Paketieren der Höhe mit Normalen, führt bei jedem komprimierten Format wahrscheinlich zu Artefakten. Dies widerspricht möglicherweise früheren Erfahrungen, als Höhenkarten für andere Zwecke verwendet wurden.
Die Verschiebung ist relativ zu den flachen Dreiecken des Basis-Mesh. Dies bedeutet, dass sie nicht von einer gekrümmten Oberfläche ausgeht wie PN-Dreiecke oder Catmull-Clark-Unterteilungsflächen. Die Tessellierung glättet die Oberfläche nicht automatisch.
Nanite-Splines
Spline-Meshs werden für die Verformung von Meshs entlang der Form eines Splines verwendet, wie bei Straßen und Wegen über Landschaftsterrains. Nanite-aktivierte Meshs unterstützen standardmäßig Splines und können als Landscape Splines und Blueprint Splines erstellt werden.
Beispielszene mit Nanite-Mesh im Vordergrund und Nanite-Spline. Diese Szene zeigt die Visualisierung von beleuchteten und Nanite-Dreiecken.
Bei Nanite-Spline-Meshs kann es möglicherweise zu visuellen Problemen kommen. Bei der Erstellung eines Spline-Mesh mit einem Nanite-fähigen Statisches Mesh ist es zum Beispiel möglich, dass die Auflösung des Spline-Mesh abnimmt, wenn sich die Kamera von ihm wegbewegt. Das liegt daran, dass Nanite die Deformation von Spline-Meshs bei der Generierung seines unteren Detaillierungsgrads (LOD) nicht berücksichtigt. Als Ergebnis können Vereinfachungen, die bei unveränderter Entfernung nicht erkennbar sind, bei der Dehnung entlang einer Spline-Kurve offensichtlich werden.
Du kannst dieses Deformationsproblem mit der Einstellung Maximale Kantenlänge Faktor abschwächen. Du findest diese im Statisches-Mesh-Editor unter Nanite-Einstellungen im Details-Panel. Dieser Parameter mindert dieses Problem, indem er Nanite dazu zwingt, genug Detail beizubehalten, um eine gewünschte Entfernung zwischen Scheitelpunkten des Mesh auf dem Bildschirm aufrechtzuerhalten, wodurch verhindert wird, dass das Mesh unter einem bestimmten Schwellenwert der Scheitelpunktdichte gerendert wird.
Der Standardwert für den maximalen Kantenlängenfaktor ist 0. Dies gibt an, dass die Kantenlänge für dieses Mesh nicht berücksichtigt wird. Werte Größer als 0 repräsentieren eine gewünschte Entfernung zwischen zwei beliebigen verbundenen Scheitelpunkten im Raum. Genauer gesagt wird diese Entfernung als ein Vielfaches der kleinsten gewünschten Nanite-Dreieckskante (wie durch r.Nanite.MaxPixelsPerEdge konfiguriert) dargestellt.
Upgrade auf Nanite-Splines von einer früheren Engine-Version
In Projekten, die mit Unreal Engine 5.3 und älter erstellt wurden, rendern Spline-Mesh-Komponenten, die Nanite-fähige Statisches Meshs verwendeten, zuvor aus dem Nanite-Mesh generierten Fallback-Meshs als gewöhnliche Statisches Meshs. Da in Unreal Engine 5.4 das Rendering von Splines mit Nanite nun standardmäßig aktiviert ist, werden diese Meshs nun als Nanite gerendert, was zu visuellen Unterschieden führen kann.
Um das vorherige Verhalten beizubehalten, bei dem das Fallback-Mesh von Nanite als Spline-Mesh gerendert wird, kannst du r.SplineMesh.RenderNanite auf 0 setzen.
Hybride Arbeitsabläufe für Nicht-Nanite- und Nanite-Inhalte
Die folgenden Abschnitte heben Arbeitsabläufe hervor, die du in deinen Nanite-Projekten verwenden kannst, die auch Nicht-Nanite-Funktionen und -Plattformen unterstützen müssen, ohne Assets zu duplizieren.
Importieren eines hochauflösenden Mesh für Nanite
Über den Inhaltsbrowser oder den Statisches-Mesh-Editor kannst du ein hochauflösendes Mesh importieren, das als Nanite-Repräsentation für alle vorhandenen statischen Nicht-Nanite-Meshs dient.
Im Inhaltsbrowser kannst du über das Kontextmenü eines Statisches-Mesh-Assets die Option Detaillierungsgrad > Hochauflösend > Hochauflösend importieren wählen und zu der Datei navigieren, die du importieren möchtest.
Alternativ kannst du auch den Statisches-Mesh-Editor verwenden, um ein hochauflösendes Mesh zu importieren, indem du die Nanite-Einstellungen im Details-Panel verwendest. Klicke auf Importieren und navigiere zu der Datei, die du importieren möchtest.
Bei diesem Arbeitsablauf wird das bereits vorhandene statische Mesh und sein Detaillierungsgrad (LOD) zum Fallback-Mesh, anstatt dass der Importprozess automatisch ein Fallback-Mesh aus der Nanite-Geometrie erzeugt.
Dieser Workflow berücksichtigt die Einstellung Nanite verbieten für Statisches-Mesh-Actors in Ihren Szenen und wird weiter unten im Abschnitt Statisches-Mesh-Komponente Optionen erklärt.
Material-Arbeitsabläufe
Es gibt zwei Möglichkeiten, wie du deine Arbeitsabläufe mit Materialien ohne Nanite und mit Nanite verbessern kannst: indem du einen Knoten im Material-Diagramm verwendest, um Logikpfade aufzubrechen, oder indem du ein Override-Material verwendest, das nur für das Rendering mit Nanite verwendet wird.
Knoten Nanite-Durchlaufumschaltung
Der Knoten Nanite-Durchlaufumschaltung ermöglicht es Ihnen, ein spezielles Verhalten in einem Materialdiagramm zu definieren, wenn es mit Nanite gerendert wird.
Verwende den Standard-Input beim Rendern in Nicht-Nanite-Durchläufen, um das Material wie gewohnt zu behandeln. Verwende den Nanite-Input für sämtliche Material-Logik, die du vereinfachen oder speziell für Nanite-Durchläufe rendern möchtest. Wenn ein Material zum Beispiel ein Merkmal verwendet, die von Nanite nicht unterstützt wird, kannst du die gleiche Logik für den Standard-Input beibehalten und eine benutzerfreundlichere Logik für den Nanite-Input verwenden.
Nanite-Override-Material
Der Slot Nanite Override-Material ist für Materialien und Materialinstanzen verfügbar. Wenn du ein Override-Material festlegst, verwenden alle Meshs mit Nanite-Aktivierung, denen das Material oder die Materialinstanz zugewiesen ist, stattdessen das referenzierte Nanite Override-Material. Das bedeutet, dass du Materialien speziell für Nanite-Arbeitsabläufe erstellen kannst, anstatt die Logik direkt im Material-Diagramm mit dem Knoten Nanite-Durchlaufumschaltung zu verwalten.
In Materialinstanzen ist der Nanite Override-Material-Slot zwangsweise auf None voreingestellt, so dass das Festlegen des Overrides in einem übergeordneten Material nicht dazu führt, dass er automatisch an eine der untergeordneten Instanzen dieses Materials vererbt wird.
Im folgenden Beispiel hat das Statisches-Mesh-Asset für die Statue Nanite aktiviert und eine Materialinstanz zugewiesen. Die Materialinstanz hat ihr Nanite Override-Material mit einigen einfachen Farbänderungen zu Demonstrationszwecken eingestellt. Der Statisches-Mesh-Actor auf der linken Seite zeigt das Nanite Override-Material an, da das Mesh mit Nanite gerendert wird. Der Statisches-Mesh-Actor auf der rechten Seite zeigt dasselbe Material an, bis Nanite verbieten für den Actor festgelegt wird, wodurch das Nanite-Override-Material deaktiviert wird, um das Nicht-Nanite-Basismaterial der Materialinstanz anzuzeigen.
Statisches-Mesh-Komponentenoption: Disallow Nanite
Du kannst festlegen, wann Nanite-aktivierte statische Meshs ihre Nanite-Darstellung verwenden sollen, indem du die Einstellung Nanite verbieten für einzelne Szenen-Actors verwendest. Das bedeutet, dass du eine Mischung aus Nanite- und Nicht-Nanite-Actors haben kannst, die das gleiche Statisches-Mesh-Asset verwenden.
Das folgende Beispiel zeigt ein einzelnes Statisches-Mesh-Asset mit aktiviertem Nanite, bei dem links die Darstellung des Nanite-Meshs und rechts die Option Nanite verbieten aktiviert ist.
Landschaftsterrain
Du kannst Nanite für Landschafts-Actors aktivieren. Nanite-Landschafts-Meshs werden im Hintergrund neu erstellt, um deine Workflows nicht zu unterbrechen, während du dch im Editor befindest. Die Nanite-Landschaft verbessert die Auflösung nicht, bietet Ihnen aber die Nutzung von Nanite-Laufzeitfunktionen wie GPU-Ausblendung, automatisches Geometrie-Streaming und LODs. Sie boostet allgemein die Laufzeit-Performance, insbesondere bei anspruchsvollen Funktionen wie VSM.
Um zu lernen, wie du Nanite in deiner Landschaft aktivieren und verwenden kannst, sieh dir die Dokumentation Nanite mit Landschaften verwenden an.
Performance von typischen Inhalten
Zum Vergleich wurden die folgenden GPU-Timings aus der technischen Demo der Unreal Engine 5 Lumen in the Land of Nanite auf einer PlayStation 5 entnommen:
Durchschnittliche Rendering-Auflösung von 1400p, temporär hochgerechnet auf 4K.
~2,5 Millisekunden (ms) für das Ausblenden und Rastern aller Nanite-Meshs (was in dieser Demo fast alles war)
Fast alle verwendeten Geometrien waren ein Nanite-Mesh
Nahezu keine CPU-Kosten, da 100% GPU-gesteuert
~2 ms zur Auswertung der Materialien für alle Nanite-Meshs
Geringe CPU-Kosten mit 1 Draw-Aufruf pro Material in der Szene.
Wenn du diese GPU-Zeiten zusammenrechnest, sind es etwa 4,5 ms für das, was dem Tiefenvordurchlauf der Unreal Engine 4 plus dem Basisdurchlauf entsprechen würde. Damit eignet sich Nanite besonders gut für Spieleprojekte, die 60 FPS anstreben.
Solche Zahlen sollten von Inhalten erwartet werden, die nicht unter den in den vorherigen Abschnitten beschriebenen Performance-Problemen leiden. Eine sehr hohe Anzahl von Instanzen und eine große Anzahl einzigartiger Materialien kann ebenfalls zu erhöhten Kosten führen und ist ein Bereich der Nanite-Entwicklung, an dem aktiv gearbeitet wird.
Datengröße
Aufgrund der mikroskopisch kleinen Details, die Nanite erreichen kann, könnte man annehmen, dass dies mit einem gewaltigen Anstieg der Geometriedaten einhergeht, was zu größeren Paketen und Downloads für die Spieler führt. Doch die Realität ist nicht so schlimm. Das Mesh-Format von Nanite ist aufgrund der speziellen Mesh-Kodierung von Nanite deutlich kleiner als das Standardformat von Statisches Meshs.
Bei der Unreal-Engine-5-Demo "Valley of the Ancient" sind die Nanite-Meshs im Durchschnitt 14,4 Byte pro Input-Dreieck groß. Das bedeutet, dass ein durchschnittliches Nanite-Mesh, das aus einer Million Dreiecken besteht, ungefähr 13,8 Megabyte (MB) auf der Festplatte belegt.
Wenn du ein herkömmliches Low-Poly-Mesh plus Normal Map mit einem High-Poly-Nanite-Mesh vergleichst, würdest du etwa Folgendes feststellen:
Low-Poly-Mesh
Statisches Mesh Komprimierte, paketierte Größe: 1,34 MB | Nanite-Mesh
Statisches Mesh komprimierte, paketierte Größe: 19,64 MB |
Die Größe der komprimierten Pakete entspricht jedoch nicht der gesamten Größe des Assets. Es gibt auch einmalige Texturen, die nur von diesem Mesh verwendet werden und die berücksichtigt werden müssen. Viele der Materialien, die von Meshs verwendet werden, haben ihre eigenen einzigartigen Texturen, die aus verschiedenen Normal-, BaseColor-, metallischen, spiegelnden, Rauheits- und Maskentexturen bestehen.
Dieses Asset verwendet nur zwei Texturen (BaseColor und Normal) und verbraucht daher nicht so viel Platz auf der Festplatte wie ein Asset mit vielen anderen einzigartigen Texturen. Beachte beispielsweise, dass die Größe des Nanite-Mesh mit ca. 1,5 Millionen Dreiecken kleiner ist (19,64 MB) als eine 4K-Normal-Map-Textur.
| Textur Type | Texturgröße | Größe auf Festplatte |
|---|---|---|
BaseColor | 4k x 4k | 8,2 MB |
Normal | 4k x 4k | 21,85 MB |
Die Gesamtgröße der komprimierten Pakete für dieses Mesh und seine Texturen beträgt:
Low-Poly-Mesh: 31,04 MB
High-Poly-Mesh: 49,69 MB
Da das Nanite-Mesh bereits sehr detailliert ist, können wir versuchen, die einzigartige Normal Map durch eine Kachelung mit Detailnormalen zu ersetzen, die mit anderen Assets geteilt wird. Obwohl dies in diesem Fall zu einem gewissen Qualitätsverlust führt, ist dieser ziemlich gering und sicherlich viel kleiner als der Qualitätsunterschied zwischen den Low-Poly- und den High-Poly-Versionen. So kann ein Nanite-Mesh mit 1,5 Mio. Dreiecken sowohl besser aussehen als auch kleiner sein als ein Low-Poly-Mesh mit einer 4K-Normal-Map.
Gesamtgröße der komprimierten Pakete für das Nanite-aktivierte Mesh und die Texturen: 27,83 MB
Es gibt viele Experimente mit der Texturauflösung und den Detail-Normal-Maps, aber dieser spezielle Vergleich soll zeigen, dass die Datengrößen von Nanite-Meshs sich nicht allzu sehr von den Daten unterscheiden, mit denen die Anwender bereits vertraut sind.
Schließlich können wir die Nanite-Komprimierung mit dem gewöhnlichen statischen Mesh vergleichen, indem wir das High-Poly-Format verwenden, wo beide bei LOD0 identisch sind.
Statisches High-Poly-Mesh
Statisches Mesh Komprimierte, paketierte Größe: 148,95 MB | Nanite-Mesh
Statisches Mesh komprimierte, paketierte Größe: 19,64 MB |
Im Vergleich dazu ist die Nanite-Komprimierung von vorhin mit einer Größe von 19,64 MB 7,6x kleiner als die Komprimierung des gewöhnlichen statischen Meshs mit 4 LODs.
Die Nanite-Komprimierung und die Datengrößen sind wichtige Bereiche, die in zukünftigen Versionen von Unreal Engine verbessert werden sollen.
Allgemeine Hinweise zur Datengröße
Nanite und Systeme für Virtual Texturing, gekoppelt mit schnellen SSDs, haben die Bedenken über Laufzeit-Budgets für Geometrie und Texturen verringert. Der größte Engpass ist nun, wie man diese Daten den Benutzern bereitstellt.
Die Datengröße auf der Festplatte ist ein wichtiger Faktor, wenn es darum geht, wie die Inhalte bereitgestellt werden – auf physischen Medien oder heruntergeladen über das Internet – und die Komprimierungstechnologie kann nur einen Teil davon übernehmen. Die Internet-Bandbreite, die Größe der optischen Medien und die Größe der Festplatten sind beim durchschnittlichen Endanwender nicht in gleichem Maße gestiegen wie die Bandbreite und Zugriffslatenz der Festplatten, die GPU-Rechenleistung und Softwaretechnologien wie Nanite. Die Weitergabe dieser Daten an die Nutzer ist eine Herausforderung.
Das effiziente Rendern von hochdetaillierten Meshs ist mit Nanite weniger problematisch, aber die Speicherung der Daten auf der Festplatte ist jetzt der wichtigste Bereich, der unter Kontrolle gehalten werden muss.
Visualisierungsmodi
Nanite bietet eine Reihe von Visualisierungsmodi zur Untersuchung der Daten in der aktuellen Szene.
Bewege den Mauszeiger im Level-Viewport in der Dropdown-Liste Ansichtsmodi über Nanite-Visualisierung und wähle aus der Auswahl.
Die Übersicht-Visualisierung zeigt die gerenderte Szene in der Mitte des Bildes mit ausgewählten Nanite-Visualisierungen als Referenzen an.
Die folgenden Nanite-Visualisierungsmodi stehen zur Auswahl:
| Nanite-Visualisierung | Beschreibung |
|---|---|
Maske | Visualisierung, die Nanite- (grün) und Nicht-Nanite- (rot) Geometrie markiert. |
Dreiecke | Zeigt alle Dreiecke der Nanite-Meshs in der aktuellen Szene an. |
Patches | Zeigt alle Patches der Nanite-Meshs in der aktuellen Szene an. |
Cluster | Zeigt farbige Darstellungen aller Gruppierungen von Dreiecken an, die in der aktuellen Szene gerendert werden. |
Grundkörper | Visualisierung, die Komponenten für alle Instanzen in einem Instanz-Statischen Mesh (ISM) gleich einfärbt. |
Instanzen | Visualisierung, die für jede Instanz in der Szene eine andere Farbe verwendet. |
Überzeichnen | Zeigt an, wie stark die Geometrie der Szene überzeichnet wurde. Alle ausgewerteten Pixel, einschließlich maskierter Pixel, werden der Überzeichnen-Anzeige hinzugefügt. Kleinere Objekte, die dicht übereinander gestapelt sind, führen zu einer stärkeren Überzeichnung als größere Objekte. |
Lightmap UV | Visualisierung, die die UV-Koordinaten von Nanite-Mesh-Oberflächen anzeigt. |
WPO auswerten | Färbt Nanite-aktivierte Geometrien ein, die den Welt-Positionsversatz nutzen (grün), gegenüber solchen, die dies nicht tun (rot). |
Pixel-programmierbar | |
Tesselierung | Visualisierung für Nanite-Mesh mit Tesselierung und der Menge an Tesselierung, die nur bei tessellierten Meshs auftritt. |
Raster-Bins | Zeigt Gruppen an, die Batches der Geometrie repräsentieren. |
Schattierungs-Bins |
Nanite enthält einen Erweitert-Visualisierungsmodus, der zusätzliche Visualisierungsoptionen im Menü Nanite Visualization aktiviert. Diese Visualisierungen sind nützlich für Programmierer, die verschiedene Low-Level-Aspekte von Nanite debuggen oder profilieren.
Aktiviere diesen erweiterten Mvisualisierungsmodus mit der Konsolenvariable r.Nanite.Visualize.Advanced 1.
Konsolenvariablen und Befehle
Die folgenden Statistiken und Konsolenvariablen sind für das Debugging und die Konfiguration von Nanite verfügbar.
Das Nanite-Rendering kann zur Laufzeit mit der Konsolenvariablen r.Nanite 0 global aktiviert und deaktiviert werden. Die Deaktivierung von Nanite ist eine gute Möglichkeit, Plattformen zu emulieren, auf denen es nicht unterstützt wird.
Nanite Fallback-Rendering-Modi
Nanite bietet Fallback-Mesh-Rendering-Modi, wenn Nanite entweder deaktiviert ist oder von einer Plattform nicht unterstützt wird. Du kannst mit der Konsolenvariablen r.Nanite.ProxyRenderMode steuern, welcher Modus verwendet wird.
0 ist der Standardmodus und greift auf das Rendering von Fallback-Meshs oder Bildschirmraum-gesteuerten LODs zurück, wenn diese festgelegt sind. Dazu gehört auch die Erkennung von Min LOD in den Eigenschaften des Statisches-Mesh-Editors (beschrieben im Abschnitt Fallback-Mesh oben).
1 deaktiviert das gesamte Rendering von Nanite-aktivierten Meshs.
2 funktioniert ähnlich wie Modus 1, ermöglicht aber die Visualisierung Anzeigen > Nanite-Fallback im Statisches-Mesh-Editor, um ein Nanite-Fallback zu rendern.
Die Fallback-Rendering-Modi 1 und 2 sind nützlich für Szenen, die viel mehr Instanzen haben, als ohne Nanite unterstützt werden können. Sie ermöglichen es, die Szene im Editor auf Plattformen zu öffnen, die Nanite nicht unterstützen.
Im Unreal Engine 5-Beispielprojekt "Valley of the Ancient" zum Beispiel würde die Deaktivierung von Nanite dazu führen, dass zehntausende von regelmäßigen Draw-Aufrufen stattfinden, was es schwierig macht, die Karte auf einer nicht unterstützenden Plattform zu öffnen.
Befehl Nanitestats
Der Befehl NaniteStats fügt oben rechts im Viewport ein Overlay von Nanite-Ausblendungsstatistiken ein.
Mit den Befehlsargumenten kannst du festlegen, welche Statistiken Nanite auf dem Bildschirm anzeigt. Wenn kein Argument angegeben wird, wird die primäre Ansicht verwendet.
Verwende NaniteStats List, um alle verfügbaren Ansichten im Debug-Output anzuzeigen:
Hauptkanal
Virtual Shadow Maps
Du kannst auch andere Statistiken für ShadowAtlas und CubemapShadows sehen, wenn sie verfügbar sind. Wähle eine Ansicht aus, indem du den Befehl gefolgt von dem Namen der Statistikliste eingibst, die du anzeigen möchtest. Gib zum Beispiel NaniteStats VirtualShadowMaps ein.
Bei Ansichten mit Two-Pass-Occlusion-Culling werden die Statistiken in separate Buckets für Main und Post-Pass aufgeteilt.
Ändern der Größe des Nanite-Streaming-Pools
Steuere den Speicherplatz für Nanite-Streaming-Daten mit der Konsolenvariable r.Nanite.Streaming.StreamingPoolSize. Die Verwendung größerer Pools reduziert den IO- und Dekomprimierungsaufwand, wenn du dich in der Szene bewegst, allerdings auf Kosten eines höheren Speicherbedarfs.
Wenn der Pool nicht groß genug ist, um alle für eine Ansicht benötigten Daten aufzunehmen, kann es zu Cache-Thrashing kommen, bei dem sich das Streaming auch bei einer statischen Ansicht nie einpendelt.
Um Nanite-Streaming-Daten zu visualisieren, kannst du das Anzeige-Flag „Streaming-Geometrie“ verwenden: Show > Nanite > Streaming-Geometrie. Wenn diese Option deaktiviert ist, werden Nanite-Meshs nur mit der Qualität gerendert, die immer im Speicher vorhanden ist.
Maximale Anzahl von Clustern in einem Durchlauf einstellen
Mit den Konsolenvariablen r.Nanite.MaxCandidateClusters und r.Nanite.MaxVisibleClusters kannst du die maximale Anzahl an Kandidaten- und sichtbaren Clustern festlegen, die in einem einzigen Durchlauf verwendet werden. Ihre Werte werden für die Größenbestimmung von Zwischenbuffern verwendet und ihre Standardwerte wurden so gewählt, dass sie für gängige Rendering-Szenarien geeignet sind.
Es gibt keinen Mechanismus, um die Größe dieser Buffer dynamisch zu ändern und/oder die Qualität bei Überlauf automatisch zu verringern. Dies kann zu Artefakten führen, wenn die Buffer für die Komplexität der Szene zu klein sind, was sich in der Regel durch fehlende oder blinkende Geometrie äußert. Wenn diese Art von Artefakten auftritt, kannst du mit NaniteStats konservative Grenzen für Kandidaten und sichtbare Cluster bestimmen. Sieh dir insbesonderer die Statistien für ClustersSW und ClustersHW an. Die Speicherkosten eines Kandidaten-Clusters betragen derzeit 12 Byte und die eines sichtbaren Clusters 16 Byte.
Diese Konsolenvariable kann während der Laufzeit nicht geändert werden und muss in einer Konfigurationsdatei (.ini) angegeben werden.