Zum Inhalt springen
FSMW

Texturen je Editor

Unreal Engine: PBR-Texturen und ORM richtig importieren

Unreal Engine liest Metallic, Roughness und AO aus einer einzigen ORM-Textur (Rot AO, Grün Roughness, Blau Metallic) – exakt die Kanalreihenfolge unserer ARM-Datei – und erwartet Normal Maps in DirectX-Konvention, weshalb unsere OpenGL-Dateien beim Import den Schalter Flip Green Channel brauchen.

Version
Unreal Engine 5.7 (aktuelle Vollversion)
Import-Framework
Interchange, aktueller Import-Weg für FBX und glTF
Unsere ARM-Datei
identische Kanalreihenfolge wie Unreal-ORM (R AO, G Roughness, B Metallic)
Dauer
etwa 20 Minuten

ORM statt Einzeltexturen

Unreal Engine baut seinen Standard-Materialworkflow um eine gepackte Textur herum: die ORM-Textur (Occlusion, Roughness, Metallic). Statt drei separate Graustufenbilder zu laden, liest das Material eine einzige RGB-Datei und verteilt die Kanäle auf drei Material-Eingänge. Für FS-Modworks-Kunden ist das gute Nachricht, denn unsere _arm-Datei folgt exakt diesem Schema: Rot Ambient Occlusion, Grün Roughness, Blau Metallic. Wo andere Anbieter erst umsortieren müssen, zieht man unsere Datei einfach in den ORM-Slot.

Die Antwort hat mit einer Konvention zu tun, die zwischen 3D-Programmen unterschiedlich gehandhabt wird – dazu gleich mehr. Der Rest dieser Anleitung geht Schritt für Schritt durch Import, Kompression, Material-Aufbau und die zwei Fälle, in denen unsere Modelle zusätzlich Displacement bekommen.

Alle unsere Texturpakete – egal ob Cracked Concrete 01, Oak Planks 01, Rusty Corrugated Metal 01, Cobblestone 01 oder Corrugated Metal 01 – liefern dieselben sechs Karten in 2K, 4K und 8K. Für Unreal sind davon vor allem drei Dateien direkt relevant: _diff für die Basisfarbe, _arm für den ORM-Slot und _nor_gl für die Normal Map. _rough, _ao und _disp liegen zusätzlich einzeln bei, falls du sie für ein individuelles Material-Setup statt der gepackten ARM-Datei brauchst, etwa um Roughness nachträglich per Kurven-Node zu justieren.

Schritt 1: Texturen importieren und Compression Settings setzen

Beim Import einer Textur nach Unreal legst du im Details-Panel des Textur-Assets die Compression Settings fest. Laut Epic-Dokumentation gibt es dafür passende Presets statt einer manuellen Kanal-Konfiguration:

Datei Compression Setting sRGB
_diff (Diffuse/Basecolor) Default An
_nor_gl (Normal Map) Normalmap Aus
_arm als ORM, _rough, _ao Masks Aus

Default komprimiert mit sRGB-Unterstützung für Farbtexturen. Normalmap trägt in der Engine den vollen Namen „Normalmap (DXT5, BC5 on DX11)" und ist auf die Bedürfnisse von Richtungsdaten zugeschnitten. Masks heißt in der Engine „Masks (no sRGB)" und eignet sich für alle Texturen, die als Eingabemasken dienen und keine Farbinformation tragen – also unsere ORM/ARM-Datei, aber auch die einzelnen Roughness- und AO-Dateien, falls du sie separat statt gepackt verwenden willst.

Der Unterschied zwischen beiden Presets liegt am komprimierten Datenformat selbst: Laut Epic-Dokumentation nutzt Normalmap intern BC5, ein Format, das nur zwei Kanäle mit hoher Präzision speichert – genau richtig für eine Normal Map, die ohnehin nur Rot und Grün für die Richtungsdaten benötigt. Masks setzt dagegen auf DXT1 oder DXT5 mit voller Kanalzahl, damit Ambient Occlusion, Roughness und Metallic nebeneinander in einer Textur erhalten bleiben, ohne dass ein Kanal durch die Kompression verfälscht wird. Wer versehentlich Default für eine ORM-Textur wählt, riskiert nicht nur eine falsche Gammakorrektur durch das aktive sRGB, sondern auch ein Kompressionsformat, das nicht für Maskendaten gedacht ist.

