Normal Map Generator: Turn Any Image Into a Normal Map
A normal map tells a 3D engine which way each pixel of a surface faces, so a flat plane lights up like stone, brick, wood or fabric without extra polygons. Drop a texture or photo here: the generator works out the bumps from its light and dark areas and builds a tangent-space normal map. Set the strength and detail, choose OpenGL or DirectX, check it under a moving light and download a PNG for Blender, Unity, Unreal or Godot. Your image never leaves your device.
How to make a normal map
- 1
Drop an image
A PNG, JPG or WebP texture or photo. Square, evenly lit textures give the cleanest result.
- 2
Tune it
Strength sets how deep the bumps look; Detail picks big shapes or fine grain. Invert if the dark parts should be raised.
- 3
Check the light
Open the Lit preview and move the pointer: the light follows it, so you see roughly how the relief will look in an engine.
- 4
Download
Save the normal map as a PNG (and the height map if you want it), then plug it into your material.
The settings, explained
| Strength | How steep the slopes are. 2-4 suits most textures; go higher for deep stone or brick, lower for cloth and paper. |
|---|---|
| Detail | Low keeps only the big shapes (stones, planks, tiles), high keeps pores, grain and small scratches. |
| Invert height | The generator treats light areas as raised. Turn this on when it is the other way round, like light grout between dark bricks or a light-colored engraving. |
| OpenGL / DirectX | The two formats differ only in the green channel. OpenGL (Y+) for Blender, Unity, Godot and three.js; DirectX (Y-) for Unreal Engine and 3ds Max. If the bumps look dented, switch it. |
| Seamless | Wraps the edges around, so a tiling texture gives a tiling normal map with no seam. |
| Output size | The longest side, up to 4096 px. Smaller images keep their own size. |
Using the normal map
| Blender | Image Texture (Color Space: Non-Color) into a Normal Map node, then into the Normal input of the Principled BSDF. |
|---|---|
| Unity | Import the PNG, set Texture Type to Normal map, and put it in the Normal Map slot of the material. |
| Unreal Engine | Download with DirectX on. Import it, check that Compression Settings is Normalmap, and connect it to the Normal pin. |
| Godot | Enable Normal Map on the StandardMaterial3D and load the PNG (OpenGL format). |
| three.js | Load it as a texture and set material.normalMap; use normalScale to make it stronger or weaker. |
Where the bumps come from
The tool reads brightness as height: light pixels are high, dark pixels are low. It first removes the slow changes in lighting across the photo, so a shadowed side does not turn into a slope, then measures how steeply the height changes at each pixel (a Sobel filter) and stores that direction as a color. Flat areas come out the familiar light blue (128, 128, 255). This is the same idea desktop tools use; it estimates the shape from shading, so it works best on textures where light and dark follow the relief.
Good to know
- The shape is guessed from shading. Painted patterns, printed logos or colored stripes on a flat surface will turn into bumps too; use Detail and Invert, or a cleaner texture.
- Evenly lit textures work best. Strong shadows or highlights baked into a photo show up as extra relief.
- It makes a tangent-space normal map from one image. It does not bake a high-poly model onto a low-poly one.
- The PNG is 8 bits per channel, which is the usual format for game and web textures.
- Everything runs in your browser, so very large images (4096 px) can be slow on phones.
Want real 3D geometry instead?
A normal or height map makes a flat surface look bumpy. To get real geometry, our AI generators build a full 3D model from a photo or a sentence, with GLB and STL downloads. They use credits; this tool does not.