Skip to content

NormalMap-Online Alternative — Normal Maps Made for 2D Sprites

NormalMap-Online is the long-running free normal map generator in the browser: MIT-licensed, it works locally in the page and is built around textures — normal, displacement, AO and specular tabs with a 3D preview. The Studio's Texture workspace is also free and local but is built for 2D game sprites: relief from the silhouette, lights that follow Godot's model, and exports checked in Godot and Unity. On the same CC0 assets with default settings, the numbers differ a lot.

Drop a sprite, a sprite sheet or a tileable texture (PNG)
Runs in your browser. Files are not uploaded.
Studio Texture workspace: an imported ambientCG normal map read as DirectX with high confidence; nothing changes until the convention is confirmed
The real Studio with a CC0 asset (ambientCG).
Exports to
  • Godot 4 2D lightsVerified· Godot 4.7.2
  • PNG set + JSONPlain files
  • Unity 6 URP 2DVerified· Unity 6000.5.3f1 (URP 17.5)

What it does

  • Sprites with transparency get a bevel from their silhouette, so the inside of a character has relief instead of staying flat with normals only at the edge.
  • Any normal map you open is checked before it is used: OpenGL or DirectX with a confidence, and on sprites a flipped red channel is reported. Nothing changes until you press "It is OpenGL / It is DirectX" or Flip red (X−).
  • The preview is a 2D scene lit like Godot draws it (equal to the reference within 1/255), with up to 8 point lights you drag over the sprite.
  • Export folders per target: a lit Godot scene, a Unity 6 URP 2D importer, or plain PNGs with the normal map in both conventions (_n and _n_dx) and a 16-bit height map.

Nerulio Studio and NormalMap-Online on the same assets

Mean angle to a real reference normal map, lower is better. NormalMap-Online was driven on its live site with the picture as its height input and default settings.

Nerulio StudioNormalMap-Online
Asteroids (normals rendered from 3D models)20.0°61.1°
Hand-painted pixel torch38.1°87.1°
Bricks: from the colour image / from the 8-bit height map14.7° / 8.8°, roll error 065.6° / 77.8°, roll error 0 on this asset
Its default output, read by the Studio's checkOpenGL, highRed inverted (correlation −0.58) with very low z; reported as "red flipped"
Sprites with transparencyBevel from the silhouette, sized to the spriteNo bevel
PreviewLit 2D view equal to Godot's light model within 1/2553D shapes: cube, plane, sphere, cylinder, teapot, your own .obj
Engine setupLit Godot scene and Unity importer, both verifiedDownload the PNG and set up the engine by hand
Where it runsBrowser, local, freeBrowser, local, free, MIT licence

Source of these numbers: docs/STUDIO-TEXTURE.md (Head-to-head, 2026-09-24)

Where NormalMap-Online is the better choice

  • Photometric stereo: a normal map from 4 photos of a real surface lit from above, left, right and below. The Studio has nothing like it.
  • Separate displacement and specular tabs with their own controls, shown on 3D shapes including a custom .obj model.
  • Batch mode with "Download all" for a folder of textures in one go.
  • MIT open source, so you can host or change it yourself.

How to do it

  1. Drop the texture or sprite on this page; the Texture workspace suggests Sprite or Tileable texture and generates a map at once.
  2. To reuse a map made in NormalMap-Online, open it with its picture and choose it as the source; if the Check panel reports red flipped, press Flip red (X−).
  3. Switch the view between Normal, Lit and Maps; for a texture press T to see it tiled 3×3.
  4. Export (Ctrl+E) the PNG set with _n and _n_dx, or the Godot or Unity folder.

Engine exports and how each was checked

"Verified" means the exported files were loaded by the real engine or tool on real CC0 assets and the result was compared with the source. Anything that was not loaded is labelled as such.

TargetFilesCheck
Godot 4 2D lights_lit.tscn · CanvasTexture .tres · normal / specular PNGVerified Godot 4.7.2Six real CC0 cases rendered by Godot (gl_compatibility): every checked frame within 1/255 of the Studio's lit preview. The same render with green flipped is 3.8–37 levels off, so the check can see a wrong convention.
Unity 6 URP 2DPNG · nerulio-texture.json · Editor/NerulioNormalMapImporter.csVerified Unity 6000.5.3f1 (URP 17.5)12 of 12 runs (6 cases in Gamma and Linear colour space): the lighting URP applied matches the exported normal map (mean error 0.0037–0.0085). URP draws its own light falloff, so brightness is Unity's, not the preview's.
PNG set + JSONalbedo · _n (OpenGL) · _n_dx (DirectX) · 16-bit height · AO · specular · manifestPlain filesPlain files for any engine or tool; no engine run is claimed for them.

Evidence

Godot 4.7.2 rendered 6 real CC0 cases (pixel art, an HD sprite, a tileable texture, an imported DirectX map): every checked frame within 1/255 of the Studio's preview. Unity 6000.5 URP 2D: 12 of 12 runs pass (6 cases × Gamma and Linear). OpenGL/DirectX detection on real maps of known convention: 128 full 1K maps 100 % right, and not one wrong "high" verdict in 1,562 samples (a naive "green-high means OpenGL" rule gets 46 %).

Limits

  • On a picture without transparent edges (a tileable texture) a flipped red channel cannot be told apart from a DirectX green; the Check panel says so and offers Flip red.
  • A sheet is lit as one picture until its frames are cut in the Sprite workspace; the Texture workspace does not cut frames.
  • The rim light is preview only, and Unity gets no specular map (Godot does).
  • Unity draws its own light falloff: the exported normal map is verified in Unity, the brightness curve is Unity's.

Questions

Why is my NormalMap-Online sprite lit from the wrong side?

In our comparison its default output had the red channel inverted (correlation −0.58 with the true normals), so light from the left looks like light from the right. The Studio's check flags that as "red flipped" on sprites, and Flip red (X−) fixes it on load, undoable.

Is a NormalMap-Online map seamless when it tiles?

On the brick texture in this test, yes — roll error 0, like the Studio with Wrap. An earlier note saw a border band on another image that did not reproduce here, so check your own texture: the Studio's wrap test shows 0 when it is seamless.

Does the Studio make displacement or specular maps too?

It writes a 16-bit height map, AO, and a specular map for Godot; roughness and specular estimates from the colour are labelled as approximations. There is no photometric stereo from photos.

Is it free, and do I need an account?

Everything on these pages is free and works without an account. There is no watermark and no export that is held back.

Are my sprites uploaded?

No. The Studio decodes, packs and exports in this browser tab. Projects are autosaved in the browser (IndexedDB) and can be saved as a .nerulio file.

Does it need Aseprite or an engine plugin installed?

No. .aseprite files are read and written in the browser, and each engine bundle carries what that engine needs (for Godot, the import settings and scene; for Unity and the Godot TileSet, a small editor script).