Free · runs in your browser · nothing uploaded

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.

Loading the tool...

How to make a normal map

  1. 1

    Drop an image

    A PNG, JPG or WebP texture or photo. Square, evenly lit textures give the cleanest result.

  2. 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. 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. 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

StrengthHow steep the slopes are. 2-4 suits most textures; go higher for deep stone or brick, lower for cloth and paper.
DetailLow keeps only the big shapes (stones, planks, tiles), high keeps pores, grain and small scratches.
Invert heightThe 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 / DirectXThe 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.
SeamlessWraps the edges around, so a tiling texture gives a tiling normal map with no seam.
Output sizeThe longest side, up to 4096 px. Smaller images keep their own size.

Using the normal map

BlenderImage Texture (Color Space: Non-Color) into a Normal Map node, then into the Normal input of the Principled BSDF.
UnityImport the PNG, set Texture Type to Normal map, and put it in the Normal Map slot of the material.
Unreal EngineDownload with DirectX on. Import it, check that Compression Settings is Normalmap, and connect it to the Normal pin.
GodotEnable Normal Map on the StandardMaterial3D and load the PNG (OpenGL format).
three.jsLoad 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.

Frequently Asked Questions

Yes. It runs in your browser with no signup, no watermark and no limit on how many maps you make.
No. The image is read and processed on your device, and the normal map is made there too. Nothing is sent to a server.
OpenGL for Blender, Unity, Godot and three.js; DirectX for Unreal Engine and 3ds Max. They differ only in the green channel. If the bumps look pushed in instead of out, you have the other format: switch the toggle and download again.
Drop the photo here, set Strength to taste, and check the Lit preview. A straight-on photo of the surface in soft, even light works best. Download the PNG and use it as the normal map of your material.
Either the format is wrong for your engine (switch OpenGL/DirectX) or the texture has dark parts that should be raised. In that case turn on Invert height.
Yes. The height map used to build the normal map can be downloaded as a grayscale PNG with the second button. It holds surface detail (the overall lighting is removed), so use it for bump or parallax detail rather than large-scale displacement.
If your texture already tiles, turn on Seamless: the edges wrap around, so the normal map tiles without a seam.
PNG, JPG and WebP (and most other formats your browser can open), up to 40 MB. The output is always a PNG.