Normal Map Generator
Drop a height map or greyscale image and get a tangent-space normal map. Adjust strength, smooth noisy sources, choose OpenGL or DirectX, and check the lit preview before export. Images are read in this tab; nothing uploads.
Drop in a height map, adjust the strength, and add blur if the source is noisy. Choose OpenGL for Blender, Maya, Unity, and glTF, or DirectX for Unreal and 3ds Max. Use the lit preview to check the result: if bumps look like dents, flip the format before downloading.
How It Works
The tool treats your image as a height field (luminance = elevation) and runs a Sobel filter over it - for every pixel it measures how steeply the height changes horizontally and vertically. Those two slopes define the surface normal at that point: flat areas point straight out (the flat-blue 128,128,255), slopes tilt the normal and shift red or green. Strength simply scales the slopes before normalising - higher values read the same height differences as steeper geometry.
With wrap edges on, the filter samples across the texture border as if the image tiled - the right choice for seamless textures. Turn it off for one-off decals or bakes with dead borders, and the edge pixels clamp instead.
OpenGL Vs DirectX
OpenGL-style and DirectX-style tangent-space normal maps use opposite green-channel conventions. Check the convention expected by your renderer and material. If a bump appears inverted, compare both formats under the same light. Unreal also provides a per-texture Flip Green Channel setting.
Move the cursor across the lit preview to change the light direction. Check that raised details behave as expected, then confirm the result in your engine before committing to the export settings.
Getting Good Results
- A photograph isn’t a reliable height map. A photo's brightness is mostly albedo, not height - expect to add 1-2px of pre-blur and keep strength modest, or surface colour may be interpreted as raised detail.
- Blur before strength. If the output looks crunchy, try a little blur before reducing the strength - blur removes the per-pixel noise the Sobel filter amplifies most.
- Large inputs are downscaled to 2048 on the long edge to keep the browser responsive; bake final hero maps in your DCC if you need more.
- Import as a normal map. In-engine, mark the texture as a normal map (Unreal sets BC5 compression and sRGB off automatically; in Unity switch the texture type) - sampling it as colour will break the decode.
Privacy
Your input files and calculations are processed in this browser tab. The tool doesn’t upload them. The site uses Google Analytics for site usage; see how the site works.
