Free tool

Seamless texture checker

Drop a texture to see whether it tiles cleanly. The checker repeats it up to 5 × 5, measures how far the opposite edges differ, says whether the size is a power of two, and offsets it by half so the seams sit in the middle for retouching. It works on colour maps and normal maps as PNG, JPG or WebP, in your browser, with nothing uploaded.

Last updated

Drop the tile you want to check

  • Never uploaded
  • Free, no account

Step by step

  1. Drop the texture

    Drop one PNG, JPG or WebP texture above: a colour map, normal map, roughness map or any other tiling image.

  2. Look at the repeat

    Switch to 5 × 5 to spot brightness drift and repeating features, then zoom in on a join. Grid is the usual repeat for game textures.

  3. Read the numbers

    The edge check gives the measured difference across the left/right and top/bottom joins next to the normal pixel-to-pixel change near each edge. The bar above says whether the size is a power of two.

  4. Fix and recheck

    Download the offset texture as PNG or layered PSD, retouch the cross through the middle, export it again and drop it back here.

How can I tell if a texture tiles without seams?

Repeat it several times and check that the last column of pixels flows into the first and the last row into the top one. If the edges jump, every copy draws a line on the wall, floor or terrain it covers.

The checker gives you two ways to see it:

  • The 5 × 5 repeat. Good for problems that only show at a distance: one corner brighter than the rest, a stain or a crack that repeats in a visible rhythm, or a gradient that turns into stripes.
  • The edge check. A number for each join, on a 0 to 255 scale, set next to how much neighbouring pixels change just inside the edge. A clean join changes about as much as the texture around it does.

What edge mismatches look like in numbers

These are measurements from test textures we generated for this page, checked as a grid repeat. “Beside” is the normal change between neighbouring pixels near that edge.

Test texture Left/right join Top/bottom join Verdict
Normal map made to wrap exactly, 256 × 256 PNG 1.7 (beside: 1.7) 1.2 (beside: 1.1) Joins cleanly
The same normal map saved as lossy WebP 3.9 (beside: 1.6) 3.2 (beside: 1.1) Seam may show
Colour texture lit unevenly, up to 30% darker on the left, 512 px PNG 40 (beside: 0.6) 0.3 (beside: 0.4) Left/right seam likely visible
Random plasma texture, not made to tile, 1000 × 700 WebP 82 (beside: 1.7) 79 (beside: 1.9) Both seams likely visible

The WebP row is worth noting: the normal map was seamless as a PNG, and lossy compression alone more than doubled the difference across both joins. Keep source textures in a lossless format and compress at export.

The uneven lighting row is the most common real case: a photo of a surface taken with light from one side. Each edge looks fine on its own, but the dark side meets the bright side at every join.

Why does power-of-two size matter?

Some targets can only repeat a texture if both sides are a power of two, such as 256, 512, 1024 or 2048 px. MDN’s WebGL guide puts it plainly for WebGL 1: a non-power-of-two texture must use clamp-to-edge wrapping and can’t have mipmaps, while a power-of-two texture can use REPEAT (MDN: Using textures in WebGL).

The bar above the viewer shows the texture size and adds “power of two” when both sides qualify. If yours doesn’t, resize it in your editor before you fix seams, because resizing resamples the edges too.

Size Power of two
512 × 512, 1024 × 1024, 2048 × 2048 Yes
1024 × 512 Yes, both sides are powers of two
1000 × 1000, 1920 × 1080 No

How do I fix the seams in a texture?

Offset it by half so the edges meet in the middle, retouch that cross, and check again. Select Offset by half to preview it, turn on seam lines to see exactly where the old edges run, and download the offset texture as PNG or as a layered PSD with the original and a seam guide layer kept hidden underneath.

Clone or heal across the cross without touching the outer border, since the border already joins correctly after the offset. Then drop the fixed texture back here; the numbers for both joins should drop close to the “beside” values.

What the texture checker can’t see

  • Seams caused by UV layout, texture filtering or mipmaps in your engine. It only checks the image file.
  • Values beyond 8 bits per channel, formats other than PNG, JPG and WebP, and textures over 8192 x 8192 pixels.
  • Data packed into the alpha channel. The browser rounds the colour under transparent pixels when it reads the file.
  • Whether a normal map is in the right convention for your engine. It checks the stored values, not what they mean.
  • It doesn’t repair anything. Retouching stays in your editor.

Questions

Can I check a normal map?

Yes. The checker compares the stored red, green and blue values, which for a normal map are the surface directions. A jump at the edge of a normal map shows up as a lighting crease in the scene, and it shows up here as a high left/right or top/bottom number.

Does it read 16-bit textures?

It reads them, but at 8 bits per channel, because that is what the browser hands to the page. Differences smaller than one step out of 255 round away, and the downloads are 8-bit.

Does the offset change my texture values?

Not for an opaque texture saved without a colour profile, such as a typical normal map: every pixel in the offset tile is a pixel from your texture, moved by half the width and half the height with wrap around, with no resampling. The browser does change two things when it reads a file. A colour profile other than sRGB is converted to sRGB, and colour stored under transparent pixels is rounded, or lost where the pixel is fully transparent. Keep textures that pack data into alpha out of it.

Why does it say my texture is not a power of two?

Its width or height is not 2, 4, 8 and so on up to 1024, 2048 or 4096. That matters on targets such as WebGL 1, where a non-power-of-two texture can't use repeat wrapping or mipmaps.

Can it make my texture seamless?

No. It shows where the seams are, how strong they are, and moves them into the middle for you to paint over. Automatic seam removal blends or mirrors the edges, which tends to leave a soft band or a mirrored look that is easy to spot when tiled.

Are my textures uploaded?

No. The browser decodes the file and the page does the checks and the downloads on your computer. Nothing is sent anywhere, which you can confirm in your browser's network panel.

Have a .procreate file to open?

Get a layered PSD in seconds. Your first one is free, and the file never leaves your computer.