Normal map

Upload a sprite or pick one from your gallery. We'll read its 3D form and build a normal map for dynamic lighting.

Recent sprites

Normal map generator for pixel art and sprites

Most normal map generators guess depth from brightness: they run an edge filter over the image and hope. This one is different. It is an AI model trained on real 3D geometry, so it reads your sprite's actual form (a barrel chest, a raised arm, a round apple) and encodes true surface direction into the map. The output keeps a pixel-exact copy of your sprite's silhouette, and animations are processed frame by frame with zero flicker.

How it works

  1. Upload a sprite or pick one from your gallery (32 to 256px per frame)
  2. Set extra detail: 0 stays truest to the 3D form, higher re-adds drawn shading
  3. Pick your engine format: OpenGL (Godot, Unity) or DirectX (Unreal)
  4. Generate, check the live lit preview, then download as <name>_n.png

Features

  • AI trained on real 3D geometry, not an edge-detect filter
  • Pixel-exact silhouette: the map's alpha matches your sprite 1:1
  • Animations mapped frame by frame, deterministic so nothing flickers
  • Live lit preview: move your cursor to light the sprite before you download
  • OpenGL and DirectX output, ready for Unity, Godot, Unreal, Phaser or WebGL

FAQ

What is a normal map?

A texture that stores surface direction instead of color. Your game engine uses it to calculate how light hits each pixel, so a flat sprite reacts to torches, day cycles and spell effects as if it had real depth.

Why are normal maps purple?

The purple-blue tint is the color of 'facing the camera'. Each channel stores an axis of the surface direction (red = X, green = Y, blue = Z), and a mostly flat surface points at the viewer, which encodes as that familiar lavender blue.

How do I use it in my engine?

Download the map and save it next to your sprite as <name>_n.png, the naming most engines auto-detect. Assign it as the normal (or bump) texture on your sprite's material, then add a light. Godot, Unity and WebGL want the default OpenGL output; Unreal wants the DirectX option.

Does it work on animations?

Yes. Each frame is processed independently and restitched into the same sprite sheet layout, so the map drops into your engine exactly like the animation itself. The model is deterministic, so frames never flicker.

Why not just use a filter tool like Laigter or SmartNormap?

Filter tools estimate depth from brightness, so a dark belt reads as a dent and a bright outline reads as a ridge. This model learned from real 3D renders, so it reconstructs the form the pixels depict. Bulk reads as bulk regardless of how it is shaded.

What sizes are supported?

32 to 256px per side, per frame. That covers the range the model was trained and validated on; a sheet just needs each frame inside the band. Each frame costs 1 credit.

We use cookies to enhance your experience. Essential cookies are required for the site to function. You can choose to accept all cookies or only essential ones.

Cookie policy