Make Texture Tileable
Make a texture tile without a visible seam — and get the 2×2 proof
- image
- tileable
- tiled_2x2_proof
- seam_report
The classic AI-texture failure: the output looks gorgeous as a single image, and the moment you tile it, there's a hard seam running down the middle where the left edge slams into the right. TextureMakeTileable exists to kill that seam before it happens, and to prove it - it hands you a 2×2 tiled proof so you can eyeball the seam immediately instead of discovering it in the renderer.
It's one of the authoring nodes in ComfyUI-Texture-Simple, Gökay Aydoğan's offline PBR toolkit. Pure NumPy/Pillow, runs on CPU, no models, no downloads - this is the node you drop right after generation (or after a seamless-generating sampler, if you want a second opinion).
The two methods
- Offset + feather (default) - blends the opposite edges together over a
blend_fraction-wide band (default 0.12, i.e. 12% of the image on each edge). It's the safe default for photographic textures. - Mirror - flips the image and tiles it against itself. Produces a seamless result almost instantly and at twice the resolution (your 1024 texture becomes 2048), but the mirrored pattern shows up on anything with recognizable structure. Great for brick and rough surfaces, terrible for anything with writing or directional detail.
One honest note: despite the "offset" in the name, the code feathers the edges in place - it doesn't do the classic half-offset-then-blend trick. Functionally that still makes the edges match, and it keeps the image content in place, but the crossfade can soften detail right at the border band if you push blend_fraction high. Keep it around 0.1–0.15.
The three outputs
- tileable - your fixed image. Wire this everywhere downstream (normal, AO, packing).
- tiled_2x2_proof - the image repeated in a 2×2 grid. Feed this to a preview node and just look at the center seam. This is the whole point of the node: instant visual confirmation.
- seam_report - a JSON string with
edge_mae_horizontalandedge_mae_vertical, the mean absolute difference between opposite edges. The closer to 0, the better the tile. It's a number you can actually compare before/after.
Install
ComfyUI Manager (search "ComfyUI Texture Simple"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/gokayfem/ComfyUI-Texture-Simple.git
python -m pip install -r ComfyUI-Texture-Simple/requirements.txt
Restart ComfyUI; it's under texture/PBR. Dependencies: numpy and Pillow, nothing else.
Real-world usage
Texture-Simple's own suggested pipeline is: make the source tileable first, then generate normal and AO maps from the tiled result - because if you derive your normal map from a non-tiling height map, the seam leaks into every map you build on top of it. If you're making a set of PBR maps, tile once at the top and everything downstream stays seamless. And if your albedo tiles but the normal map still shows a line, that's a sign the height map you fed the normal generator wasn't tiled - this node is where that pipeline starts.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| method | COMBO | 2 options: Offset + feather, Mirror | |
| blend_fraction | FLOAT | 0.120.01–0.49 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| tileable | IMAGE | — |
| tiled_2x2_proof | IMAGE | — |
| seam_report | STRING | — |