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