Zum Inhalt springen
FSMW

Texturen je Editor

Unity: PBR-Texturen für URP und HDRP richtig einbauen

In Unity entscheidet die Render Pipeline über das Kanal-Layout: URP Lit erwartet Metallic in Rot und Occlusion in Grün, HDRP Lit dagegen eine Mask Map mit Metallic in Rot, Ambient Occlusion in Grün und Smoothness in Alpha.

Version
Unity 6.3 LTS (Editor-Reihe 6000.x)
Render Pipelines
Universal RP (URP) und High Definition RP (HDRP)
glTF-Import
über das Paket glTFast (com.unity.cloud.gltfast)
Dauer
etwa 25 Minuten

Warum die Render Pipeline über das Kanal-Layout entscheidet

Ein PBR-Material besteht in Unity nie aus einer festen Anzahl Texturen. Es besteht aus dem, was der jeweilige Shader an Eingängen anbietet, und jede Render Pipeline bringt einen eigenen Standard-Shader mit. Built-in Render Pipeline, Universal Render Pipeline (URP) und High Definition Render Pipeline (HDRP) laufen nebeneinander her, sind aber nicht austauschbar. Ein Material, das in URP gebaut wurde, funktioniert nicht automatisch in HDRP, und umgekehrt genauso wenig.

Für neue Projekte rät Unity zu URP oder HDRP; die Built-in Pipeline gilt als Altlast und wird in offiziellen Dokumenten kaum noch mit eigenen Packing-Regeln beschrieben. Deshalb konzentriert sich diese Anleitung auf URP und HDRP – die beiden Pipelines, in denen unsere Texturpakete (Cracked Concrete 01, Oak Planks 01, Rusty Corrugated Metal 01, Cobblestone 01, Corrugated Metal 01) sauber ankommen, wenn man weiß, wo welcher Wert hingehört.

Die kurze Antwort: Unity liest bei gepackten Texturen feste Kanäle aus dem Shader-Code, nicht aus dem Dateinamen. Steckt Metallic im falschen Kanal, wird eine Betonwand im schlimmsten Fall komplett spiegelnd. Der Rest dieser Anleitung zeigt, wie du unsere Dateien – _diff, _nor_gl, _rough, _ao, _disp, _arm – für URP und für HDRP richtig anschließt.

Schritt 1: Textur-Import-Einstellungen prüfen

Bevor eine Textur in einem Material landet, entscheidet der Import-Inspector, wie Unity die Pixel interpretiert. Für unsere sechs Karten gilt:

Datei Texture Type sRGB (Color Texture)
_diff (Diffuse) Default An
_nor_gl (Normal Map) Normal Map wird automatisch verwaltet
_rough, _ao, _disp Default Aus
_arm (gepackt) Default Aus

Diffuse-Texturen enthalten Farbinformation und brauchen sRGB, damit Unity die Gammakorrektur richtig anwendet. Roughness, AO, Displacement und die gepackte ARM-Datei sind dagegen reine Messwerte – lineare Daten, keine Farbe. Bleibt sRGB dort aktiv, verschiebt Unity die Werte, und die Materialwirkung stimmt nicht mehr mit dem gemessenen Original überein.

Für _nor_gl wählst du im Dropdown Texture Type den Eintrag Normal Map. Unity erkennt daraufhin selbst, dass es sich um Richtungsdaten handelt, und verwaltet Farbraum und Kompression passend. Ein manuelles Invertieren ist nicht nötig, unsere Dateien liegen bereits in der von Unity erwarteten Normal-Map-Form vor.

Unity-Editor Inspector-Fenster mit den Textur-Import-Einstellungen, Texture Type auf Normal Map gestelltKI-generiert
Unity-Editor Inspector-Fenster mit den Textur-Import-Einstellungen, Texture Type auf Normal Map gestellt KI-generierte Darstellung, die echte Oberfläche kann abweichen.

Schritt 2: URP Lit Shader einrichten

Der Standard-Shader in URP heißt Lit. Er nimmt laut Unity-Dokumentation Base Map, Metallic Map, Smoothness und Normal Map als eigene Eingänge entgegen, kann Metallic, Occlusion und Smoothness aber auch aus einer einzigen gepackten Textur lesen. Das Kanal-Layout dafür ist fest vorgegeben:

Kanal URP-Eigenschaft
Rot Metallic
Grün Occlusion
Blau nicht genutzt
Alpha Smoothness

Wichtig: Diese Textur wird sowohl in das Feld Metallic Map als auch in Occlusion Map gezogen. Unity liest dann automatisch die passenden Kanäle aus derselben Datei – zwei Slots, eine Textur.

