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.

NormalMap-Online (MIT, runs locally in the browser) turns a picture into normal, displacement, ambient-occlusion and specular maps with Strength, Level, Blur/Sharp, a Sobel or Scharr filter and R, G and height invert switches, shows them on 3D shapes, and can build a normal map from four photos lit from different sides. The Studio's Texture workspace is made for 2D sprites: a bevel from the silhouette, a 2D light preview that follows Godot, GL/DX detection and verified Godot 4 and Unity 6 exports. On the same CC0 sprites with default settings, its output was much further from the true normals, with red inverted.

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)

Two different jobs: surfaces and sprites

NormalMap-Online treats the picture as a height map: brightness is height, the chosen filter takes its gradient, and Strength, Level and Blur/Sharp shape the result. That suits photographed or tileable surfaces. A sprite has no height in its brightness at the silhouette, so without a bevel its edges stay flat; on the 3D-rendered asteroids its default was 61.1° from the true normals, against 20.0° for the Studio.

Its default output in our run had the red channel inverted (correlation −0.58 with the true normals) and a very low z. The page has Invert R and Invert G switches and a Z Range option; if a sprite made with it is lit from the wrong side horizontally, check Invert R first. The Studio's Check panel reports such a map as "red flipped" on sprites and fixes it with Flip red (X−).

On the brick texture both tools were exactly wrap-consistent (roll error 0), so for plain tileable textures the difference is how close the guess is (bricks from the colour image: 65.6° against 14.7°) and which extra maps each tool offers.

After the map, the Studio adds what a 2D game needs: lights you drag over the sprite, per-frame sheets, _n and _n_dx files and engine bundles; NormalMap-Online ends at the download.

Photometric stereo
Recovering normals from several photos of the same surface lit from different directions.
Invert R / G
Switches that negate X or Y; a wrong one lights the sprite from the opposite side.
Bevel
Height grown from the transparent edge; what gives a sprite's outline its relief.

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.

Other ways to do it

OptionWhen it is the better choice
NormalMap-OnlinePhotos of a real surface (four shots lit from above, left, right and below), displacement, AO and specular tabs in one place, a quick look on a sphere, teapot or your own model, batch mode, JPG or TIFF output, or an MIT project you can host yourself.
Nerulio Studio TextureSprites with transparency, animated sheets, a result ready for Godot or Unity, or a map from elsewhere whose convention you need to check.
Texture Lab height → normalA plain gradient normal map from a height image with Sobel, Scharr or Sobel 5×5, Wrap and OpenGL or DirectX, close to NormalMap-Online's core job.

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

  • No photometric stereo: the Studio cannot build a normal map from photos.
  • No preview on your own 3D model; the Studio's 3D view is a sphere or plane.
  • No batch mode for a folder of textures.
  • Maps are written as PNG only (no JPG or TIFF).
  • 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.

Versions and sources

NormalMap-Online was driven with Playwright on its live site on 2026-09-24: the picture loaded as its height input, default settings, the result downloaded and compared with real reference normals, next to Nerulio with the settings it suggests. The control names above were read from its page on 2026-09-28; its licence and local processing are stated in its repository.

Official documentation used

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).