Zum Inhalt springen
FSMW

PBR-Wissen

ORM- und ARM-Texturen: Kanal-Packen für jede Engine

ARM- und ORM-Texturen packen Ambient Occlusion, Roughness und Metallic in die drei Farbkanäle einer Datei (R=AO, G=Rough, B=Metal). Unreal Engine und Godot lesen dieses Format direkt, Unity und GIANTS/LS25 brauchen einen Kanal-Umbau.

Unsere Reihenfolge
ARM/ORM: R = AO, G = Roughness, B = Metallic
Direkt kompatibel
Unreal Engine (ORM-Maske), Godot (ORMMaterial3D)
Braucht Umbau
Unity URP/HDRP, GIANTS/LS25 (Spekular-Karte)
Getestet
GIANTS Editor 10.0.13 mit LS25, eigene Messung 05.09.2026

Warum überhaupt packen?

Ambient Occlusion, Roughness und Metallic sind allesamt reine Graustufenkarten – jede von ihnen speichert nur einen Zahlenwert pro Pixel, keine Farbe. Drei einzelne Graustufendateien verschwenden aber zwei Drittel des verfügbaren Speicherplatzes, denn ein RGB-Bild trägt ohnehin drei Kanäle, ob man sie nutzt oder nicht. Legt man stattdessen jede Graustufenkarte in einen eigenen Farbkanal derselben Datei, braucht die Engine nur eine Textur statt drei, spart Speicher auf der Festplatte und im Grafikspeicher und muss beim Rendern nur einen Texturzugriff statt drei durchführen. Bei vielen Materialien in einer Szene – und LS25-Karten bestehen leicht aus hunderten Objekten mit eigenen Texturen – macht das einen spürbaren Unterschied für Ladezeit und Bildrate.

Der Nachteil dieser Technik zeigt sich erst beim Wechsel der Software: Jede Engine hat sich für eine eigene Kanalreihenfolge entschieden, und keine davon ist zwingend "die richtige". Wer eine gepackte Textur zwischen Programmen verschiebt, muss deshalb zuerst prüfen, welche Reihenfolge das Ziel erwartet – genau das ist der Kern dieser Anleitung.

Unsere Kanalbelegung

Unsere _arm-Dateien packen die drei Karten so:

Kanal Inhalt
Rot (R) Ambient Occlusion
Grün (G) Roughness
Blau (B) Metallic

Diese Reihenfolge ist keine Erfindung von uns, sondern die in der Branche verbreitetste ORM-Belegung – dieselbe Reihenfolge, die auch Substance Painters Unreal-Engine-Exportvoreinstellung erzeugt und die Godots ORM-Material erwartet. Warum ausgerechnet AO in Rot liegt und nicht etwa Metallic, lässt sich nicht mit einer einzelnen Regel begründen; es hat sich in der Praxis so eingebürgert, weil frühe Unreal-Workflows genau diese Zuordnung populär gemacht haben. Für uns zählt vor allem, dass eine einzige Reihenfolge über alle fünf Texturen hinweg gilt – wer einmal weiß, wie unsere _arm-Datei aufgebaut ist, muss es nicht für jede Textur neu nachschlagen.

Welche Engine will was

Engine / Ziel Texturtyp R G B A Direkt nutzbar?
Unreal Engine ORM-Maskentextur AO Roughness Metallic – Ja, unsere _arm passt direkt
Godot (ORMMaterial3D) ORM-Textur Occlusion Roughness Metallic – Ja, unsere _arm passt direkt
Unity URP (Lit-Shader) Metallic Map Metallic (Graustufe) – – Smoothness (Standardquelle) Nein, eigene Karte nötig
Unity HDRP (Lit-Shader) Mask Map Metallic Ambient Occlusion Detail-Maske Smoothness Nein, Umbau nötig (Skript unten)
GIANTS Editor / LS25 Spekular-Karte (_specular) Glanz = 255 − Roughness Ambient Occlusion Metallic 255 Nein, eigenes Format (Formel unten)

Für Unreal Engine gilt zusätzlich: Die gepackte Maskentextur muss beim Import mit deaktiviertem sRGB laufen, in der Unreal-Dokumentation als Kompressionseinstellung "Masks (no sRGB)" bezeichnet – genau wie jede andere Datenkarte darf sie keine Gammakorrektur bekommen, sonst verschieben sich AO-, Roughness- und Metallic-Werte gegeneinander.

Vergleichsgrafik der Kanalbelegung von ORM/ARM-Texturen in Unreal Engine, Godot, Unity HDRP und der GIANTS-Spekular-Karte.KI-generiert
Vergleichsgrafik der Kanalbelegung von ORM/ARM-Texturen in Unreal Engine, Godot, Unity HDRP und der GIANTS-Spekular-Karte. KI-generierte Darstellung, die echte Oberfläche kann abweichen.

