Nanite-Zusammensetzungen sind eine Schlüsselkomponente des Nanite-Vegetation-Systems. Sie sind darauf ausgelegt, das Rendering komplexer, wiederholbarer Geometrie wie die Äste und Wedel eines Baumes effizient zu handhaben. Es ist eine zusätzliche Funktion für Skelett- und statische Meshs und ermöglicht die „Mikro-Instanziierung“ kleiner, hochdetaillierter Teile.
Nanite-Zusammensetzungen sind ein wichtiger Teil der Rendering Pipeline von Nanite-Vegetation. Ohne sie gäbe es nicht genug Festplatten- oder Streaming-Speicher, um diese riesigen Wälder zu rendern, wie der aus der technischen Demo von Unreal Fest The Witcher 4.
In der obigen Szene der Demonstration ändert sich der Festplattenspeicher für den größten Baum von 3,5 Gigabyte (Gb) auf etwa 29 Megabyte (Mb). Der Streaming-Speicher nur eines der Bäume in einer bestimmten Ansicht wurde von etwa 36 Mb auf etwa 2,7 Mb verringert. Durch diese Art des Speicherns ist es möglich, 500.000 Instanzen von Dutzenden von Baumvarianten in einer Szene zu rendern, wobei jeder Baum extrem detailliert ist und jeweils zwischen einer und zehn Millionen Polygonen aufweist.
So funktionieren Nanite-Zusammensetzungen
Nanite-Zusammensetzungen sind eine Sammlung von Teile-Meshs, aus denen Nanite-Vegetation zusammengestellt wird. Es handelt sich dabei um hochdetaillierte Meshs, die über ein einzelnes Vegetationsteil instanziiert werden. Diese Instanzen transformieren ihre Position, Drehung und Skalierung innerhalb des lokalen Raums der Zusammensetzung. Du kannst diese Teile mit einem nicht-instanziierten Basis-Mesh, etwa einem Baumstamm, kombinieren, um eine vollständiges Vegetationsteil zu erstellen.
Bei Skelett-Meshs können diese Teile mit einem oder mehr Bones verbunden sein und individuelle Gewichtungen haben, um Deformation zu verarbeiten. So kannst du detaillierte animierte Vegetation erstellen, die korrekt auf Skelett-Animation reagiert, etwa auf dynamischen Wind.
Zur Laufzeit handhabt Nanite den Detaillierungsgrad (LOD) der Zusammensetzung dynamisch. Das bedeutet, dass die einzelnen Teile einer Zusammensetzung aus geringer Entfernung zur Kamera als ihre Nanite-Instanzen gerendert werden und alle geometrischen Details erhalten bleiben. Wenn die Objekte auf dem Bildschirm kleiner werden, werden diese Teile vereinfacht, sodass das Rendering-System von Nanite die Komplexität intelligent reduziert, bis die gesamte Zusammensetzung durch einen einzigen, vereinfachten Cluster dargestellt wird. Dadurch wird die optimale Performance gewährleistet.
Nanite-Zusammensetzungen und Standard-Instanziierung
Für die Standard-Instanziierung musst du einige Dinge bedenken: der Speicher-Overhead und die Entfernungen, über die diese gerendert werden.
Die Standard-Instanziierung hat einen erheblichen Speicher-Overhead in den GPU-Szenenpuffern für die Instanziierung, die für große, ausgedehnte Wälder nötig ist. Damit verbunden ist das Rendering dieser Instanzen auf nahe und große Entfernungen, wobei für jede sichtbare Instanz mindestens ein Stammcluster gezeichnet werden muss. Tausende Zweige von tausenden Bäumen zu instanziieren würde selbst in den einfachsten Situationen bedeuten, Millionen von Clustern zu rastern, um einen hohen Detaillierungsgrad zu erreichen.
In beiden Fällen können Nanite-Zusammensetzungen dies in Bezug auf Performance und visuelle Wiedergabetreue viel besser bewältigen. Zusammensetzungen haben eine viel geringere Gewichtung pro Instanz, da es sich bei ihnen einfach um ein großes Matrizen-Array handelt. Der Kompromiss bei der Performance bedeutet, dass du einige Dinge mit Nanite-Zusammensetzungsteilen nicht tun kannst, die du in einem Diagramm mit instanzspezifischen Daten tun kannst. Dies bedeutet jedoch, dass Stammcluster von Zusammensetzungsteilen zur Erstellungszeit kombiniert werden, um die Level mit der niedrigsten Auflösung der Zusammensetzung zu erstellen, sodass Zusammensetzungen über große Entfernungen bis hin zu einem einzigen Cluster vereinfacht werden, was ähnlich wie die Verwendung eines eigenen hierarchischen Detaillierungsgrads (HLOD) ist.
Bei größeren Entfernungen werden diese vereinfachten Ebenen der einzelnen Teil-Instanzen zusammengeführt und ihre Geometrie wird als Teil des Basis-Mesh behandelt. Die Teile verlieren ihre Identität als Instanz. Aus diesem Grund werden Pro-Instanz-Daten in Material-Diagrammen für Zusammensetzungsteile nicht freigegeben.
Beispiel für ein Nanite-Zusammensetzung-Skelett-Mesh
Das folgende Beispiel zeigt, wie die Dreiecke des Basis-Mesh des Skelett-Zusammensetzung-Baums – der Stamm und die großen Äste – zusammen mit Referenzen zu den Zusammensetzung-Teile-Meshs – Zweigen, die mit den Ästen verbunden sind – im Asset selbst gespeichert sind. Diese Zweige sind einfach andere, kleine Skelett-Mesh-Assets, die du im Inhaltsordner findest.
Bei Skelett-Mesh-Zusammensetzungen ist jede Teil-Instanz an einen oder mehrere Bones auf dem Skelett des Basis-Mesh gebunden, damit ihr Drehpunkt mit dem Basis-Mesh animiert wird.
Derzeit sind die Scheitelpunkte von Skelett-Zusammensetzungsteilen nicht geskinnt, sie werden also nur in ihrer Bindungspose starr animiert.
Erstellen von Nanite-Zusammensetzungen
Unreal Engine beinhaltet einige experimentelle Plugins, mit denen du Nanite-Zusammensetzungen erstellen kannst, indem du diese importierst oder im Editor erstellst. Diese Plugins sind:
| Plugin-Name | Beschreibung | |
|---|---|---|
Nanite Assembly Editor Utilities | Dies wird verwendet, um eine Nanite-Zusammensetzung aus Blueprint zu erstellen. Es gibt für den Editor-Blueprint Funktionalität frei, um statische und Skelett-Zusammensetzungen zu erstellen. | |
Procedural Content Generation Framework (PCG) Nanite Assemblies Interop | Dies wird verwendet, um eine Nanite-Zusammensetzung aus einem PCG-Diagramm für Statische-Mesh-Nanite-Zusammensetzungen zu erstellen. | |
Procedural Vegetation Editor | Dies ist ein diagrammbasierter Editor, mit dem hochwertige, Nanite-fähige Vegetation direkt im Editor erstellt werden kann. Es wendet botanische Grundsätze aus der echten Welt an, die natürliche Wachstumsmuster mit Anpassung und Variationen für verschiedene Vegetationsarten replizieren. | |
USD Importer | Du kannst Nanite-Zusammensetzungen direkt aus einer USD-Datei importieren. Schemata zum Erstellen von Zusammensetzungen sind im Plugin USD Core enthalten. |
Importieren von Nanite-Zusammensetzungen mit USD
Mit dem Plugin USD Importer in Unreal Engine kannst du Nanite-Zusammensetzungen aus einer USD-Datei importieren. Die relevanten Schemata zum Erstellen von Zusammensetzung sind im Plugin USD Core enthalten. Diese umfassen NaniteAssemblyRootAPI, NaniteAssemblyExternalRefAPI und NaniteAssemblySkelBindingAPI.
Weitere Informationen zur Verwendung dieser Schemata findest du in der entsprechenden Dokumentation im Quellcode.
Verwenden von Nanite Assembly Editor Utilities für die Erstellung im Editor
Im Editor kannst du Zusammensetzungen mit dem Plugin Nanite Assembly Editor Utilities erstellen. Dieses Plugin macht UNaniteAssemblyStaticMeshBuilder und UNaniteAssemblySkeletalMeshBuilder für Blueprints verfügbar und bietet eine mächtig Methode zur Erstellung von Baugruppen aus bestehenden Assets.
Das Plugin enthält auch gescriptete Level-Editor-Aktionen für folgende Situationen:
Erstelle eine Statisches-Mesh-Zusammensetzung aus einer Auswahl statischer Meshs im Level-Editor.
Erstelle eine Skelett-Mesh-Zusammensetzung aus einem Skelett-Mesh-Actor und allen daran angehängten Skelett-Mesh-Zusammensetzungen.
Verwenden von Procedural Vegetation Editor für die Erstellung im Editor
Procedural Vegetation Editor (PVE) ist ein mächtiges, diagrammbasiertes Werkzeug, das in Unreal Engine und dem Framework Procedural Content Generation (PCG) integriert ist. Damit können Nutzer direkt im Editor hochwertige, Nanite-fähige Vegetations-Assets erstellen. PVE nutzt die botanischen Grundsätze der echten Welt und simuliert die Generierung von Pflanzen basierend auf der Hormonverteilung und der adaptiven Reaktionen.
Weitere Informationen zu diesem Werkzeug und seiner Verwendung findest du unter Procedural Vegetation Editor.
Bekannte Einschränkungen
Dies sind einige aktuelle Einschränkungen, die du beachten solltest:
Du kannst keine Zusammensetzungen anderer Zusammensetzungen erstellen. Das System unterstützt derzeit eine einzige Ebene der Instanziierung.
Geometrie wird nicht zwischen Zusammensetzungen dupliziert, die dieselben Teil-Meshs referenzieren. Jede Zusammensetzung speichert ihre eigene Kopie der Teildaten.
Bei Skelett-Meshs kannst du keine einzelnen Teile posieren – diese werden nur in ihrer Binden-Pose gerendert.
Zukünftige Updates werden Unterstützung für die Instanziierung der Animation für einzelne Teile bieten.