Normal Map Generator

Upload a height map or any image — we use luminance as height. Set strength and options, then download your normal map. All in your browser.

Drop a height map or image

We use luminance as height. Upload PNG, JPEG, or WebP — set strength and generate a normal map. All in your browser.

Or click to browse

PNG, JPEG, WebP

How it works

Upload a height map (grayscale) or any image. We convert luminance to height, compute surface normals, and output a tangent-space normal map (RGB). Use in Unity, Unreal, Godot, or any engine.

How It Works

1

Upload a texture

Drop in a diffuse or height image to derive surface detail from.

2

Tune strength and detail

Adjust the settings while watching the live preview of the generated normal map.

3

Export the normal map

Download a PNG normal map ready for your engine's material system.

Frequently Asked Questions

A texture that encodes surface direction per pixel, letting flat geometry react to light as if it had bumps and grooves — detail without extra polygons.

Yes. The generator infers height from luminance and converts it to normals. Results are best on textures where brightness roughly tracks depth, like stone, wood grain, or fabric.

Yes — engines like Unity, Godot, and Phaser support normal-mapped 2D sprites, which lets dynamic lights give flat art convincing depth.

Engines disagree on the green channel: OpenGL-style (Godot, Blender) points +Y up, DirectX-style (Unity's default in some pipelines, Unreal) points it down. If bumps look like dents, flip the green/Y channel — most engines expose this as an import toggle.

The lavender blue RGB(128, 128, 255) — that encodes a normal pointing straight out of the surface. Large areas far from that color mean the generator is reading your texture's brightness as slope, so lower the strength if flat areas are getting unwanted relief.

Carefully. Block compression artifacts distort the encoded directions and show up as banding or shimmer under moving light, much sooner than on color textures. Use your engine's dedicated normal-map import type (which picks an appropriate format) rather than treating it as a regular sprite.