Unser _arm-Format legt AO in Rot, Roughness in Grün und Metallic in Blau ab, also in einer anderen Reihenfolge. Wer die ARM-Datei ungeprüft in die Metallic-Slots von URP zieht, bekommt falsche Ergebnisse: Aus AO wird Metallic, aus Roughness wird Occlusion. Wie du daraus in wenigen Zeilen eine URP-taugliche Textur baust, steht in Schritt 4.

Base Map bekommt _diff, Normal Map bekommt _nor_gl. Beide Zuweisungen laufen unabhängig vom Kanal-Packing und funktionieren ohne Umweg.

Schritt 3: HDRP Lit Shader und die Mask Map

HDRP nutzt ebenfalls einen Lit-Shader, packt Metallic, AO, ein Detail-Masken-Bit und Smoothness aber grundsätzlich in eine einzige Mask Map – ein separates Metallic-Feld gibt es hier nicht. Laut der offiziellen HDRP-Dokumentation ist das Layout:

Kanal HDRP-Mask-Map
Rot Metallic
Grün Ambient Occlusion
Blau Detail-Masken-Anteil
Alpha Smoothness

Auch hier gilt: Beim Import der Mask Map sRGB (Color Texture) deaktivieren, sonst verschiebt HDRP die linearen Werte. Ohne eigene Detail Map spielt der Blau-Kanal keine Rolle für das Ergebnis, wir setzen ihn im Skript unten trotzdem sauber auf 0, statt ihn einfach leer zu lassen.

Unity HDRP Lit Material-Inspector mit zugewiesener Mask Map im Surface-Inputs-BereichKI-generiert
Unity HDRP Lit Material-Inspector mit zugewiesener Mask Map im Surface-Inputs-Bereich KI-generierte Darstellung, die echte Oberfläche kann abweichen.

Fällt dir auf, wie ähnlich sich URP-Packing und HDRP-Mask-Map sind? Rot und Alpha stimmen überein, nur Grün und Blau vertauschen ihre Rolle leicht. Genau das macht Schritt 4 so kurz.

Schritt 4: Smoothness berechnen und Kanäle neu packen

Zwei Dinge fehlen noch, um aus unseren Dateien eine für Unity brauchbare Textur zu machen: Roughness muss in Smoothness umgerechnet werden (Smoothness = 1 − Roughness), und die Kanäle müssen in der Reihenfolge landen, die URP beziehungsweise HDRP erwarten. Ein kurzes Python-Skript mit Pillow erledigt beides in einem Rutsch:

from PIL import Image

# FS-Modworks-ARM: R = AO, G = Roughness, B = Metallic
arm = Image.open("FSMW_cracked_concrete_01_arm_4k.jpg").convert("RGB")
rough = Image.open("FSMW_cracked_concrete_01_rough_4k.jpg").convert("L")

ao, _, metallic = arm.split()
smoothness = rough.point(lambda p: 255 - p)      # Smoothness = 1 - Roughness
detail_mask = Image.new("L", ao.size, 0)         # keine Detail Map -> 0

# R Metallic, G AO/Occlusion, B Detail-Maske, A Smoothness
# passt so fuer die HDRP Mask Map UND fuer das URP-Kanal-Packing
# (in URP bleibt Blau schlicht ungenutzt)
packed = Image.merge("RGBA", (metallic, ao, detail_mask, smoothness))
packed.save("cracked_concrete_01_packed_4k.png")

Die erzeugte PNG-Datei kommt in URP in die Felder Metallic Map und Occlusion Map (beide gleichzeitig), in HDRP in Mask Map. In beiden Fällen: sRGB beim Import ausschalten, Texture Type bleibt Default.

Schritt 5: Tiling passend zum Kachelmaß setzen

Unsere Texturen sind kachelbar, aber nicht beliebig groß – jede hat ein festes Kachelmaß, auf das sie in Substance, Blender oder direkt am Modell gebaut wurde:

Textur Kachelmaß
Cracked Concrete 01 1,0 × 1,0 m
Oak Planks 01 1,2 m
Rusty Corrugated Metal 01 0,988 m
Cobblestone 01 1,5 m
Corrugated Metal 01 0,684 m

Im Material-Inspector findest du unter der Textur-Zuweisung die Felder Tiling (X/Y) und Offset. Der Tiling-Wert multipliziert die UV-Koordinaten des Meshs; er ist kein absoluter Meterwert, sondern ein Verhältnis zur UV-Größe des Objekts. Als Faustregel: Tiling = Kantenlänge der Fläche in Metern ÷ Kachelmaß der Textur, vorausgesetzt die UVs des Meshs sind 1:1 zur realen Objektgröße gelegt. Eine 4 Meter breite Wand mit Cracked Concrete 01 bekommt bei sauberen UVs also Tiling X = 4.

