工作流 /
3D 模型 /
Patina:文本生材质

Patina:文本生材质
Patina: Text to Material
用 Patina 由一段文字生成完整、可无缝平铺的 PBR 材质。一次运行同时返回基础贴图与 basecolor、normal、roughness、metalness、height 五张图,彼此逐像素对齐,可直接用于 3D 材质。适合木、石、金属、织物、瓷砖等有规律的表面;也可以接入一张图片(可再加蒙版),在已有表面上改绘而不是凭空生成。
3D 模型
9 个节点 40 次使用 ComfyUI ≥ 0.43.1 ComfyUI 14 KB
节点构成
SaveImage
× 6
SaveText
× 1
PatinaMaterialNode
× 1
MarkdownNote
× 1
官方标注的模型
Patina
工作流 JSON
和上面「下载工作流 JSON」是同一份文件。
1{
2 "id": "65921f96-39e0-48c0-90f0-48a3907755e3",
3 "revision": 0,
4 "last_node_id": 29,
5 "last_link_id": 15,
6 "nodes": [
7 {
8 "id": 21,
9 "type": "SaveImage",
10 "pos": [
11 913.024172616747,
12 8.987101490822187
13 ],
14 "size": [
15 373.6485367550731,
16 421.999244495615
17 ],
18 "flags": [],
19 "order": 3,
20 "mode": 0,
21 "inputs": [
22 {
23 "name": "images",
24 "type": "IMAGE",
25 "link": 10
26 }
27 ],
28 "outputs": [
29 {
30 "name": "images",
31 "type": "IMAGE",
32 "links": null
33 }
34 ],
35 "title": "basecolor",
36 "properties": {
37 "Node name for S&R": "SaveImage"
38 },
39 "widgets_values": [
40 "patina/%year%%month%%day%-%hour%%minute%_basecolor"
41 ],
42 "widgets_values_named": {
43 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_basecolor"
44 }
45 },
46 {
47 "id": 22,
48 "type": "SaveImage",
49 "pos": [
50 69.7270991066008,
51 8.987101490822187
52 ],
53 "size": [
54 373.6485367550731,
55 421.999244495615
56 ],
57 "flags": [],
58 "order": 4,
59 "mode": 0,
60 "inputs": [
61 {
62 "name": "images",
63 "type": "IMAGE",
64 "link": 11
65 }
66 ],
67 "outputs": [
68 {
69 "name": "images",
70 "type": "IMAGE",
71 "links": null
72 }
73 ],
74 "title": "normal",
75 "properties": {
76 "Node name for S&R": "SaveImage"
77 },
78 "widgets_values": [
79 "patina/%year%%month%%day%-%hour%%minute%_normal"
80 ],
81 "widgets_values_named": {
82 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_normal"
83 }
84 },
85 {
86 "id": 23,
87 "type": "SaveImage",
88 "pos": [
89 491.3756358616739,
90 8.987101490822187
91 ],
92 "size": [
93 373.6485367550731,
94 421.999244495615
95 ],
96 "flags": [],
97 "order": 2,
98 "mode": 0,
99 "inputs": [
100 {
101 "name": "images",
102 "type": "IMAGE",
103 "link": 9
104 }
105 ],
106 "outputs": [
107 {
108 "name": "images",
109 "type": "IMAGE",
110 "links": null
111 }
112 ],
113 "title": "texture",
114 "properties": {
115 "Node name for S&R": "SaveImage"
116 },
117 "widgets_values": [
118 "patina/%year%%month%%day%-%hour%%minute%_texture"
119 ],
120 "widgets_values_named": {
121 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_texture"
122 }
123 },
124 {
125 "id": 24,
126 "type": "SaveImage",
127 "pos": [
128 913.024172616747,
129 508.9863459864372
130 ],
131 "size": [
132 373.6485367550731,
133 421.999244495615
134 ],
135 "flags": [],
136 "order": 5,
137 "mode": 0,
138 "inputs": [
139 {
140 "name": "images",
141 "type": "IMAGE",
142 "link": 12
143 }
144 ],
145 "outputs": [
146 {
147 "name": "images",
148 "type": "IMAGE",
149 "links": []
150 }
151 ],
152 "title": "roughness",
153 "properties": {
154 "Node name for S&R": "SaveImage"
155 },
156 "widgets_values": [
157 "patina/%year%%month%%day%-%hour%%minute%_roughness"
158 ],
159 "widgets_values_named": {
160 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_roughness"
161 }
162 },
163 {
164 "id": 25,
165 "type": "SaveImage",
166 "pos": [
167 69.7270991066008,
168 508.9863459864372
169 ],
170 "size": [
171 373.6485367550731,
172 421.999244495615
173 ],
174 "flags": [],
175 "order": 6,
176 "mode": 0,
177 "inputs": [
178 {
179 "name": "images",
180 "type": "IMAGE",
181 "link": 13
182 }
183 ],
184 "outputs": [
185 {
186 "name": "images",
187 "type": "IMAGE",
188 "links": []
189 }
190 ],
191 "title": "metalness",
192 "properties": {
193 "Node name for S&R": "SaveImage"
194 },
195 "widgets_values": [
196 "patina/%year%%month%%day%-%hour%%minute%_metalness"
197 ],
198 "widgets_values_named": {
199 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_metalness"
200 }
201 },
202 {
203 "id": 26,
204 "type": "SaveImage",
205 "pos": [
206 491.3756358616739,
207 508.9863459864372
208 ],
209 "size": [
210 373.6485367550731,
211 421.999244495615
212 ],
213 "flags": [],
214 "order": 7,
215 "mode": 0,
216 "inputs": [
217 {
218 "name": "images",
219 "type": "IMAGE",
220 "link": 14
221 }
222 ],
223 "outputs": [
224 {
225 "name": "images",
226 "type": "IMAGE",
227 "links": []
228 }
229 ],
230 "title": "height",
231 "properties": {
232 "Node name for S&R": "SaveImage"
233 },
234 "widgets_values": [
235 "patina/%year%%month%%day%-%hour%%minute%_height"
236 ],
237 "widgets_values_named": {
238 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_height"
239 }
240 },
241 {
242 "id": 27,
243 "type": "SaveText",
244 "pos": [
245 1344.4437364341845,
246 10.211257943315161
247 ],
248 "size": [
249 402.051097237096,
250 411.75603311460543
251 ],
252 "flags": [],
253 "order": 8,
254 "mode": 0,
255 "inputs": [
256 {
257 "name": "text",
258 "type": "STRING",
259 "link": 15
260 }
261 ],
262 "outputs": [
263 {
264 "name": "text",
265 "type": "STRING",
266 "links": null
267 }
268 ],
269 "title": "expanded prompt",
270 "properties": {
271 "Node name for S&R": "SaveText"
272 },
273 "widgets_values": [
274 "patina/%year%%month%%day%-%hour%%minute%_expanded_prompt",
275 "txt"
276 ],
277 "widgets_values_named": {
278 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_expanded_prompt",
279 "format": "txt"
280 }
281 },
282 {
283 "id": 28,
284 "type": "PatinaMaterialNode",
285 "pos": [
286 -475.52707550661466,
287 10.285926290343436
288 ],
289 "size": [
290 467.1889394655036,
291 743.7035612159935
292 ],
293 "flags": [],
294 "order": 0,
295 "mode": 0,
296 "inputs": [
297 {
298 "name": "image",
299 "shape": 7,
300 "type": "IMAGE",
301 "link": null
302 },
303 {
304 "name": "mask",
305 "shape": 7,
306 "type": "MASK",
307 "link": null
308 }
309 ],
310 "outputs": [
311 {
312 "name": "texture",
313 "type": "IMAGE",
314 "links": [
315 9
316 ]
317 },
318 {
319 "name": "basecolor",
320 "type": "IMAGE",
321 "links": [
322 10
323 ]
324 },
325 {
326 "name": "normal",
327 "type": "IMAGE",
328 "links": [
329 11
330 ]
331 },
332 {
333 "name": "roughness",
334 "type": "IMAGE",
335 "links": [
336 12
337 ]
338 },
339 {
340 "name": "metalness",
341 "type": "IMAGE",
342 "links": [
343 13
344 ]
345 },
346 {
347 "name": "height",
348 "type": "IMAGE",
349 "links": [
350 14
351 ]
352 },
353 {
354 "name": "expanded_prompt",
355 "type": "STRING",
356 "links": [
357 15
358 ]
359 }
360 ],
361 "title": "Patina Material (text -> seamless PBR material)",
362 "properties": {
363 "Node name for S&R": "PatinaMaterialNode"
364 },
365 "widgets_values": [
366 "weathered red brick wall with pale lime mortar joints, seamless tileable PBR texture, sharp mortar lines, subtle surface grain, even diffuse lighting, no perspective",
367 "1:1 (1024x1024)",
368 true,
369 true,
370 true,
371 true,
372 true,
373 0,
374 1555424205,
375 "randomize",
376 "both",
377 8,
378 128,
379 64,
380 0.6,
381 false,
382 false
383 ],
384 "widgets_values_named": {
385 "prompt": "weathered red brick wall with pale lime mortar joints, seamless tileable PBR texture, sharp mortar lines, subtle surface grain, even diffuse lighting, no perspective",
386 "image_size": "1:1 (1024x1024)",
387 "basecolor": true,
388 "normal": true,
389 "roughness": true,
390 "metalness": true,
391 "height": true,
392 "upscale_factor": 0,
393 "seed": 1555424205,
394 "control_after_generate": "randomize",
395 "tiling_mode": "both",
396 "num_inference_steps": 8,
397 "tile_size": 128,
398 "tile_stride": 64,
399 "strength": 0.6,
400 "prompt_expansion": false,
401 "safety_checker": false
402 },
403 "color": "#432",
404 "bgcolor": "#653"
405 },
406 {
407 "id": 29,
408 "type": "MarkdownNote",
409 "pos": [
410 -1167.2808642261145,
411 10.564161613901696
412 ],
413 "size": [
414 587.2726037200163,
415 782.0166239750356
416 ],
417 "flags": [],
418 "order": 1,
419 "mode": 0,
420 "inputs": [],
421 "outputs": [],
422 "properties": [],
423 "widgets_values": [
424 "# Patina Material\n\n**Text -> complete, seamlessly tiling PBR material.** One prompt returns a base texture plus\nbasecolor / normal / roughness / metalness / height maps, all generated from the same latent so they line up\npixel for pixel. This is a partner (API) node: it runs on Comfy's servers, needs an account, nothing renders locally.\n\n## Three ways to use it\n\n| mode | wiring | behaviour |\n|---|---|---|\n| text -> material | only `prompt` | invents a tileable material from the description |\n| image-to-image | `prompt` + `image` | keeps the photo's structure and redraws it toward the prompt; `strength` 0.01-1 sets how far it moves |\n| inpaint | `prompt` + `image` + `mask` | white = regenerate, black = keep; a mask without an image raises an error |\n\n## Outputs - wire in this slot order\n\n`0 texture` · `1 basecolor` · `2 normal` · `3 roughness` · `4 metalness` · `5 height` · `6 expanded_prompt`\n\nEvery map can be switched off, but at least one has to stay on. Fewer maps = a cheaper, faster run.\n\n## Tips that actually matter\n\n- `image_size`: presets 1024², 512², 4:3, 3:4, 16:9, 9:16, or `custom` (512-2048, step 16).\n- `num_inference_steps` tops out at 8 - there is nothing to gain above that.\n- `tile_size` is in latent space: 128 is about 1024 px, 64 about 512 px. `tiling_mode` = both / horizontal / vertical.\n- `prompt_expansion` is **off by default on purpose**: the LLM rewrite reframes the prompt as a photo and tends to\n wash out the metalness map. Turn it on only when you want more surface detail and do not need a metalness map.\n- `upscale_factor` 2 or 4 upscales the **maps only** (SeedVR) - the base texture is never upscaled.\n- Describe a surface, not a scene. Add \"flat even lighting, no perspective\" and name the pattern\n (\"running bond\", \"herringbone\", \"warp and weft\") - that is what makes the result tile.\n- Structured materials work best: wood, stone, metal, fabric, ceramic tile, concrete, leather.\n Avoid free-form marble, flat gradients, and anything that depends on readable text - the texture generator will\n happily invent plausible-looking nonsense.\n\n## This workflow\n\nBrick example, all five maps on. Every save node writes to `patina/<yyyymmdd>-<hhmm>_<map>`, so the files of one run\nsit next to each other in the output folder and runs from different days never mix."
425 ],
426 "widgets_values_named": {
427 "text": "# Patina Material\n\n**Text -> complete, seamlessly tiling PBR material.** One prompt returns a base texture plus\nbasecolor / normal / roughness / metalness / height maps, all generated from the same latent so they line up\npixel for pixel. This is a partner (API) node: it runs on Comfy's servers, needs an account, nothing renders locally.\n\n## Three ways to use it\n\n| mode | wiring | behaviour |\n|---|---|---|\n| text -> material | only `prompt` | invents a tileable material from the description |\n| image-to-image | `prompt` + `image` | keeps the photo's structure and redraws it toward the prompt; `strength` 0.01-1 sets how far it moves |\n| inpaint | `prompt` + `image` + `mask` | white = regenerate, black = keep; a mask without an image raises an error |\n\n## Outputs - wire in this slot order\n\n`0 texture` · `1 basecolor` · `2 normal` · `3 roughness` · `4 metalness` · `5 height` · `6 expanded_prompt`\n\nEvery map can be switched off, but at least one has to stay on. Fewer maps = a cheaper, faster run.\n\n## Tips that actually matter\n\n- `image_size`: presets 1024², 512², 4:3, 3:4, 16:9, 9:16, or `custom` (512-2048, step 16).\n- `num_inference_steps` tops out at 8 - there is nothing to gain above that.\n- `tile_size` is in latent space: 128 is about 1024 px, 64 about 512 px. `tiling_mode` = both / horizontal / vertical.\n- `prompt_expansion` is **off by default on purpose**: the LLM rewrite reframes the prompt as a photo and tends to\n wash out the metalness map. Turn it on only when you want more surface detail and do not need a metalness map.\n- `upscale_factor` 2 or 4 upscales the **maps only** (SeedVR) - the base texture is never upscaled.\n- Describe a surface, not a scene. Add \"flat even lighting, no perspective\" and name the pattern\n (\"running bond\", \"herringbone\", \"warp and weft\") - that is what makes the result tile.\n- Structured materials work best: wood, stone, metal, fabric, ceramic tile, concrete, leather.\n Avoid free-form marble, flat gradients, and anything that depends on readable text - the texture generator will\n happily invent plausible-looking nonsense.\n\n## This workflow\n\nBrick example, all five maps on. Every save node writes to `patina/<yyyymmdd>-<hhmm>_<map>`, so the files of one run\nsit next to each other in the output folder and runs from different days never mix."
428 },
429 "color": "#222",
430 "bgcolor": "#000"
431 }
432 ],
433 "links": [
434 [
435 9,
436 28,
437 0,
438 23,
439 0,
440 "IMAGE"
441 ],
442 [
443 10,
444 28,
445 1,
446 21,
447 0,
448 "IMAGE"
449 ],
450 [
451 11,
452 28,
453 2,
454 22,
455 0,
456 "IMAGE"
457 ],
458 [
459 12,
460 28,
461 3,
462 24,
463 0,
464 "IMAGE"
465 ],
466 [
467 13,
468 28,
469 4,
470 25,
471 0,
472 "IMAGE"
473 ],
474 [
475 14,
476 28,
477 5,
478 26,
479 0,
480 "IMAGE"
481 ],
482 [
483 15,
484 28,
485 6,
486 27,
487 0,
488 "STRING"
489 ]
490 ],
491 "groups": [],
492 "config": [],
493 "extra": {
494 "ds": {
495 "scale": 0.3629431623024468,
496 "offset": [
497 1960.0212827127355,
498 690.6981233890498
499 ]
500 },
501 "frontendVersion": "1.57.4"
502 },
503 "version": 0.4
504}