SupaVoxel
Free texture tool

Normal Map Generator: Image to PBR Maps

Drop a photo of a surface and get a normal map plus height, ambient occlusion and roughness, lit on a 3D sphere while you adjust them. Free, no account, and the image never leaves your device.

  • Runs in your browser
  • OpenGL or DirectX normals
  • 6 maps in one ZIP
  • Up to 4096 px

By ·Updated

01

How to make a normal map from an image

  1. 01

    Drop a texture photo

    PNG, JPG or WebP up to 25 MB. Anything larger than 4,096 px on its long edge is scaled down to 4,096. No photo handy? The sandstone sample loads on its own.
  2. 02

    Tune the maps

    Set Strength and the Green channel on the Normal tab, levels and blur on Height, and AO and roughness on Surface. Every change re-renders a 1,024 px preview and the 3D sphere under a moving light.
  3. 03

    Download

    Pick Original, 2K, 1K or 512, then Download all maps (ZIP). Each map also has its own download button in the Maps view.
02

What the normal map generator gives you

It's a normal map tool and a PBR texture generator in one: one photo in, a full texture set out. Every map is computed from the same height field, so they line up pixel for pixel.

Normal map

Tangent-space normals from a Sobel filter over the height field, in OpenGL (Y+) or DirectX (Y−) convention.

Height map

Luminance with the lighting falloff removed, stretched to the full range. Saved as a 16-bit PNG by default so displacement doesn't step.

Ambient occlusion

The ambient occlusion map generator darkens cracks and hollows by comparing each point with its surroundings at three radii, so narrow cracks and wide pits both show.

Roughness map

The roughness map generator works from the photo's brightness around a base value you set. By default darker, dirtier areas read rougher.

Base color

Your photo with uneven lighting divided out, so a sunlit corner doesn't repeat across a wall. Turn it off on the Source tab.

Private and free

The maps are computed in a Web Worker in your tab. Nothing is uploaded, and there is no account or watermark.
03

Normal map generator settings explained

Strength (Normal)

Range
0.1–5
Default and advice
1.0. Raise it for shallow surfaces like plaster; lower it if every grain of sand looks like a crater

Green channel

Range
OpenGL / DirectX
Default and advice
OpenGL. Switch to DirectX for Unreal Engine

Surface detail only (Height)

Range
On / off
Default and advice
On. Removes shading broader than about 1/8 of the image so a darker corner isn't read as a slope

Black point / White point

Range
0–1
Default and advice
0 and 1. Narrow them to push more of the image to flat or to peak

Blur (Height)

Range
0–8 px
Default and advice
0.6 px. Smooths photo noise before the normals are taken

Invert (Height)

Range
On / off
Default and advice
Off. Turn on when the recesses are the bright parts, such as light mortar

AO strength / radius

Range
0–3 / 1–24 px
Default and advice
1.0 and 6 px. A bigger radius darkens wider hollows

Base roughness / variation

Range
0–1 / 0–2
Default and advice
0.72 and 0.5, a matte stone. Lower the base for polished surfaces

Metallic

Range
0–1
Default and advice
0. Exported as a flat map; leave it at 0 for stone, wood and fabric

Resolution

Range
Original, 2K, 1K, 512
Default and advice
Original keeps your size up to 4,096 px. The tool never upscales
SettingRangeDefault and advice
Strength (Normal)0.1–51.0. Raise it for shallow surfaces like plaster; lower it if every grain of sand looks like a crater
Green channelOpenGL / DirectXOpenGL. Switch to DirectX for Unreal Engine
Surface detail only (Height)On / offOn. Removes shading broader than about 1/8 of the image so a darker corner isn't read as a slope
Black point / White point0–10 and 1. Narrow them to push more of the image to flat or to peak
Blur (Height)0–8 px0.6 px. Smooths photo noise before the normals are taken
Invert (Height)On / offOff. Turn on when the recesses are the bright parts, such as light mortar
AO strength / radius0–3 / 1–24 px1.0 and 6 px. A bigger radius darkens wider hollows
Base roughness / variation0–1 / 0–20.72 and 0.5, a matte stone. Lower the base for polished surfaces
Metallic0–10. Exported as a flat map; leave it at 0 for stone, wood and fabric
ResolutionOriginal, 2K, 1K, 512Original keeps your size up to 4,096 px. The tool never upscales

Radii and strength scale with resolution, so the 1,024 px preview matches the full-size download.

04

Which photos make a good PBR texture

Any normal map generator working from a photo makes an estimate: it assumes bright means raised and dark means deep. That holds for rough stone, bark, concrete and gravel shot in flat light. It breaks on surfaces whose color, not shape, makes the contrast, such as painted tiles or wood grain, and on photos with hard shadows, which become fake holes.

Shoot straight on, in shade or on an overcast day, and fill the frame with the surface. If the texture needs to repeat, run it through the seamless texture generator first, or turn on Make seamless first on the Source tab.

  • Straight-on, no perspective
  • Even, shadowless light
  • Surface fills the whole frame
  • Bright = high; otherwise use Invert
05

OpenGL or DirectX: which normal map format your app wants

Both store the same normals; DirectX flips the green channel. Use the wrong one and the lighting looks inside out: bumps lit from below, cracks from above.

Blender, Maya

Green channel
Y+ (up)
Choose
OpenGL

Unity

Green channel
Y+ (up)
Choose
OpenGL

Godot

Green channel
Y+ (up)
Choose
OpenGL

glTF / GLB, three.js

Green channel
Y+ (up)
Choose
OpenGL

Unreal Engine, 3ds Max