Schritt 6: FBX und glTF importieren

Unsere 3D-Modell-Pakete liegen in mehreren Formaten vor. FBX-Dateien liest Unity nativ, ohne dass du irgendetwas installieren musst – Datei in den Assets-Ordner legen, Unity baut daraus automatisch ein Prefab samt Materialien. Details zu unseren Formaten stehen in der Anleitung zu 3D-Dateiformaten.

Für .gltf und .glb ist das anders: Unity bringt dafür kein eigenes Importmodul mit. Laut Unity-Dokumentation übernimmt das Paket glTFast (com.unity.cloud.gltfast) diese Aufgabe. Installation über Window → Package Manager, dort das Paket suchen und hinzufügen. Danach kannst du .gltf- und .glb-Dateien wie jede andere Szene in den Assets-Ordner kopieren; glTFast baut daraus native Unity-Prefabs. Denk daran, die zugehörige .bin-Datei und den textures-Ordner mit zu kopieren, sonst fehlen Verweise.

Unity Package Manager mit dem Paket glTFast zum Installieren, im Project-Fenster liegt eine .gltf-DateiKI-generiert
Unity Package Manager mit dem Paket glTFast zum Installieren, im Project-Fenster liegt eine .gltf-Datei KI-generierte Darstellung, die echte Oberfläche kann abweichen.

Willst du dieselbe Textur zusätzlich im LS25 einsetzen, ist Unity dafür der falsche Weg – dort übernimmt das GIANTS Texture Tool die Konvertierung nach DDS, mit eigenem Kanal-Layout für die Spekular-Karte.

Ein Blick auf verwandte Engines lohnt sich, wenn ein Projekt mehrgleisig läuft: Die Anleitung zu Unreal Engine zeigt, wie dort aus unserer ARM-Datei direkt eine ORM-Textur wird, und die ORM/ARM-Anleitung erklärt den Unterschied zwischen den Packing-Standards im Detail. Wie Normal Maps grundsätzlich funktionieren und woran man eine falsch orientierte erkennt, steht in der Normal-Map-Anleitung.

Häufige Fehler

Problem Ursache Lösung
Normal Map wirkt eingedrückt statt erhaben Texture Type steht auf Default statt Normal Map Texture Type im Import-Inspector auf Normal Map stellen, neu importieren
Material wirkt komplett metallisch/spiegelnd ARM-Datei direkt in Metallic Map von URP gezogen, Kanäle liegen falsch Textur mit dem Skript aus Schritt 4 neu packen, dann in Metallic Map und Occlusion Map zuweisen
HDRP-Material wirkt dunkel und ohne Kontur Mask Map mit aktivem sRGB importiert sRGB (Color Texture) im Import-Inspector deaktivieren
.gltf-Datei lässt sich nicht importieren Paket glTFast fehlt im Projekt Package Manager öffnen, glTFast installieren
Kachelgröße passt nicht zur Wand Tiling im Material nicht an Kachelmaß und Objektgröße angepasst Tiling X/Y nach der Formel Kantenlänge ÷ Kachelmaß setzen

Häufige Fragen

Kann ich die FS-Modworks-ARM-Textur direkt in Unity verwenden?

Nicht ohne Umbau. Unsere ARM-Datei legt AO in Rot, Roughness in Grün und Metallic in Blau ab. URP erwartet dagegen Metallic in Rot und Occlusion in Grün, HDRP will Metallic in Rot, AO in Grün, Smoothness in Alpha. Mit dem Python-Skript aus dieser Anleitung baust du in wenigen Zeilen eine passende Textur.

Welche Render Pipeline soll ich für neue Projekte nehmen?

Unity selbst empfiehlt URP oder HDRP für neue Projekte. URP läuft auf so ziemlich allem, von Mobile bis PC. HDRP zielt auf PC und Konsole mit höherem Anspruch an Beleuchtung und Materialqualität.

Muss ich unsere Normal Map vor dem Import bearbeiten?

Nein. Im Import-Inspector einfach Texture Type auf Normal Map stellen, den Rest erledigt Unity. Unsere Dateien liegen in der OpenGL-Konvention vor, dafür ist die Einstellung gemacht.

Wie öffne ich unsere 3D-Modell-Pakete im glTF-Format in Unity?

FBX liest Unity ohne Zusatzsoftware. Für .gltf oder .glb installierst du zuerst das Paket glTFast über den Package Manager, danach funktioniert der Import wie bei jedem anderen Format.