Free tool

Normal Map Generator

Drop in any image and get a tangent-space normal map back instantly. Adjust the strength, pick OpenGL or DirectX, download the PNG. Nothing is uploaded.

  • 100% free
  • Nothing uploaded
  • OpenGL & DirectX
  • Instant PNG

How the normal map generator works

Drop in a texture and this tool hands you back a tangent-space normal map. It reads the image’s brightness as a height field, runs a Sobel gradient to measure the slope at every pixel, and encodes that surface direction into RGB — the purple-blue image your engine reads to fake bumps without adding geometry. No upload, no sign-up, no watermark; it all happens on your device.

What the strength slider does

Strength scales the gradient before it’s turned into a direction. Low values give a subtle, flat surface; high values exaggerate every crevice and edge. There’s no single correct number — push it until the relief reads right under your lighting, but beyond about 4× most surfaces start to look faceted and fake.

OpenGL vs DirectX — get the green channel right

This is the bug that wastes the most time. OpenGL and DirectX disagree on which way the green channel points: OpenGL wants Y up (Blender, Godot, Unity, Substance Painter), DirectX wants Y down (Unreal Engine). Use the wrong one and your bumps read as dents. The toggle above flips the green channel so you don’t have to. For the full story, see normal map vs bump map.

When luminance-based generation works (and when it doesn’t)

Inferring a normal map from a single image is an approximation: the tool assumes brighter pixels are raised. That works well for evenly lit, matte surfaces — brick, concrete, fabric, wood grain, stone. It works poorly for glossy, transparent, or strongly shadowed photos, where brightness comes from reflections rather than depth. For those, or when you need a normal that agrees with a matching roughness map and the rest of a PBR set, generating the whole material together gives a far better result than deriving each map in isolation.

Need the whole PBR material, not just the normal?
CraftPBR Studio turns a text prompt or photo into all five maps — albedo, normal, roughness, AO, metalness — seamless and CC0. Free to try.
Open Studio →

How to use the normal map in your engine

  • Unity — set the texture’s import type to Normal Map, assign it to the Normal Map slot. Use the OpenGL output.
  • Unreal — import, wire a Texture Sample into the Normal pin. Use the DirectX output.
  • Blender — add a Normal Map node between the texture and the Principled BSDF, set the texture to Non-Color. Use OpenGL.
  • Godot — enable Normal Map on a StandardMaterial3D and assign the texture. Use OpenGL.

Frequently asked questions

How do I generate a normal map from an image?

Drop an image into the tool above. It reads the image’s brightness as a height field, runs a Sobel gradient to find the slope at every pixel, and packs that surface direction into an RGB normal map. Adjust the strength slider, pick your engine’s Y convention, and download the PNG. It all runs in your browser — nothing is uploaded.

Is this normal map generator free?

Yes, completely free with no sign-up and no watermark. The whole thing runs client-side on your device, so there are no usage limits. For a full PBR set — albedo, roughness, AO and metalness alongside the normal — use CraftPBR Studio.

What is the difference between OpenGL and DirectX normal maps?

They disagree on which way the green channel points. OpenGL expects Y up (Blender, Godot, Substance, Unity); DirectX expects Y down (Unreal Engine). If your surface looks inverted — bumps reading as dents — switch the toggle. The tool flips the green channel for you.

What kind of image should I use?

Best results come from a height-like or evenly lit surface photo — brick, stone, fabric, wood grain, concrete. Brightness should track depth (lighter = raised). Glossy or strongly shadowed photos confuse the height read, because the tool infers depth from luminance, not true geometry.

Does the tool upload my image anywhere?

No. The image is read and processed entirely in your browser with the Canvas API. It never leaves your device, which is also why it works offline once the page has loaded.