Green channel
Y− (down)
Choose
DirectX
App or formatGreen channelChoose
Blender, MayaY+ (up)OpenGL
UnityY+ (up)OpenGL
GodotY+ (up)OpenGL
glTF / GLB, three.jsY+ (up)OpenGL
Unreal Engine, 3ds MaxY− (down)DirectX

Already have a map in the wrong format? Most engines can flip green on import; Godot calls it Inverted Green.

06

Tips for using the generated maps

Do
  • Plug the normal and roughness maps in as non-color (linear) data; only the base color is sRGB
  • Use the 16-bit height map for displacement, the 8-bit one is fine for parallax
  • Check the 3D preview with the moving light before you download
  • Make the texture tileable before generating maps you plan to repeat
Avoid
  • Feed in photos with hard shadows or flash glare
  • Push Strength until the sphere looks like hammered metal; subtle reads as real
  • Set metallic above 0 for stone, wood or fabric
  • Expect the tool to know a painted pattern from real relief
07

How this image to normal map tool works, and its limits

The height map is the photo's luminance with broad shading removed and the 0.5th to 99.5th percentiles stretched to full range. Normals come from a 3×3 Sobel filter on that height, scaled by the strength you set and by image size. Ambient occlusion compares each pixel with blurred copies of the height at three radii, and roughness is the luminance mapped around your base value. When the texture is seamless, every filter wraps around the edges, so the maps tile too.

It can't recover true depth from one photo. A 3D scan or photogrammetry captures real geometry, and a baked map from a high-poly mesh is exact. For textures on a 3D model rather than a flat surface, the AI texture generator and the UV unwrap tool cover the other half of the job, and the 3D model viewer shows the result on your mesh. Want a printable relief instead of a texture? The heightmap to STL tool turns a height map into a solid.

FAQ

Frequently asked questions

Is this normal map generator free?

Yes. There is no account, watermark or download limit. The maps are computed in your browser, so you can process as many textures as you like and download each one at up to 4,096 px, either as a ZIP with all six maps or one PNG at a time.

How do I convert an image to a normal map?

Drop the photo onto the tool. It turns brightness into a height field, then takes the slope of that height with a Sobel filter and stores the direction in red and green, with blue for the part facing out. Adjust Strength until the 3D sphere looks right and click Download.

Should I pick OpenGL or DirectX normals?

Pick OpenGL for Blender, Unity, Godot, glTF and three.js, and DirectX for Unreal Engine. The two differ only in the green channel. If bumps look lit from the wrong side in your engine, you have the other one: switch the setting and download again, or flip green on import.

What maps are in the ZIP?

Six PNGs: base color, height (16-bit by default), normal (named for OpenGL or DirectX), ambient occlusion, roughness and a flat metallic map at the value you set. They share one resolution and line up pixel for pixel, so they drop straight into a PBR material.

Why does my normal map look inverted?

Either the green channel convention doesn't match your engine, or the photo's bright parts are actually the low parts, like pale mortar between dark bricks. Fix the first with the OpenGL or DirectX switch, the second with Invert on the Height tab. The 3D preview shows which one you need.

Can I make a seamless PBR texture?

Yes. On the Source tab, turn on Make seamless first. The photo's edges are blended into a tileable image before the maps are made, and every filter wraps around the edges, so the normal, AO and roughness maps tile as cleanly as the color. The 3D preview then repeats the texture.

Is my image uploaded to a server?

No. The image is decoded in your browser and the maps are computed in a Web Worker on your device. Nothing is sent anywhere, and closing the tab discards everything. That also means a large image depends on your computer's memory; a phone may struggle with 4,096 px.

How long does it take, and what resolution should I pick?

On a desktop with an Intel Core i7-12700K in Chrome, our full set of six maps was ready in about 7 seconds at 2,048 px and 16 seconds at 4,096 px, mostly spent writing PNGs. The preview updates in under half a second. 2K suits most game props, 1K small or distant objects, 4K close-ups.

Sources

  1. 1.
    Normal Mapping — LearnOpenGL
    “This (and almost all normal maps you find online) will have a blue-ish tint. This is because the normals are all closely pointing outwards towards the positive z-axis (0,0,1): a blue-ish color.”
  2. 2.
    Introduction to normal maps (bump mapping) — Unity Manual
    “Unity uses Y+ normal maps, sometimes known as OpenGL format.”
  3. 3.
    Standard Material 3D and ORM Material 3D — Godot Engine documentation
    “Godot requires the normal map to use the X+, Y+ and Z+ coordinates, this is known as OpenGL style. If you've imported a material made to be used with another engine it may be DirectX style, in which case the normal map needs to be converted so its Y axis is flipped.”
  4. 4.
    glTF 2.0 Specification — Khronos Group
    “The normal vectors use the convention +X is right and +Y is up. +Z points toward the viewer.”
  5. 5.
    Techniques for Creating Normal Maps — Epic Games, Unreal Development Kit documentation
    “Unreal Engine uses normal maps where the green channel is facing down.”
  6. 6.
    Normal Map Technical Details — Polycount Wiki
    “3D Software capable of displaying tangent space normal maps will have a native required direction, or "handedness" for the RGB channels in a normal map, sometimes referred to as "Swizzle Coordinates,"”
  7. 7.
    Theory (PBR) — LearnOpenGL
    “Metallic surfaces react different to light compared to non-metallic surfaces (also known as dielectrics).”
Start free

Need the whole 3D model, not just its surface?

The normal map generator is free. To turn a photo of an object into a full 3D model, the studio builds one from a single picture. 3 free credits, no card.

No credit card required · 3 free credits to start