Warum ORM weniger Speicher braucht als Einzeltexturen

Der Vorteil des ORM-Formats zeigt sich am deutlichsten bei Materialien mit vielen Flächen, etwa einer ganzen Häuserzeile mit unserer Corrugated-Metal- oder Cobblestone-Textur. Statt drei einzelne Graustufen-Texturen zu laden – eine für Ambient Occlusion, eine für Roughness, eine für Metallic – liest die GPU nur eine einzige RGB-Datei und entnimmt ihr alle drei Werte in einem einzigen Textur-Sample. Das spart sowohl Speicher auf der Festplatte als auch Bandbreite beim Rendern, weil weniger Texture-Fetches pro Pixel nötig sind.

Gerade bei unserer Rusty Corrugated Metal 01 und der Corrugated Metal 01, die beide einen sichtbaren Metallic-Anteil in der _arm-Datei tragen, macht sich das bemerkbar: Ein Material mit drei Einzeltexturen für AO, Roughness und Metallic braucht dreimal so viele Texture-Samples wie eines mit unserer gepackten ARM-Datei im ORM-Slot, bei identischem visuellen Ergebnis.

Schritt 2: Normal Map und der Grünkanal

Hier liegt der Punkt, an dem die meisten unserer Kunden zuerst stolpern. 3D-Programme legen Normal Maps in zwei Konventionen an, die sich nur im Vorzeichen des Grünkanals unterscheiden: OpenGL und DirectX. Unsere _nor_gl-Dateien sind, wie der Dateiname sagt, in OpenGL-Konvention gerendert. Unreal Engine arbeitet nach der DirectX-Konvention (invertierter Grünkanal) – dafür gibt es im Textur-Editor die Option Flip Green Channel, die laut Epic-Dokumentation den Grünkanal einer Textur invertiert und ausdrücklich für Normal Maps gedacht ist.

Der Unterschied zeigt sich nicht als Fehlermeldung, sondern als Beleuchtungsfehler: Vertiefungen wirken erhaben, Kanten werfen Licht in die falsche Richtung. Die Korrektur ist der eine Schalter im Textur-Editor: Flip Green Channel. Aktivierst du ihn für unsere _nor_gl-Datei, invertiert Unreal den Grünkanal beim Sampling, ohne dass du die Quelldatei anfassen musst. Wie Normal Maps grundsätzlich funktionieren und woran sich die beiden Konventionen optisch unterscheiden, steht ausführlicher in der Normal-Map-Anleitung.

Unreal-Engine-5-Textur-Editor mit aktivierter Option Flip Green Channel für eine Normal MapKI-generiert
Unreal-Engine-5-Textur-Editor mit aktivierter Option Flip Green Channel für eine Normal Map KI-generierte Darstellung, die echte Oberfläche kann abweichen.

Schritt 3: Material-Grundaufbau

Ein einfaches Material für eine unserer Texturen besteht aus wenigen Knoten:

  1. Texture Sample mit _diff → Base Color
  2. Texture Sample mit der ORM-Datei (unsere _arm) → über einen Kanal-Split-Knoten (zum Beispiel Component Mask) auf Ambient Occlusion (Rot), Roughness (Grün) und Metallic (Blau) verteilt
  3. Texture Sample mit _nor_gl, Flip Green Channel aktiviert → Normal

Der Kanal-Split-Knoten trennt die drei Werte aus einer einzigen Textur-Abfrage, wodurch Unreal die Datei nur einmal aus dem Speicher laden muss statt dreimal. Genau dafür ist das ORM-Format gedacht.

Material Instances für mehrere Flächen