Godot und Unreal: direkt verwendbar

Weil Godots ORMMaterial3D laut eigener Dokumentation eine einzelne Textur für Occlusion, Roughness und Metallic verwendet und dabei dieselbe Kanalreihenfolge nutzt, die auch Substance Painters Unreal-Exportvoreinstellung erzeugt, lässt sich unsere _arm-Datei ohne Umbau direkt als ORM-Textur laden – in beiden Engines. Das ist der einfachste Fall dieser Anleitung: keine Konvertierung, kein Skript, nur die Datei zuweisen.

In der Godot-Anleitung steht, wie man ein ORMMaterial3D-Material statt des Standardmaterials auswählt, damit die Engine die gepackte Textur überhaupt als ORM erkennt – wählt man versehentlich das Standardmaterial, erwartet Godot drei getrennte Karten und ignoriert die gepackte Datei. Für Unreal Engine zeigt die Unreal-Engine-Anleitung, wie die ORM-Textur im Material-Editor an Roughness, Metallic und den Ambient-Occlusion-Eingang der Basisfarbe angeschlossen wird.

Unity: zwei verschiedene Baustellen

Unity hat kein einheitliches Konzept, sondern zwei unterschiedliche Layouts, je nach Render Pipeline. Im Universal Render Pipeline (URP) erwartet der Lit-Shader eine eigene Metallic-Karte; die Smoothness kommt dabei laut Unity-Dokumentation standardmäßig aus dem Alphakanal genau dieser Metallic-Karte, alternativ lässt sie sich auf den Alphakanal der Basisfarbe umstellen. Im High Definition Render Pipeline (HDRP) gibt es stattdessen die sogenannte Mask Map: Rot trägt Metallic, Grün Ambient Occlusion, Blau eine optionale Detail-Maske und Alpha die Smoothness – eine völlig andere Kanalreihenfolge als unsere ARM-Textur, und mit vertauschter Bedeutung von AO und Metallic.

Welche der beiden Render Pipelines ein Projekt verwendet, entscheidet, welchen Weg man geht. Die Unity-Anleitung beschreibt beide Fälle: für URP das Anlegen einer separaten Smoothness-Alpha-Karte, für HDRP den Import der unten erzeugten Mask Map.

Umpack-Skript: ARM → Unity HDRP Mask Map

Das folgende Python-Skript mit Pillow baut aus einer unserer _arm-Dateien eine passende HDRP Mask Map. Es liest AO aus Rot, Roughness aus Grün und Metallic aus Blau unserer ARM-Textur und schreibt sie in der von Unity erwarteten Reihenfolge neu, inklusive der Umrechnung von Roughness zu Smoothness:

from PIL import Image, ImageChops

def arm_to_hdrp_mask_map(arm_path, out_path, detail_mask_value=128):
    """Rechnet eine FSMW-ARM-Textur (R=AO, G=Rough, B=Metal)
    in eine Unity-HDRP-Mask-Map um (R=Metal, G=AO, B=Detail, A=Smoothness)."""
    arm = Image.open(arm_path).convert("RGB")
    ao, rough, metal = arm.split()
    smoothness = ImageChops.invert(rough)          # Smoothness = 255 - Roughness
    detail = Image.new("L", arm.size, detail_mask_value)  # 128 = neutral, keine Detailkarte
    mask_map = Image.merge("RGBA", (metal, ao, detail, smoothness))
    mask_map.save(out_path)

arm_to_hdrp_mask_map("FSMW_cracked_concrete_01_arm_4k.jpg", "cracked_concrete_01_maskmap_4k.png")

Der Detail-Kanal bleibt bei uns neutral grau (Wert 128), weil unsere Texturpakete keine eigene Detailkarte mitliefern – die Unity-Dokumentation nennt 0,5 ausdrücklich als erwarteten Standardwert für jeden der vier Kanäle der Mask Map. Beim Import in Unity muss die erzeugte Datei wie jede andere Maskentextur mit deaktiviertem sRGB geladen werden.

Schema des Umpack-Vorgangs von einer ARM-Textur zu einer Unity-HDRP-Mask-Map mit vertauschten und invertierten Kanälen.KI-generiert
Schema des Umpack-Vorgangs von einer ARM-Textur zu einer Unity-HDRP-Mask-Map mit vertauschten und invertierten Kanälen. KI-generierte Darstellung, die echte Oberfläche kann abweichen.

GIANTS Editor und LS25: eigenes Format, eigene Messung

