> ## Documentation Index
> Fetch the complete documentation index at: https://docs.comfy.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Patina Texture Nodes in ComfyUI: Tiling PBR Materials and Maps

> Turn a photo or prompt into seamlessly tiling PBR materials in ComfyUI with the Patina nodes, plus basecolor, normal, roughness, metalness and height maps.

Patina generates the surface data a 3D asset needs. One run returns a base texture plus the basecolor, normal, roughness, metalness and height maps that a PBR material expects, and the whole set comes from the same latent, so the maps line up pixel for pixel instead of needing a separate bake.

In ComfyUI the provider runs through three partner nodes. **Patina Material** builds a material from a text prompt, from a photo, or from a photo plus a mask. **Patina Material Extract** pulls a tiling material out of a photo that already contains the surface you want. **Patina PBR Material Maps** converts one image into the map set without regenerating anything.

All three are cloud API nodes. They need a Comfy account with credits, download no model files, and bill per run. The price badge on each node shows the current rate, and every map you switch on adds to it.

> [!TIP]
>
> To use the Partner Nodes, you need to ensure that you are logged in properly and using a permitted network environment. Please refer to the [Partner Nodes Overview](https://docs.comfy.org/tutorials/partner-nodes/overview.md) section of the documentation to understand the specific requirements for using the Partner Nodes.

> [!TIP]
>
> > [tab] Local users
> >
> > Make sure your ComfyUI is updated.
> >
> > * [Download ComfyUI](https://www.comfy.org/download)
> > * [Update Guide](https://docs.comfy.org/installation/update_comfyui.md)
> >
> > Workflows in this guide can be found in the [Workflow Templates](https://docs.comfy.org/interface/features/template.md).
> > If you can't find them in the template, your ComfyUI may be outdated.
> >
> > If nodes are missing when loading a workflow, possible reasons:
> >
> > 1. You are not using the latest ComfyUI version (Nightly version)
> > 2. Some nodes failed to import at startup
>
> > [tab] Cloud users
> >
> > * [Cloud](https://cloud.comfy.org) will update after ComfyUI stable release.
> >
> > So, if you find any core node missing in this document, it might be because the new core nodes have not yet been released in the latest stable version. Please wait for the next stable release.

## Available workflows

### Material Extract: photo to tiling material

Point the node at a photo that already contains the material and the prompt says which surface to pull out and what structure to keep. The texture comes back seamless, so it repeats across a large surface without a visible border.

![Patina Material Extract workflow preview](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/templates/api_patina_material_extract-1.webp)

> [card] [Run in Comfy Cloud](https://cloud.comfy.org/?template=api_patina_material_extract\&utm_source=docs\&utm_medium=referral\&utm_campaign=patina)
>
> Open in Comfy Cloud

> [card] [Download Workflow](https://github.com/Comfy-Org/workflow_templates/blob/main/templates/api_patina_material_extract.json)
>
> Download JSON or search "Patina: Material Extract" in Template Library

**Input materials**

> [card] [patina\_chair\_webbing.png](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/patina_chair_webbing.png)
>
> Load into the `LoadImage` node. A photo that already contains the material

The photo does not have to be a flat crop: the node re-synthesises the layout, so a product shot works as long as the material itself repeats. `strength` (advanced, 0.6 in the template) sets how far the extracted texture may drift from the photo.

### Material: text to material

Describe the surface and get a complete material back, with no source image at all. The prompt carries the whole result, so name the pattern and the finish rather than the object it belongs to.

![Patina text to material workflow preview](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/templates/api_patina_material_t2m-1.webp)

> [card] [Run in Comfy Cloud](https://cloud.comfy.org/?template=api_patina_material_t2m\&utm_source=docs\&utm_medium=referral\&utm_campaign=patina)
>
> Open in Comfy Cloud

> [card] [Download Workflow](https://github.com/Comfy-Org/workflow_templates/blob/main/templates/api_patina_material_t2m.json)
>
> Download JSON or search "Patina: Text to Material" in Template Library

Structured materials come out best: wood, stone, metal, fabric, plaster and ceramic tile. Adding "flat even lighting, no perspective" is what makes the result tile instead of reading as a photograph of a wall.

### Material: image to material

Connect a surface photo and Patina redraws it as a tiling material, keeping the pattern from the image. `strength` decides how far it moves away from the photo: low keeps the original texture, high rewrites more of it.

![Patina image to material workflow preview](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/templates/api_patina_material_i2m-1.webp)

> [card] [Run in Comfy Cloud](https://cloud.comfy.org/?template=api_patina_material_i2m\&utm_source=docs\&utm_medium=referral\&utm_campaign=patina)
>
> Open in Comfy Cloud

> [card] [Download Workflow](https://github.com/Comfy-Org/workflow_templates/blob/main/templates/api_patina_material_i2m.json)
>
> Download JSON or search "Patina: Image to Material" in Template Library

**Input materials**

> [card] [patina\_brick\_wall.jpg](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/patina_brick_wall.jpg)
>
> Load into the `LoadImage` node. A surface photo with a regular structure

The optional `mask` input limits the redraw to a region, with white for regenerate and black for keep. A mask without an image raises an error.

### PBR Maps: image to map set

Derive the maps from an image that is already the material. Nothing is regenerated here: the maps describe exactly what the picture contains, so seams, perspective and lighting in the source stay in the result.

![Patina PBR Material Maps workflow preview](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/templates/api_patina_pbr_maps-1.webp)

> [card] [Run in Comfy Cloud](https://cloud.comfy.org/?template=api_patina_pbr_maps\&utm_source=docs\&utm_medium=referral\&utm_campaign=patina)
>
> Open in Comfy Cloud

> [card] [Download Workflow](https://github.com/Comfy-Org/workflow_templates/blob/main/templates/api_patina_pbr_maps.json)
>
> Download JSON or search "Patina: PBR Maps" in Template Library

**Input materials**

> [card] [patina\_pbr\_webbing\_basecolor.png](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/main/input/patina_pbr_webbing_basecolor.png)
>
> Load into the `LoadImage` node. A flat, evenly lit surface or an existing basecolor map

This node does not tile. Use it when you already have a seamless basecolor and want the rest of the set, and use Material or Material Extract when the result has to repeat. Inputs up to 2048 px are accepted; larger images are scaled down unless you turn off `auto_downscale`.

## Node controls

| Control | Values | Applies to | Effect |
| - | - | - | - |
| `prompt` | text | Material, Material Extract | Names the surface or material. On Extract, says which part of the photo to pull out. PBR Maps has no prompt input |
| map toggles | `basecolor`, `normal`, `roughness`, `metalness`, `height` | all three nodes | Which maps are returned. The nodes start with basecolor and normal on and the other three off, and all four templates switch all five on. Each enabled map adds to the run price |
| `image_size` | `1:1 (1024x1024)`, `1:1 (512x512)`, `4:3 (1024x768)`, `3:4 (768x1024)`, `16:9 (1024x576)`, `9:16 (576x1024)`, `custom` | Material, Material Extract | Output size. `custom` takes a width and height from 512 to 2048 in steps of 16 |
| `upscale_factor` | `0`, `2`, `4` | Material, Material Extract | Seamless upscaling of the maps. The base texture is not upscaled, and `4` reaches 8K map output from a 2K run |
| `strength` | 0.01 to 1.0, default 0.6 | Material, Material Extract | How far the result may move away from the source photo. Ignored on text to material |
| `tiling_mode` | `both`, `horizontal`, `vertical` | Material, Material Extract | Tiling direction |
| `num_inference_steps` | 1 to 8, default 8 | Material, Material Extract | Denoising steps. There is nothing to gain above 8 |
| `tile_size` | 32 to 256, default 128 | Material, Material Extract | Tile size in latent space: 64 is about 512 px, 128 about 1024 px |
| `tile_stride` | 16 to 128, default 64 | Material, Material Extract | Tile stride in latent space |
| `prompt_expansion` | off by default | Material, Material Extract | LLM rewrite of the prompt. Keep it off unless the prompt is thin, because expansion reframes the prompt as a photo and tends to wash out the metalness map |
| `seed` | integer | all three nodes | Reuse a seed to get the same result again, change it for a different variation |
| `auto_downscale` | on by default | PBR Maps | Scales an input whose longest side is over 2048 px back to 2048 px. Turn it off to get an error on oversized images instead |

Outputs follow a fixed slot order. Material and Material Extract return `texture`, `basecolor`, `normal`, `roughness`, `metalness`, `height` and `expanded_prompt`. PBR Maps returns the five maps without a separate base texture. A map you switch off still outputs a black 1×1 placeholder in its slot.

## Tips

* **Name the surface, not the scene.** On a photo of a chair, "chair webbing fabric" extracts the woven straps and ignores the frame, the floor and the paddle in shot.
* **Add structure when the pattern drifts.** On Extract, a clause like "keep the weave and the strap edges" stops the pattern from wandering between runs.
* **Pick the material that repeats inside a few hundred pixels.** Webbing, brick, pavers, planks and plaster tile well. A rock cliff, an aerial terrain or a single object come back as a repaint that will not tile.
* **Turn maps off before you run.** Three maps are usually enough for a game or a product material, and the price follows the number of maps. Disconnect or bypass that map's SaveImage node, or the placeholder is saved as a map.
* **Chain Extract into PBR Maps for a full set from one photo.** Extract makes the basecolor tile, then PBR Maps derives the remaining maps from it.
* **Generate the map, then check the metalness on metals.** Prompt expansion is the usual reason a metal surface comes back flat.

## Get started

1. Update ComfyUI to the latest version
2. Go to Template Library, search for `Patina`
3. Pick the workflow that matches your input: Extract for a photo of a surface, Text to Material for a prompt only, Image to Material for a photo to redraw, PBR Maps for an existing basecolor
4. Switch off the maps you do not need, then run the workflow


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.