Ein Foto einer Oberfläche rein, eine nahtlos kachelbare PBR-Textur mit neun Maps raus. Läuft lokal, kostet nichts, benutzt kein Non-Commercial-Modell.
↓ Workflow herunterladen (.json)Kein Formular, kein Newsletter, keine Anmeldung. Datei laden und per Drag & Drop in ComfyUI ziehen.
Vorher lesen. Die Height Map wird aus der Helligkeit des Fotos abgeleitet. Das stimmt nur bei Materialien, bei denen dunkel auch tief bedeutet — Putz, Beton, Ziegel, Rinde, Stoff. Bei Kies, Terrazzo oder buntem Mosaik ist dunkel nur dunkel, und das Relief wird falsch. Details im Abschnitt Grenzen.
Neun PNGs, alle in der Zielauflösung, alle nach ComfyUI/output/pbr/.
| Map | Datei | Farbraum | Inhalt |
|---|---|---|---|
| Base Color | basecolor | sRGB | Grundfarbe ohne Beleuchtung, farblich ans Foto angeglichen |
| Roughness | roughness | Non-Color | Materialschätzung von Marigold, Rotkanal, kontrastangehoben |
| Metallic | metallic | Non-Color | Konstante, standardmäßig schwarz. Weiße Variante liegt bypassed daneben |
| Height | height | Non-Color | Luminanz der Kachel, hochpassgefiltert |
| Normal GL | normal_gl | Non-Color | Sobel aus der Height, Grün nach oben — Blender, Cinema 4D, Maya, Godot |
| Normal DX | normal_dx | Non-Color | Dasselbe mit gespiegeltem Grünkanal — Unreal, Unity |
| AO | ao | Non-Color | Cavity-Näherung aus der Height |
| ORM | material_ORM | Non-Color | R = AO, G = Roughness, B = Metallic, fertig gepackt |
| Tileable | tileable | sRGB | Das kachelbare Quellbild selbst — Ausgangspunkt für eigene Nachbearbeitung |
Hardware. Ab 8 GB VRAM, eine RTX 2080 Super reicht. Ein Durchlauf bei 2048 px dauert dort ein paar Minuten, der Löwenanteil davon entfällt auf die Nahtreparatur mit SDXL.
| Paket | Autor | Lizenz |
|---|---|---|
| ComfyUI-Marigold | kijai | Apache 2.0 |
| ComfyUI-KJNodes | kijai | GPL-3.0 |
| ComfyUI_LayerStyle | chflame163 | MIT |
| ComfyUI_cspnodes | cerspense | Apache 2.0 |
| Modell | Ordner | Lizenz | Beschaffung |
|---|---|---|---|
sd_xl_base_1.0 | models/checkpoints/ | CreativeML Open RAIL++-M | manuell ablegen |
marigold-iid-appearance-v1-1 | models/diffusers/ | Open RAIL++-M | lädt beim ersten Lauf selbst |
Bekannte Stolperstelle. ColorMatch aus den KJNodes ist als deprecated markiert und taucht in der Node-Suche nicht mehr auf. Geladen wird es weiterhin — der Workflow funktioniert. Wer den Node selbst neu setzt, nimmt ColorMatchV2.
Der Workflow besteht aus vier Blöcken. Die vier farbigen Gruppen im Graphen sind so geschnitten, dass jede genau ein Subgraph wird, falls du das aufräumen willst.
denoise 0.70 übermalt. Der Rest des Fotos bleibt unangetastet.ColorMatch farblich ans Foto gezogen. Die Height entsteht aus der Luminanz der Kachel, durch einen Hochpass geschickt (256 px runter, blurren, invertieren, zurückblenden) — das entfernt großflächige Helligkeitsunterschiede und lässt nur lokales Relief stehen.Der Kern, den man verstanden haben sollte. Die KI-Stufen haben feste Arbeitsauflösungen: Marigold rechnet bei 768 px, SDXL bei 1024 px. Daran lässt sich nichts drehen. Die Schärfe der fertigen Textur kommt deshalb nicht aus einem Modell, sondern direkt aus dem Foto — die Modelle liefern nur die grobe Schicht, das Detail wird per Frequenztrennung aus dem Original zurückgeholt. Einzige Ausnahme ist die Naht: dort existiert kein Original mehr, deshalb wird genau dieses schmale Band neu gerechnet. Praktische Folge: die Qualität des Fotos ist die Obergrenze, nicht die Zahl im Auflösungsfeld.
Die Normal Map wird gerechnet, nicht geschätzt. Sie entsteht per Sobel-Gradient aus der Height, bei voller Auflösung — kein Modell, keine 768-px-Grenze. Marigold Normals ist bewusst nicht im Workflow: das schätzt Szenennormalen, und eine frontal fotografierte Fläche ergibt dabei ein flaches Lavendelfeld. Korrekt, aber für Texturarbeit nutzlos.
1. Load Photo das Foto wählen. Frontal aufgenommen, diffus beleuchtet, keine harten Schlagschatten, keine Objekte im Bild. Nicht quadratische Fotos werden mittig beschnitten — lieber vorher selbst zuschneiden.2. Target Resolution prüfen. Standard ist 2048.3. Check the tile und 4. Tiling test 2x2 hinsehen, bevor du weitermachst. Der 2×2-Test ist die eigentliche Prüfung: wenn dort im Kreuz eine Linie oder ein Materialbruch steht, stimmt die Naht nicht.ComfyUI/output/pbr/.| Regler | Node | Standard | Wirkung |
|---|---|---|---|
denoise | Sample the seam | 0.70 | Wie frei SDXL die Naht neu malt. Bei 1.0 erfindet der Sampler Material, das nicht zum Foto passt; unter 0.5 überlebt die Naht. |
steps | Sample the seam | 25 | Qualität gegen Rechenzeit der Nahtreparatur |
width / height | Vertical / Horizontal bar | 160 | Breite des reparierten Bandes, bei 2048 rund 8 %. Zu schmal: die Naht bleibt sichtbar. Zu breit: du wirfst Fotodetail weg. Wird der Wert geändert, müssen die beiden MaskComposite-Offsets mit: (Auflösung − Balkenbreite) / 2. |
strength | Match colour to photo | 0.75 | Wie stark das Albedo farblich ans Foto gezogen wird |
blend_factor | Detail from photo | 0.40 | Schärfe: wie viel Fotodetail ins Albedo zurückkommt |
blend_factor | Darken | 0.25 | Helligkeit des Albedo |
blend_factor | High-pass contrast | 0.55 | Wie ausgeprägt das Relief liest. Der Node High-pass darüber lässt sich mit Ctrl+B bypassen — dann bekommst du die rohe Height zum Vergleich. |
normal_intensity | Normal from Height / Normal DX | 0.60 | Tiefe der Normal Map. Höher bei flachen Oberflächen, niedriger wenn das Ergebnis geprägt aussieht. |
blend_factor | AO from cavity | 0.50 | AO-Stärke. 0.0 ergibt eine weiße Map, also praktisch kein AO. |
Stapelverarbeitung. Der Node BATCH in der Eingangsgruppe ist bypassed. Mit Ctrl+B einschalten, den absoluten Ordnerpfad in directory_path eintragen und den IMAGE-Ausgang auf 2. Target Resolution ziehen — das ersetzt die Verbindung von 1. Load Photo. image_index per Rechtsklick auf increment stellen und so oft in die Queue legen, wie du Fotos hast. Alle Sätze landen im selben Ordner mit fortlaufender Nummer, also selbst mitzählen, welche neun Dateien zusammengehören.
Standard ist 2048 × 2048. Bleib bei Zweierpotenzen — 1024, 2048, 4096. Game-Engines bauen Mipmap-Ketten und Blockkompression darum herum; 3072 funktioniert, ergibt aber keine saubere Mip-Kette und streamt schlecht. Für die meiste Indie-Arbeit ist 2048 die richtige Wahl: 4096 vervierfacht den Speicher für Detail, das auf Spieldistanz niemand sieht.
Es reicht nicht, eine Zahl zu ändern. Diese Felder müssen zusammenpassen:
| Feld | 2048 | 4096 |
|---|---|---|
| 2. Target Resolution | 2048 | 4096 |
Offset by half edge (shift_x/y) | 1024 | 2048 |
| Mask base, Breite / Höhe | 2048 | 4096 |
| Vertical bar, Höhe | 2048 | 4096 |
| Horizontal bar, Breite | 2048 | 4096 |
Add vertical bar x | 944 | 1968 |
Add horizontal bar y | 944 | 1968 |
| Back to target resolution | 2048 | 4096 |
| Upscale Albedo / Roughness | 2048 | 4096 |
| Back to target (Hochpass) | 2048 | 4096 |
| EmptyImage ×3 (Metallic, AO) | 2048 | 4096 |
Die beiden MaskComposite-Offsets ergeben sich aus (Auflösung − Balkenbreite) / 2. Stimmt der Offset nicht, sitzt die Naht nicht in der Mitte und das Kacheln bricht. Und: geh nicht über die Auflösung deines Quellfotos hinaus — darüber erfindest du Pixel, die nie da waren.
Farbräume, überall gleich. basecolor ist sRGB. Alles andere ist Non-Color, Raw beziehungsweise Linear. Das ist der Fehler Nummer eins: eine Roughness in sRGB sieht falsch aus und niemand weiß warum.
normal_gl in einen Normal Map-Node, dessen Ausgang in den Normal-Eingang des Principled BSDF. Willst du Normal und Height kombinieren, kommt zuerst der Normal-Map-Node, sein Ausgang geht in den Normal-Eingang eines Bump-Nodes, und die Height in dessen Height-Eingang — nur diese Reihenfolge addiert beide, statt dass eines das andere überschreibt. Bump-Stärke klein halten. Echtes Displacement braucht Subdivision und Werte um 0.01–0.05. Für unregelmäßige Meshes ohne saubere UVs ist Box Projection der schnellste Weg.
normal_dx nehmen, nicht normal_gl — sonst kippt das Licht in den Vertiefungen auf die falsche Seite. Beim ORM-Import sRGB abwählen und die Kompression auf Masks stellen. Im Material die drei Kanäle trennen: R → Ambient Occlusion, G → Roughness, B → Metallic. Base Color bleibt sRGB.
normal_gl, wie in Blender. In Redshift und im Standard-Renderer alles außer Base Color auf Raw stellen. Height läuft als Displacement mit Subdivision oder, wenn es billig sein soll, als Bump. Das ORM wird hier meist nicht gebraucht — nimm die Einzelmaps, sie liegen ohnehin daneben.
Querverweis. Das Umrechnen von Normal GL nach DX und das Packen von ORM erledigt der Utility-Workflow unreal_prep (Smart Utilities). Für diesen Workflow brauchst du ihn nicht — beides passiert hier schon. Er ist für Maps aus anderen Quellen: Scans, gekaufte Sets, Substance-Exporte.
Der Workflow erzeugt brauchbare Texturen, keine perfekten. Was er nicht kann, steht hier und nicht im Kleingedruckten:
Kein Bestandteil dieses Workflows steht unter einer Non-Commercial-Lizenz. Die erzeugten Texturen gehören dir.
| Bestandteil | Lizenz | Kommerziell |
|---|---|---|
| Workflow-JSON (Laser Studios) | MIT | ja |
| ComfyUI-Marigold | Apache 2.0 | ja |
| ComfyUI-KJNodes | GPL-3.0 | ja — die Nutzung ist frei; wer den Node-Code verändert weitergibt, gibt ihn unter GPL weiter |
| ComfyUI_LayerStyle | MIT | ja |
| ComfyUI_cspnodes | Apache 2.0 | ja |
sd_xl_base_1.0 | CreativeML Open RAIL++-M | ja, mit den Einsatzbeschränkungen im Anhang der Lizenz |
marigold-iid-appearance-v1-1 | Open RAIL++-M | ja, mit den Einsatzbeschränkungen im Anhang der Lizenz |
Die beiden RAIL-Lizenzen erlauben kommerzielle Nutzung ausdrücklich, verbieten aber bestimmte Einsatzzwecke. Wer Texturen für ein kommerzielles Spiel oder eine Visualisierung baut, ist davon nicht betroffen. Lies die Anhänge trotzdem einmal — das ist eine Seite.
↓ Workflow herunterladen (.json) 3D · nächste SchritteWeitere 3D-Workflows →