Load a texture photo and get a matching normal map, height (displacement) map, roughness map and ambient occlusion map in seconds. Tune strength, blur and contrast, check the result on a lit 3D sphere, plane or cube, and download PNGs for Blender, Unity, Unreal or Godot. Everything is computed on your device.
Last updated:
3D preview
Drag the model to rotate it. Compare with the Normal map box unticked to see the difference.
Advertisement
Advertisement
How to use the Normal Map Generator
Load a texture by dropping a photo into the box, choosing a file or pasting an image. A brick sample is loaded so you can explore first.
Shape the height with Invert, Blur and Height contrast. Bright pixels become high, dark pixels low.
Adjust the normal map with Strength and pick OpenGL or DirectX to match your engine. Turn on Seamless edges for tiling textures.
Tune roughness and AO, then check the lit 3D preview. Drag to rotate the model.
Download the map you are viewing or press Download all maps (ZIP).
How the maps are calculated
Every map starts from a height map. The photo's brightness is measured with the Rec. 709 luminance weights Y = 0.2126 R + 0.7152 G + 0.0722 B, so bright pixels count as high and dark pixels as low (or the other way round with Invert). A Gaussian blur removes pixel noise that would otherwise turn into a grainy normal map, and Height contrast stretches the values around their average.
The normal map comes from the slope of that height field. For each pixel a 3 × 3 Sobel filter (weights 1, 2, 1) or Scharr filter (3, 10, 3) measures the change in height left to right (dx) and top to bottom (dy). The surface normal is the vector n = normalize(−dx · s, −dy · s, 1), where s is the Strength, and each component is stored as color = (n + 1) / 2 × 255. A flat area therefore becomes (128, 128, 255), the familiar lavender blue.
The ambient occlusion map compares each pixel with the blurred average of its surroundings at two radii: pixels that sit lower than their neighbourhood (cracks, mortar joints, gaps between stones) are darkened in proportion to how deep they are. The roughness map is a contrast-adjusted copy of the brightness, by default inverted so darker, dirtier areas become rougher.
Which map goes where?
Map
Color space
Blender (Principled BSDF)
Unity (URP/HDRP Lit)
Unreal Engine
Normal
Non-color / linear
Normal Map node → Normal (OpenGL)
Normal Map slot, texture type Normal map (OpenGL)
Normal input, use DirectX or flip green
Height
Non-color
Displacement node or Bump node
Height Map (parallax)
World Position Offset / Displacement
Roughness
Non-color
Roughness
Smoothness = 1 − roughness (invert, or pack in alpha)
Roughness
AO
Non-color
Multiply with Base Color, or use for baking
Occlusion Map
Ambient Occlusion
Unity's Lit shaders use smoothness rather than roughness, so invert the roughness map (or untick "Darker = rougher" and adjust) before using it there.
Tips for better results
Use flat, evenly lit photos. Strong shadows and highlights are read as height. Overcast daylight or a light tent gives the cleanest normal maps.
Start subtle. A Strength of 1 to 4 looks natural on most materials; very high values make every speck look like a crater.
Blur for big shapes, no blur for fine detail. Raise Blur on stone and bricks so the large forms dominate; keep it low on fabric, leather or skin pores.
Check the direction. If mortar or cracks look raised in the 3D preview, tick Invert height.
Match your engine. Choose DirectX for Unreal and 3ds Max, OpenGL for Blender, Unity and Godot. The file name records which one you exported.
Make it seamless first. For tiling materials, make the color texture seamless, then generate the maps with Seamless edges ticked so every map tiles the same way.
Frequently asked questions
What is a normal map?
A normal map is an RGB image that stores the direction a surface faces at each pixel. Red holds the X (left to right) slope, green the Y slope and blue the part pointing straight out of the surface. A 3D engine uses it to light a flat polygon as if it had bumps, cracks and grooves, without adding geometry. That is why most normal maps look light purple-blue: flat areas encode the vector (0, 0, 1) as RGB (128, 128, 255).
How does this tool make a normal map from a photo?
It first converts the photo into a height map, treating brighter pixels as higher. It then measures how fast the height changes left to right and top to bottom with a Sobel or Scharr filter, multiplies those slopes by the Strength value and normalizes the vector (-dx, -dy, 1) for every pixel. The result is mapped from the -1 to 1 range into 0 to 255 color values.
Should I choose OpenGL or DirectX?
They differ only in the green channel. OpenGL style (Y+, green up) is used by Blender, Godot, Unity and Maya. DirectX style (Y-, green down) is used by Unreal Engine, 3ds Max and Substance's DirectX preset. If your bumps look like dents in your engine, switch the option or flip the green channel there.
Is a normal map generated from a photo accurate?
It is an approximation. A single photo cannot tell color from depth, so dark paint can be read as a groove and highlights as bumps. It works best on evenly lit, mostly matte textures such as stone, brick, bark, concrete, fabric and wood. Use Blur to ignore fine noise, Invert if depth reads backwards and a modest Strength for realistic results. For exact detail, bake normals from a high-poly 3D model instead.
What do the roughness and ambient occlusion maps do?
Roughness tells a PBR shader how blurry reflections are: white is fully rough and matte, black is smooth and glossy. Ambient occlusion darkens crevices that receive less indirect light; it is multiplied with the base color or ambient lighting. Here roughness is derived from the photo's brightness and AO from how much lower each pixel is than its surroundings, both adjustable.
How do I make the maps tile seamlessly?
Start with a texture that already tiles (you can prepare one with a seamless texture maker), then turn on Seamless edges. The filters will then wrap around the borders instead of clamping, so the left and right, top and bottom edges of every map line up without a visible seam.
Are my images uploaded?
No. The image is decoded and processed by JavaScript and WebGL in your own browser, so it works privately and even offline once the page has loaded.
Are all the tools on FreeToolCabin tested for quality and accuracy?
Yes! Every tool on our site undergoes automated Q/A testing in real browser environments to ensure high precision, correct output, and zero errors. If you happen to spot a bug or have a suggestion, please contact us at [email protected] and our team will review it right away.