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.
KI-generiertGodot 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.
KI-generiertGIANTS 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.
KI-generiertHä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.