Sobald dieselbe Textur auf mehreren Objekten unterschiedlicher Größe landet, lohnt sich der Umweg über eine Material Instance statt das Basis-Material direkt zu verwenden. Du baust den Knoten-Aufbau aus Schritt 3 einmal als Parent-Material, wandelst UTiling, VTiling und gegebenenfalls die Normal-Map-Intensität in Parameter um, und erstellst daraus für jede Fläche eine eigene Instanz. Der Vorteil: Eine Material Instance ändert nur Parameterwerte, ohne dass Unreal das Material neu kompilieren muss – bei mehreren Dutzend Flächen mit unseren Texturen macht das einen spürbaren Unterschied im Editor-Workflow.

Schritt 4: Tiling über TexCoord steuern

Damit unsere Texturen im richtigen Kachelmaß auf einer Fläche erscheinen, brauchst du einen TextureCoordinate-Knoten (im Material-Graph meist als „TexCoord[0]" beschriftet) zwischen den UV-Daten des Meshs und den Texture-Sample-Knoten. Der Knoten bringt laut Epic-Dokumentation die Eingänge UTiling und VTiling mit, über die sich die Wiederholungsrate unabhängig vom Mesh einstellen lässt. Ein höherer Tiling-Wert wiederholt die Textur öfter auf derselben Fläche, ein niedrigerer streckt sie.

Unreal-Material-Graph: TextureCoordinate-Node mit UTiling und VTiling auf 4,0, verbunden mit dem Texture SampleKI-generiert
Unreal-Material-Graph: TextureCoordinate-Node mit UTiling und VTiling auf 4,0, verbunden mit dem Texture Sample KI-generierte Darstellung, die echte Oberfläche kann abweichen.

Praktisch macht man aus UTiling und VTiling Scalar Parameter, die sich später pro Material-Instanz ohne neuen Compile anpassen lassen – sinnvoll, wenn du dieselbe Textur auf unterschiedlich große Flächen legst.

Schritt 5: Displacement mit Nanite Tessellation

Unsere _disp-Datei liefert eine Höhenkarte. Echtes Displacement, also zusätzliche Geometrie statt nur simulierter Tiefe, gibt es in aktuellen UE5-Versionen über Nanite Tessellation. Laut Epic-Dokumentation handelt es sich um dynamische, programmierbare Verschiebung, die ein Nanite-Mesh zur Laufzeit anhand einer Displacement-Map oder eines prozeduralen Materials zusätzlich vertesselt.

Voraussetzung ist ein Nanite-aktiviertes Mesh. Aktiviert wird die Funktion nicht direkt im Material, sondern über die Projekteinstellungen: Laut Epic-Dokumentation gehört r.Nanite.AllowTessellation=1 in die ConsoleVariables.ini oder eine Projekt-Konfigurationsdatei (das lässt sich nicht zur Laufzeit umschalten), zusätzlich schaltest du mit r.Nanite.Tessellation=1 die Funktion ein. Erst danach lässt sich am Material eine Tessellations-Option aktivieren, die einen Displacement-Eingang für unsere _disp-Textur freigibt. Die Funktion gilt weiterhin als experimentell.

Schritt 6: Modelle importieren

Unsere 3D-Modell-Pakete liegen als FBX und als glTF vor. Der Import beider Formate läuft über das Interchange-Framework, Unreals aktuelles Import- und Exportsystem. Laut Epic-Dokumentation ist es dateiformat-unabhängig, asynchron und ersetzt den alten, dateiformat-spezifischen FBX-Importer. Beim Import zeigt Unreal ein Pipeline-Dialogfenster, in dem sich Textur- und Material-Optionen direkt einstellen lassen, bevor die erste Datei überhaupt im Projekt landet.

Der Import-Dialog gliedert sich laut Dokumentation in zwei Bereiche: Die Translator Settings lesen die Quelldatei ein und übersetzen ihren Inhalt in ein internes Zwischenformat, die Pipeline Settings entscheiden anschließend, wie daraus Unreal-Assets werden – also ob Materialien automatisch erzeugt, Texturen automatisch verknüpft und Kollisionsdaten übernommen werden. Für unsere FBX-Pakete reicht in der Regel eine einzige Pipeline; beim glTF-Import zeigt Unreal je nach Dateiinhalt mehrere Pipelines gestapelt an, etwa für Meshes und Materialien getrennt. Drei Optionen steuern die Ansicht laut Dokumentation: Basic Layout grenzt die Optionsliste auf die wichtigsten Einstellungen ein, Filter on Contents blendet nur die Optionen ein, die zur tatsächlich importierten Datei passen, und Choose Pipeline Stack legt fest, welcher Pipeline-Stack für den Import verwendet wird.

Mehr zu unseren Dateiformaten und wann welches sinnvoll ist, steht in unserer separaten Übersicht zu FBX, glTF und den anderen Formaten, die wir zu jedem 3D-Modell-Paket mitliefern.

Für den Einsatz im LS25 (Landwirtschafts-Simulator 25) ist Unreal Engine nicht der richtige Weg – dort läuft der Import über den GIANTS Editor mit eigenem DDS-Format und eigener Spekular-Karte, nicht über ORM-Texturen. Wer beide Wege parallel pflegt, sollte die beiden Texturvarianten sauber trennen: die ORM-Datei für Unreal-Projekte, die DDS-Konvertierung für LS25-Mods, jeweils aus derselben _arm- beziehungsweise _specular-Quelle erzeugt.

Läuft ein Projekt parallel auch über Unity, lohnt sich der Vergleich: Beide Engines erwarten Kanal-Packing, aber mit unterschiedlicher Reihenfolge – die ORM/ARM-Anleitung stellt beide Standards nebeneinander, und die Displacement-Anleitung geht näher auf Höhenkarten in verschiedenen Engines ein.

Häufige Fehler

Problem Ursache Lösung
Beleuchtung wirkt invertiert, Vertiefungen sehen erhaben aus Normal Map in OpenGL-Konvention ohne Flip Green Channel importiert Flip Green Channel in den Textur-Einstellungen aktivieren
ORM-Textur liefert im Material falsche Werte Compression Setting auf Default statt Masks, sRGB aktiv Compression Setting auf Masks stellen, sRGB deaktivieren
Displacement-Eingang fehlt im Material Nanite Tessellation nicht über die Projekteinstellungen aktiviert r.Nanite.AllowTessellation=1 (in der Config) und r.Nanite.Tessellation=1 setzen, danach Tessellation am Material aktivieren
Textur wiederholt sich verzerrt oder in falscher Größe TexCoord-Knoten fehlt oder UTiling/VTiling nicht gesetzt TextureCoordinate-Knoten einfügen, UTiling/VTiling passend zum Kachelmaß setzen
FBX-Import bricht mit Metadaten-Fehler ab Alter Legacy-FBX-Importer statt Interchange aktiv Import über das Interchange-Framework laufen lassen

Häufige Fragen

Kann ich unsere ARM-Textur direkt als ORM-Textur verwenden?

Ja. Unsere ARM-Datei liegt in Rot AO, Grün Roughness, Blau Metallic vor – das ist exakt die Reihenfolge, die Unreal für eine ORM-Textur erwartet. Kein Umbau nötig.

Warum sieht unsere Normal Map in Unreal invertiert aus?

Unsere Dateien nutzen die OpenGL-Konvention, Unreal erwartet DirectX. In den Textur-Einstellungen aktivierst du dafür Flip Green Channel, danach stimmt die Beleuchtung.

Welche Compression Settings brauchen unsere Texturen?

Diffuse-Texturen laufen mit Default (mit sRGB), die Normal Map mit Normalmap (ohne sRGB), und ORM/ARM- sowie Roughness- und AO-Dateien mit Masks (ebenfalls ohne sRGB).

Funktioniert Displacement mit unseren Höhenkarten in UE5?

Nur mit Nanite Tessellation, einer weiterhin experimentellen Funktion. Sie braucht ein Nanite-Mesh, wird über die Projekteinstellungen freigeschaltet (Konsolenvariablen r.Nanite.AllowTessellation und r.Nanite.Tessellation) und liest die Höhenwerte anschließend aus unserer _disp-Datei.