Skip to content
Normalforge

Normal maps and PBR textures in your browser

Seamless Normal Map Generator

Turn any texture into a normal map that tiles: the image is made seamless first and the normal map is computed across the wrap edge.

Free · runs in your browser · nothing is uploaded

Open on Normalforge

This embed was switched off for this website. Open on Normalforge

Add this tool to your siteFree embed code, no sign-up. Keep the credit link.

Embed this tool

Copy this code into your website, blog or class page. The tool runs inside your page.

Optional settings, added to the address after embed=1: &accent=0f6b5c (colour, 3 or 6 hex digits). Other parameters are ignored.

Please keep the credit link below the tool.

A seamless normal map generator makes a normal map that repeats across a surface with no visible line where the copies meet. That takes two steps, and this page does both: it first makes your photo or texture tileable, then it computes the height and normal map with wrap-around edges, so the slopes at the left border are worked out from the pixels at the right border. You get three files that tile together: the tileable colour texture, the height map and the normal map. A seam ratio measured before and after shows how much of the original seam is left, and a 2 × 2 tiled view lets you check the join by eye.
Seamless normal map generator example

How to use the Seamless Normal Map Generator

  1. Drop a photo or texture on the tool, paste it or press Choose image. Try a sample loads a crop of a brick wall whose edges do not match.
  2. Choose the Method: Offset and blend (default, keeps the size), Mirror (doubles the size, symmetric) or Edge ramp (removes the brightness step at the edges).
  3. Set Blend width (0.05 to 1, default 0.5): how far into the image the transition reaches, as a fraction of half the image.
  4. Set Strength (0 to 20, default 4) and Smooth (blur) (0 to 10 px, default 1) for the relief.
  5. Keep Remove uneven lighting (default 0.5) above 0, so a bright corner does not become a slope that breaks the tiling.
  6. Pick Height from and the Normal map convention.
  7. Read Seam ratio before and Seam ratio after in the stats, tick Show 2 × 2 tiled in the result view, and set Tiling to 3 × 3 in the 3D preview.
  8. Press Download Normal map, Download Texture, Download Height map or Download all (ZIP).

Use all three files together. Mixing the new normal map with the original, untiled colour photo brings the seam back in the colour.

Choose the crop before you load it. An evenly lit patch without a single eye-catching feature tiles far better than a whole wall with a window, whatever method you use. If Seam ratio after is still above 1.5, widen the blend or try another method; the number and the 2 × 2 view should agree.

Why does a normal map show seams when it tiles?

There are two causes. The texture itself does not match at its edges, so the colour jumps where copies meet. And a normal map computed without wrapping treats the border as the end of the surface, so the slopes along the edge are wrong. Either one draws a line at every repeat, and fixing only the colour leaves the line in the lighting.

This page removes both. The texture is blended so that its opposite edges continue each other, and then the edge filter reads past each border into the opposite side, as if the image were already repeated.

How the methods compare:

MethodSizeLookWatch out for
Offset and blendsamenaturala softer, ghosted band where the shifted copy is mixed in
Mirrordoubledalways tiles, visibly symmetricmirrored patterns read as kaleidoscopic
Edge rampsamekeeps detail sharpflattens a brightness gradient across the image

What is the seam ratio?

The seam ratio divides the average step between pixels that touch across the wrap edge by the average step between ordinary neighbouring pixels. About 1 means the edge looks like any other pixel step, so no seam is visible. On the built-in brick crop it falls from 17.95 before to 0.35 after with the default settings. Values below 1 simply mean the blended border area is smoother than the rest.

Which method should I pick?

Start with Offset and blend. Switch to Edge ramp when the ghosting in the middle bothers you and the texture has no strong light gradient, and to Mirror for patterns where symmetry does not show, such as noise, sand or fabric.

What happens at the edges of the normal map?

With wrapping, the pixel in the last column uses the first column as its right-hand neighbour, and the bottom row uses the top row. The slopes across the border are then the same as anywhere else in the texture, so the lighting continues through the join. Without wrapping, the edge filter would repeat the border pixel instead, and a thin flat line would appear at every repeat.

Questions and answers

How do I make a normal map tile?

Make the texture tile first, then compute the normals with wrap-around edges. This page does both from one upload, so the colour, height and normals all match.

Can I use an existing normal map?

Not here: blending normal maps as images breaks the vectors. Make the colour texture tileable, then generate the normals from it, or rebake the normal map from tileable height.

Why does the same strength look different on large and small images?

It should not: strength is scaled with the image size, so a 512 px and a 2048 px copy of the same texture get the same relief.

Why does the tiled preview still show repetition?

The seam is gone, but a distinctive spot repeats in a grid. Pick a crop without one, or use a larger tile.

Which normal map convention should I pick?

OpenGL (Y+) for glTF, Unity and Godot, whose documentation asks for Y+. Choose DirectX (Y−) if your engine expects it.

Does Mirror work for bricks?

It tiles, but mirrored bricks break the running bond pattern. Offset and blend suits regular patterns better.

Is the height map tileable too?

Yes. It is computed from the tileable texture with the same wrap-around edges, so the height, the normals and the colour all line up.