What is a Tileable Texture? A Deep Dive
Fundamentals · 9 min read
A tileable texture is an image whose edges meet cleanly when it is repeated. Seamless and tileable describe the same property from different angles - tileable emphasizes that the texture repeats, seamless emphasizes that the boundary between copies is invisible. Once you understand what actually happens at that boundary, most texture problems become obvious.
What happens at the boundary
When a texture repeats, every pixel on the right edge touches the left edge of the next copy, and every pixel on the bottom edge touches the top edge of the copy above. If those pairs do not match in colour, you get a visible line. If they match in colour but not in structure, you get something worse: a subtle but readable discontinuity.
The second case is what makes naive texture fixing techniques fail. Offsetting the image and clone-stamping the seam removes the hard line, but the surrounding structure still lines up in a way that the eye picks up as a grid.
- Hard seam: edge pixels differ - a visible line, easy to spot.
- Structural seam: colours match but the pattern direction breaks - the classic grid.
- Tonal seam: no line, but average brightness varies - a repeating checkerboard.
Why photographs rarely tile
A photograph contains lighting that only exists once. The centre is usually brighter than the corners because of the lens, and one edge may catch a shadow. When you tile that frame, that unique lighting becomes a repeating pattern, and the surface develops an obvious checkerboard that has nothing to do with the actual material.
This is the single most common reason generated textures look wrong in a 3D scene, even when no seam is visible.
Periodic noise solves it at the source
The alternative is to never create a unique border in the first place. If the texture is defined by a mathematical function whose lattice wraps exactly at the tile boundary, then the left edge is the same function as the right edge by definition.
Concretely: sample a noise function where the integer grid indices wrap modulo the period. Every octave inherits that wrapping, so the whole texture repeats with zero border at all. Structure stays crisp because nothing was blended or smeared.
// Value noise with a wrapping lattice
const period = 8;
const xa = ((x0 % period) + period) % period; // wraps
const xb = (xa + 1) % period; // wraps
// -> f(0) === f(1) by constructionChoosing the right resolution
Texture resolution is a density decision, not a quality decision. A 1024px tile covering one square metre looks completely different from the same file covering four.
- 512px - mobile, distant surfaces, prototyping.
- 1024px - the standard for most real-time surfaces.
- 2048px - hero surfaces, close-up cinematics, architecture stills.
- 4K and above - offline renders and large-format ArchViz stills.
Practical checks before you ship
- Tile the preview at 3x3 or 4x4 and look for a grid forming at a distance.
- Squint at it - blur the image in your head. Grids show up at low frequency first.
- Rotate the surface 45 degrees and check again. Axis-aligned grids hide diagonally.
- Look at the surface at grazing angles, where repetition is most obvious.
Try it on your own material
Generate a seamless PBR texture pack free in your browser. No upload, no watermark.
Open the generator