π SuperPBR Tile Stitch
The node that hides 25 tiles' worth of seams
- albedo
- orm
- tilesig
- albedo
- orm
You split a texture into tiles, decomposed them, and now you have a batch of 25 little albedo maps and 25 little ORM maps that need to become two big ones again. Paste them side by side and you get a plaid quilt of visible seams, because each tile was decomposed in isolation and came back with slightly different colour and tone. π SuperPBR Tile Stitch exists to make that disappear, and unlike most "seamless" promises it actually does the work.
How the blend works
It takes the albedo and orm tile batches plus the tilesig from Tile Split, and reassembles both through the same routine. For each tile it builds a 2D weight window: 1.0 across the tile's exclusive interior, ramping linearly from 0 to 1 across each overlapped edge. A tile that sits flush against an image border keeps a weight of 1 on that side, so the outer edge doesn't fade to nothing.
Then every tile is multiplied by its window and accumulated into a padded canvas, with a running sum of the same windows. Divide one by the other and overlapping regions come out as a weighted average: 50/50 at the exact centre of an overlap, sliding smoothly to 100% of whichever tile owns that pixel as you move away from the join. Finally it crops to the original height and width, exactly, so the replicate padding the splitter added never reaches your output.
That's linear feather blending, and it's the right level of sophistication here. The tile boundaries in a material map aren't structurally meaningful; you just want no visible line.
Wiring it
albedo and orm come from SuperPBR Material's two outputs, untouched - feed the tile batches straight in. tilesig comes from the same Tile Split that produced them, and it carries the grid's geometry: tile size, overlap, stride, tile counts, original dimensions, batch size.
That signature is doing real work as a guard. Wrong tile batch - say you accidentally stitched after changing tile_size on the splitter, or the batch got reordered by some node in between - and you get a clear error: tile batch does not match the tilesig grid (N tiles of T px expected, got ...). Better than a silent offset that shows up as a visible step halfway across your texture.
Two outputs, albedo and orm, at the original resolution and batch size. From there the ORM goes into ORM Split for separate roughness and metallic maps, and the albedo goes to SaveImage or straight into a material. Stitch first, split after - if you run ORM Split on the tiles you end up with three tile batches and you'll be stitching three times instead of once.
When seams survive
The blend can't fix a difference the blend didn't cause. If your stitched result shows a soft but coloured patchwork - one tile warmer than its neighbour - that's tile-to-tile drift, where the model made independent colour decisions per tile. Stitching averages it; it doesn't remove it. The fix lives one step earlier: wire Tile Split's anchor_image and tilesig into SuperPBR Material's matching optional inputs. The decomposition node then makes an extra global pass over the downscaled whole image and blends each tile onto it with a frequency split in pixel space, so colour and tone come from the global pass and detail from the tile. Both inputs, or the blend doesn't engage.
If instead you see a hard line at a tile boundary, check your overlap. At overlap 0 the weights abut rather than blend, and there's nothing for the feather to work with.
And one honest note on roughness and metallic: a seam in ORM is often more visible than a seam in albedo, because roughness tends to sit in flat plateaus. Where two neighbouring tiles disagree by a few percent on a large smooth area, your eye catches the step even though the numbers are close.
Install
ComfyUI Manager β search the pack title, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Hullabalo/ComfyUI-SuperPBR.git
Restart. No dependencies, no model files needed for the stitch itself. This node is pure tensor blending - the whole tiled pipeline is: Tile Split β SuperPBR Material β Tile Stitch β ORM Split, with the anchor_image/tilesig pair wired back into the material node to close the loop. Both examples in the repo's workflows/ folder are worth a look before you build it by hand.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| albedo | IMAGE | Albedo tile batch to reassemble. | |
| orm | IMAGE | ORM tile batch on the same grid. | |
| tilesig | TILESIG | Grid signature from TileSplit. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| albedo | IMAGE | β |
| orm | IMAGE | β |