Für den Landwirtschafts-Simulator 25 verwendet GIANTS keine ARM- oder ORM-Textur, sondern eine Spekular-Karte mit eigener Bedeutung je Kanal. An der Basisspiel-Datei default_specular.dds (RGBA 0/255/0/255) gemessen, gilt: Rot trägt den Glanzwert (invertierte Roughness, also 255 minus Roughness), Grün die Ambient Occlusion, Blau die Metallic-Information, Alpha bleibt konstant bei 255. Damit lässt sich unsere ARM-Textur direkt umrechnen:

R_spec = 255 − G_arm   (Glanz = invertierte Roughness)
G_spec = R_arm         (Ambient Occlusion bleibt im gleichen Kanal-Slot)
B_spec = B_arm         (Metallic bleibt im gleichen Kanal-Slot)
A_spec = 255

Diese Formel ist keine Vermutung, sondern das Ergebnis eines eigenen Fehlers: Unser erstes Rezept schrieb einen ungefähren Spekularfarbwert in Rot/Grün/Blau und die Smoothness in Alpha. Dabei landete in Grün ein Wert um 30 statt der Ambient Occlusion – im Spiel wirkten unsere Modelle dadurch fast schwarz. Erst nach dem Umbau auf die obige Zuordnung stimmten Helligkeit und Glanz mit dem Basisspiel überein.

Die fertige DDS-Datei erzeugen wir anschließend mit dem GIANTS Texture Tool (tools/textureTool.exe, Teil des GIANTS Editor 10.0.13): Diffuse als BC1 im sRGB-Farbraum, Normal als BC5 im linearen Farbraum, Spekular als BC3 ebenfalls linear, Mipmaps jeweils auf Maximum. Wie man die fertigen DDS-Dateien anschließend einem Material im GIANTS Editor zuweist, steht in der Anleitung zu Texturen im GIANTS Editor.

Aufschlüsselung der GIANTS-Spekular-Karte nach Kanälen mit Vergleich eines falsch und eines richtig berechneten Modells.KI-generiert
Aufschlüsselung der GIANTS-Spekular-Karte nach Kanälen mit Vergleich eines falsch und eines richtig berechneten Modells. KI-generierte Darstellung, die echte Oberfläche kann abweichen.

Häufige Fehler

Problem Ursache Lösung
Modelle wirken im LS25 fast schwarz Ambient Occlusion und Glanzwert in der Spekular-Karte vertauscht oder falsch berechnet Kanalreihenfolge R=Glanz, G=AO, B=Metallic prüfen, siehe Formel oben
Unreal-Material zeigt falsche Rauheit oder falschen Glanz ORM-Textur beim Import mit aktiviertem sRGB geladen Kompressionseinstellung auf "Masks (no sRGB)" setzen
Unity-HDRP-Material wirkt komplett stumpf oder komplett glänzend ARM-Textur unverändert als Mask Map verwendet, Kanäle stimmen nicht überein Mit dem Umpack-Skript in eine echte HDRP Mask Map umrechnen
Godot-Material zeigt keinen Metallglanz ORM-Textur im falschen Materialtyp verwendet (StandardMaterial3D statt ORMMaterial3D) Materialtyp auf ORMMaterial3D umstellen, siehe Godot-Dokumentation

Häufige Fragen

Was bedeutet ARM beziehungsweise ORM?

Beide Kürzel stehen für dieselben drei Graustufenkarten, nur in unterschiedlicher Buchstabenreihenfolge benannt: Ambient Occlusion, Roughness und Metallic, gepackt in Rot, Grün und Blau einer einzigen Textur.

Ist eine ARM-Textur dasselbe wie eine ORM-Textur?

Ja, wenn beide dieselbe Kanalreihenfolge verwenden – bei uns und in der Praxis der meisten Engines liegt AO in Rot, Roughness in Grün und Metallic in Blau. Der Name unterscheidet sich, die Datei nicht.

Kann ich unsere ARM-Textur direkt in Unity verwenden?

Nicht ohne Umbau. Unitys Standard- und URP-Shader erwarten Metallic und Smoothness in einer eigenen Karte, HDRP erwartet eine Mask Map mit anderer Kanalreihenfolge. Das Umpack-Skript weiter unten erledigt das für HDRP.

Warum ist die Spekular-Karte im LS25 anders aufgebaut als unsere ARM-Textur?

GIANTS nutzt für LS25 eine Spekular-Karte mit eigener Kanalbelegung und invertiertem Glanzwert statt Roughness. Das ist keine Variante von ARM/ORM, sondern ein eigenes Format – siehe Umrechnungsformel weiter unten.

Was macht der Alpha-Kanal in Unitys HDRP Mask Map?

Er speichert die Smoothness, also den Kehrwert der Roughness. Der blaue Kanal ist bei HDRP keine Metallic-Information, sondern eine optionale Detail-Maske.