A faint grid across your upscale
Tiled upscalers denoise each tile independently, leaving a lattice at the joins. Tile overlap, feathered masks, and the seam-fix pass that actually removes it.
A faint grid across an upscale is not grain and it is not "crispness". It is the tile boundaries. A tiled upscaler cuts the image into blocks, denoises each block on its own, and pastes them back. Each tile is a slightly different noise realisation of the same picture, so the joins disagree. The disagreement reads as a lattice: a shift in texture, a change in local contrast, sometimes a hairline of blur, repeating at a regular pitch.
Sharpening does not remove it. Sharpening raises the contrast of the discontinuity and makes the grid easier to see. The fix is to stop giving the sampler a hard edge: overlap the tiles, feather the mask, then run the pass that redraws along the seams rather than hoping the paste will hide.
This is a local-tiling problem (ComfyUI Ultimate SD Upscale and its cousins). Hosted upscalers on Versely do not expose tile size, overlap, or a seam-fix toggle. If a grid appears on a hosted pass, the source already had one, or a previous local tiled upscale left it in the file you uploaded.
Why tiles produce a lattice
Upscaling at large sizes does not fit in memory as one latent, so the graph splits the work. Each tile is noised and denoised independently. Nothing in that step knows what the tile next to it decided about the weave of a jumper or the grain of a wall. Where two decisions meet, you get a seam.
Hard mask edges make it worse. If the tile is a rectangle with a binary mask, the model has no gradient to blend across. The last few pixels of tile A and the first few of tile B are both "interior" as far as each sampler is concerned, and both are "edge" as far as the composite is concerned. That is the opposite of inpainting craft, where a feathered mask and a little breathing room are what make a patch disappear.
The grid is easiest to see on:
- flat or gently graded walls, skies, paper, skin
- fine repeating texture (fabric, concrete, film grain)
- high-frequency noise the upscaler was asked to "enhance"
It is hardest to see on busy, high-contrast detail, which is why a hero crop can look fine and the full frame looks like graph paper.
A related failure shows up in outpainting: a visible line where the new canvas starts, because the mask was a hard rectangle and the extension was denoised without enough of the original edge as context. Same mechanism, different job. The same remedies apply: overlap, a blurred mask, a low-denoise second pass over the whole composite.
Overlap the tiles and blur the mask
Two changes, both about denying the sampler a hard boundary.
Overlap. Adjacent tiles must share a strip of pixels. That strip is denoised from both sides and then blended, so the independent realisations have a region in which to meet. No overlap means a butt-join. Generous overlap means the join sits inside content both tiles agree on. How generous depends on tile size and how obvious the texture is; the test is visual, not a magic pixel count. If you can still see the pitch of the grid, the overlap is too small or the mask is still too hard.
Feather the tile mask. A Gaussian blur on the mask turns the rectangle into a gradient. The model then has a band where tile A fades out as tile B fades in. Hard-edged tiles will seam even with overlap, because the overlap is still being composited as a cliff. Blurred overlap is the combination that actually disappears.
Practical order, on a local tiled upscale:
- Set a tile size the GPU can hold without choking, not the largest number the node allows.
- Add overlap on every edge. If VRAM forces you to choose, smaller tiles with overlap beat larger tiles that abut.
- Blur the tile mask. If the node exposes a mask-blur or padding control, that is this step.
- Generate. Inspect the full frame at 100%, not a punch-in on a busy region.
- If a lattice remains, do not sharpen. Go to the seam-fix pass.
Two 2x tiled passes, each with overlap, are easier to keep seamless than one 4x pass with huge tiles. That matches the general upscaling rule (two 2x usually beat one 4x) and it keeps each seam in a smaller, more controllable band.
The seam-fix pass redraws the join
Overlap and a feathered mask prevent most of the grid. What remains is a low-contrast lattice that you will only see on flat fields. The tool that removes it is not a sharpen slider. It is a second denoise that targets the seams.
Ultimate SD Upscale, the node most of this craft was built around, implements that as an explicit seam-fix stage with four modes (documented in the project's own processing code):
| Mode | What it does | Cost |
|---|---|---|
| None | Pastes the tiles. Fast. Leaves the lattice. | No extra tiles |
| Band Pass | Reprocesses the seam bands, blending low-frequency mismatch while trying to keep high-frequency detail | One extra pass per horizontal and vertical join |
| Half Tile | Takes a new tile centred on each boundary, covering half of each neighbour, and denoises that | Extra pass per edge |
| Half Tile + Intersections | Half Tile on every edge, plus the corners where four tiles meet | Most extra passes; the thorough option |
The half-tile family is the one that actually redraws along the seam lines. It is slower because those redraws are real extra tiles. On a final still, pay for them. On a draft, band pass or even none is fine, as long as you do not judge the draft's grid as "the look".
The pass is not a sharpen, a contrast bump, or a second full upscale (that can re-introduce seams at a new pitch). After it, inspect the old grid lines on a flat region. If they have moved but not vanished, the overlap is still too tight or the mask is still too hard; fix those, then seam-fix again. Repeating seam-fix on a sharpened file is how you etch the lattice in.
Do not hide a remaining grid under sharpening. In video, over-sharpening an upscale (a common "Topaz Sharpness past 50" habit) amplifies flicker the pass was meant to hide. On a still, the equivalent is a crunchy grid. The discontinuity is high-frequency. Sharpening is a high-frequency boost. You are turning the volume up on the defect.
After the fact, and on hosted upscalers
If the file already has a grid, you can still treat the seams as an inpaint.
- Mask the lattice lines with a feathered brush, not a one-pixel stroke.
- Run a low-denoise pass so the surrounding texture is the context and the mask is a blend, not a new picture.
- Prefer a whole-frame low-denoise second pass when the grid is everywhere: it is the same idea as the outpaint advice (a second pass over the composite, original blended with the extension by mask rather than a hard paste).
For outpaint specifically: feed generous edge context, blur the mask at the old border, and do not hard-paste the extension onto the original. An Image Blend by Mask-style composite is the join; the denoise is the paint.
Hosted upscalers on Versely (Topaz Image, SeedVR, or the editor upscale) do not give you tile size, overlap, or a seam-fix mode. They are the right tool when you want a single-pass enlarge of a clean source. They will faithfully enlarge a lattice that is already in the pixels. If you tiled locally, finish the seam-fix before you upload. If you never tiled and a hosted pass still shows a grid, look at the source at 100%: compression blocks and previous upscales tile on their own, and an upscaler treats those blocks as detail.
The decision of whether to generate large or generate small and upscale is a different article: upscale the render or generate at full resolution. The rule on this page is narrower. When you do tile, overlap, feather, and redraw the join. Do not sharpen the grid and call it texture.
FAQ
Why does sharpening make the grid more obvious?
Because the seam is a high-frequency discontinuity and sharpening is a high-frequency boost. You are increasing the contrast of the join. Remove the join with overlap, a feathered mask, and a seam-fix denoise. Sharpen after the lattice is gone, if the file still needs it.
Do Versely's upscalers tile like Ultimate SD Upscale?
They do not expose tile size, overlap, or a seam-fix toggle, so you cannot run this workflow on them. Treat them as a single-pass enlarge. If a grid appears, it was almost certainly in the source, or in a local tiled upscale you ran first. Finish seams before you upload, or skip tiling and use the hosted pass on a clean native file.
How much overlap is enough?
Enough that you cannot see a repeating pitch on a flat wall at 100%. If VRAM is tight, smaller tiles with overlap beat large tiles that touch on the edge. There is no single pixel number that travels across tile sizes, models, and textures. Raise overlap until the grid goes, then stop so you are not denoising the same pixels four times for no gain.
Can I fix a grid without rerunning the whole upscale?
Yes. Mask the seam lines with a feathered brush and run a low-denoise inpaint, or run a low-denoise pass over the whole frame so the tiles have a chance to agree after the fact. That is slower to get perfect than doing overlap and seam-fix on the original upscale, and it is the right rescue when you no longer have the tiled graph. Do not sharpen as the rescue.