Depth your renderer can read.
A normal map stores a direction in each pixel instead of storing visible color. Your material uses those directions to react to light as if tiny ridges, dents, seams, and pores were part of the mesh. This generator derives those directions from image brightness and keeps the complete conversion on your device.
Start with useful contrast
Bright areas are interpreted as higher and dark areas as lower. A dedicated grayscale height map gives the most predictable result, but a photo or painted texture can work when its brightness already describes surface relief. Use smoothing to suppress photographic noise before increasing strength.
Sobel or Scharr
Sobel is familiar, efficient, and often suitable for graphic textures. Scharr places more balanced weight around each pixel, which can produce steadier diagonal detail. Neither option invents geometry; both measure changes in the source height field and encode the resulting surface direction.
OpenGL versus DirectX
The two formats mainly disagree about the green channel. OpenGL convention uses Y+, while many DirectX pipelines expect Y−. If grooves appear raised or lighting moves in the wrong vertical direction, switch the format instead of rebuilding the texture. The preview and downloaded PNG update together.
Clamp or wrap edges
Clamp repeats the border pixel and works well for isolated assets. Wrap samples the opposite edge, which is more appropriate for tileable surfaces. Use the 2× or 4× tiled preview to spot border discontinuities before export. The tile control changes inspection only, not the downloaded map.
- Add a sourceChoose a PNG, JPG, or WebP, drag it into the input panel, or begin with a built-in sample.
- Tune reliefAdjust strength, smoothing, filter, orientation, height inversion, and edge behavior.
- Inspect lightingCompare source and normal views, then move the material light with a pointer or the X/Y sliders.
- Export PNGDownload the full generated normal map. Nothing is sent to a server during conversion.
Normal map generator FAQ
Does this tool upload my texture?
No. Image decoding, filtering, preview rendering, and PNG creation happen in the browser. The service has no upload endpoint, analytics script, account system, or third-party image processor.
Should white be high or low in the source?
By default, white is treated as high and black as low. Enable Invert height when your source uses the opposite convention or when the result looks embossed instead of engraved.
Which normal map format should I use?
Use the format your target engine requests. Blender and many OpenGL workflows typically use Y+, while several DirectX pipelines use Y−. If uncertain, import a small test and confirm the green-channel direction under a known light.
Can I use a color photo?
Yes. The tool converts RGB brightness into a height field. However, color changes caused by paint or lighting may become false bumps. A cleaned grayscale height image usually creates a more controlled material.
Why is the preview limited to a 1200-pixel edge?
Large images are resized for predictable interactive performance on phones and ordinary laptops. This is an explicit working limit, not an upload limit, because processing stays local. The output keeps the working dimensions shown in the interface.