工作流 /
3D 模型 /
Patina:PBR 贴图

Patina:PBR 贴图
Patina: PBR Maps
用 Patina 把一张图转成整套 PBR 贴图:basecolor、normal、roughness、metalness、height,全部从图片本身推导,不重新生成、也不做平铺。喂一张平光表面照片或现成的 basecolor 图,勾选需要的贴图,直接用在 3D 材质上。
3D 模型
8 个节点 1 个输入 ComfyUI ≥ 0.43.1 ComfyUI 11 KB
节点构成
SaveImage
× 5
MarkdownNote
× 1
LoadImage
× 1
PatinaPBRMapsNode
× 1
官方标注的模型
Patina
工作流 JSON
和上面「下载工作流 JSON」是同一份文件。
1{
2 "id": "65921f96-39e0-48c0-90f0-48a3907755e3",
3 "revision": 0,
4 "last_node_id": 32,
5 "last_link_id": 30,
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": 4,
20 "mode": 0,
21 "inputs": [
22 {
23 "name": "images",
24 "type": "IMAGE",
25 "link": 27
26 }
27 ],
28 "outputs": [
29 {
30 "name": "images",
31 "type": "IMAGE",
32 "links": null
33 }
34 ],
35 "title": "normal",
36 "properties": {
37 "Node name for S&R": "SaveImage"
38 },
39 "widgets_values": [
40 "patina/%year%%month%%day%-%hour%%minute%_normal"
41 ],
42 "widgets_values_named": {
43 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_normal"
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": 5,
59 "mode": 0,
60 "inputs": [
61 {
62 "name": "images",
63 "type": "IMAGE",
64 "link": 28
65 }
66 ],
67 "outputs": [
68 {
69 "name": "images",
70 "type": "IMAGE",
71 "links": null
72 }
73 ],
74 "title": "roughness",
75 "properties": {
76 "Node name for S&R": "SaveImage"
77 },
78 "widgets_values": [
79 "patina/%year%%month%%day%-%hour%%minute%_roughness"
80 ],
81 "widgets_values_named": {
82 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_roughness"
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": 3,
98 "mode": 0,
99 "inputs": [
100 {
101 "name": "images",
102 "type": "IMAGE",
103 "link": 26
104 }
105 ],
106 "outputs": [
107 {
108 "name": "images",
109 "type": "IMAGE",
110 "links": null
111 }
112 ],
113 "title": "basecolor",
114 "properties": {
115 "Node name for S&R": "SaveImage"
116 },
117 "widgets_values": [
118 "patina/%year%%month%%day%-%hour%%minute%_basecolor"
119 ],
120 "widgets_values_named": {
121 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_basecolor"
122 }
123 },
124 {
125 "id": 24,
126 "type": "SaveImage",
127 "pos": [
128 501.208605151926,
129 521.1691288882778
130 ],
131 "size": [
132 373.6485367550731,
133 421.999244495615
134 ],
135 "flags": [],
136 "order": 6,
137 "mode": 0,
138 "inputs": [
139 {
140 "name": "images",
141 "type": "IMAGE",
142 "link": 29
143 }
144 ],
145 "outputs": [
146 {
147 "name": "images",
148 "type": "IMAGE",
149 "links": []
150 }
151 ],
152 "title": "metalness",
153 "properties": {
154 "Node name for S&R": "SaveImage"
155 },
156 "widgets_values": [
157 "patina/%year%%month%%day%-%hour%%minute%_metalness"
158 ],
159 "widgets_values_named": {
160 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_metalness"
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": 7,
176 "mode": 0,
177 "inputs": [
178 {
179 "name": "images",
180 "type": "IMAGE",
181 "link": 30
182 }
183 ],
184 "outputs": [
185 {
186 "name": "images",
187 "type": "IMAGE",
188 "links": []
189 }
190 ],
191 "title": "height",
192 "properties": {
193 "Node name for S&R": "SaveImage"
194 },
195 "widgets_values": [
196 "patina/%year%%month%%day%-%hour%%minute%_height"
197 ],
198 "widgets_values_named": {
199 "filename_prefix": "patina/%year%%month%%day%-%hour%%minute%_height"
200 }
201 },
202 {
203 "id": 29,
204 "type": "MarkdownNote",
205 "pos": [
206 -1557.265453790667,
207 8.902110424501338
208 ],
209 "size": [
210 587.2726037200163,
211 782.0166239750356
212 ],
213 "flags": [],
214 "order": 0,
215 "mode": 0,
216 "inputs": [],
217 "outputs": [],
218 "properties": [],
219 "widgets_values": [
220 "# Patina PBR Maps\n\n**Photo or texture -> PBR maps.** Converts one image into basecolor / normal / roughness / metalness / height. Nothing\nis regenerated: the maps are derived from exactly what the picture contains, so seams, perspective and lighting in the\nsource stay in the result. Partner (API) node: it runs on Comfy's servers, needs an account, nothing renders locally.\n\n## Input Asset\n\n- [patina_pbr_webbing_basecolor.png](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/patina_pbr_webbing_basecolor.png)\n\n## How to use it\n\n- Feed a flat, evenly lit surface photo, or an existing basecolor map - this example takes the green / white webbing\n basecolor produced by the Patina Material Extract template, so the chain reads extract -> PBR maps.\n- Switch on only the maps you need. Every enabled map is billed, and three maps are usually enough for a game or a\n product material.\n- **This node does not tile.** If the source is not seamless, the maps will not be either: use Patina Material\n (Extract) when the result has to repeat, and this node when you already have a tiling basecolor and want the rest of\n the set.\n- Inputs up to 2048 px; larger images are scaled down automatically (`auto_downscale`, on by default).\n\n## Outputs - wire in this slot order\n\n`0 basecolor` . `1 normal` . `2 roughness` . `3 metalness` . `4 height`\n\n## Tips that actually matter\n\n- The maps come back at the **input resolution**, not at a fixed size.\n- Metalness on non-metal surfaces comes back solid black - that is correct, not a failed download.\n- Roughness tends to read darker (smoother) than the photo suggests; check it against the source before shipping.\n- Strong directional light in the source is baked into the basecolor, which double-lights the material in 3D. Prefer\n flat, diffuse photos."
221 ],
222 "widgets_values_named": {
223 "text": "# Patina PBR Maps\n\n**Photo or texture -> PBR maps.** Converts one image into basecolor / normal / roughness / metalness / height. Nothing\nis regenerated: the maps are derived from exactly what the picture contains, so seams, perspective and lighting in the\nsource stay in the result. Partner (API) node: it runs on Comfy's servers, needs an account, nothing renders locally.\n\n## Input Asset\n\n- [patina_pbr_webbing_basecolor.png](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/input/patina_pbr_webbing_basecolor.png)\n\n## How to use it\n\n- Feed a flat, evenly lit surface photo, or an existing basecolor map - this example takes the green / white webbing\n basecolor produced by the Patina Material Extract template, so the chain reads extract -> PBR maps.\n- Switch on only the maps you need. Every enabled map is billed, and three maps are usually enough for a game or a\n product material.\n- **This node does not tile.** If the source is not seamless, the maps will not be either: use Patina Material\n (Extract) when the result has to repeat, and this node when you already have a tiling basecolor and want the rest of\n the set.\n- Inputs up to 2048 px; larger images are scaled down automatically (`auto_downscale`, on by default).\n\n## Outputs - wire in this slot order\n\n`0 basecolor` . `1 normal` . `2 roughness` . `3 metalness` . `4 height`\n\n## Tips that actually matter\n\n- The maps come back at the **input resolution**, not at a fixed size.\n- Metalness on non-metal surfaces comes back solid black - that is correct, not a failed download.\n- Roughness tends to read darker (smoother) than the photo suggests; check it against the source before shipping.\n- Strong directional light in the source is baked into the basecolor, which double-lights the material in 3D. Prefer\n flat, diffuse photos."
224 },
225 "color": "#222",
226 "bgcolor": "#000"
227 },
228 {
229 "id": 30,
230 "type": "LoadImage",
231 "pos": [
232 -916.0890251245451,
233 13.48273436379975
234 ],
235 "size": [
236 415.0581423487129,
237 432.7386056769318
238 ],
239 "flags": [],
240 "order": 1,
241 "mode": 0,
242 "inputs": [],
243 "outputs": [
244 {
245 "name": "IMAGE",
246 "type": "IMAGE",
247 "links": [
248 25
249 ]
250 },
251 {
252 "name": "MASK",
253 "type": "MASK",
254 "links": []
255 }
256 ],
257 "properties": {
258 "Node name for S&R": "LoadImage"
259 },
260 "widgets_values": [
261 "patina_pbr_webbing_basecolor.png",
262 "image"
263 ],
264 "widgets_values_named": {
265 "image": "patina_pbr_webbing_basecolor.png",
266 "upload": "image"
267 }
268 },
269 {
270 "id": 32,
271 "type": "PatinaPBRMapsNode",
272 "pos": [
273 -387.5609545603945,
274 4.191267082654889
275 ],
276 "size": [
277 270,
278 330
279 ],
280 "flags": [],
281 "order": 2,
282 "mode": 0,
283 "inputs": [
284 {
285 "name": "image",
286 "type": "IMAGE",
287 "link": 25
288 }
289 ],
290 "outputs": [
291 {
292 "name": "basecolor",
293 "type": "IMAGE",
294 "links": [
295 26
296 ]
297 },
298 {
299 "name": "normal",
300 "type": "IMAGE",
301 "links": [
302 27
303 ]
304 },
305 {
306 "name": "roughness",
307 "type": "IMAGE",
308 "links": [
309 28
310 ]
311 },
312 {
313 "name": "metalness",
314 "type": "IMAGE",
315 "links": [
316 29
317 ]
318 },
319 {
320 "name": "height",
321 "type": "IMAGE",
322 "links": [
323 30
324 ]
325 }
326 ],
327 "properties": {
328 "Node name for S&R": "PatinaPBRMapsNode"
329 },
330 "widgets_values": [
331 true,
332 true,
333 true,
334 true,
335 true,
336 42,
337 "randomize",
338 false,
339 true
340 ],
341 "widgets_values_named": {
342 "basecolor": true,
343 "normal": true,
344 "roughness": true,
345 "metalness": true,
346 "height": true,
347 "seed": 42,
348 "control_after_generate": "randomize",
349 "safety_checker": false,
350 "auto_downscale": true
351 },
352 "color": "#432",
353 "bgcolor": "#653"
354 }
355 ],
356 "links": [
357 [
358 25,
359 30,
360 0,
361 32,
362 0,
363 "IMAGE"
364 ],
365 [
366 26,
367 32,
368 0,
369 23,
370 0,
371 "IMAGE"
372 ],
373 [
374 27,
375 32,
376 1,
377 21,
378 0,
379 "IMAGE"
380 ],
381 [
382 28,
383 32,
384 2,
385 22,
386 0,
387 "IMAGE"
388 ],
389 [
390 29,
391 32,
392 3,
393 24,
394 0,
395 "IMAGE"
396 ],
397 [
398 30,
399 32,
400 4,
401 25,
402 0,
403 "IMAGE"
404 ]
405 ],
406 "groups": [],
407 "config": [],
408 "extra": {
409 "ds": {
410 "scale": 0.3627765951022773,
411 "offset": [
412 2114.5962531083755,
413 860.5952696751928
414 ]
415 },
416 "frontendVersion": "1.57.4"
417 },
418 "version": 0.4
419}