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 SupaVoxel Team·Updated
How to make a normal map from an image
- 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. - 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. - 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.
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
Height map
Ambient occlusion
Roughness map
Base color
Private and free
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
| Setting | Range | Default and advice |
|---|---|---|
| Strength (Normal) | 0.1–5 | 1.0. Raise it for shallow surfaces like plaster; lower it if every grain of sand looks like a crater |
| Green channel | OpenGL / DirectX | OpenGL. Switch to DirectX for Unreal Engine |
| Surface detail only (Height) | On / off | 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 | 0–1 | 0 and 1. Narrow them to push more of the image to flat or to peak |
| Blur (Height) | 0–8 px | 0.6 px. Smooths photo noise before the normals are taken |
| Invert (Height) | On / off | Off. Turn on when the recesses are the bright parts, such as light mortar |
| AO strength / radius | 0–3 / 1–24 px | 1.0 and 6 px. A bigger radius darkens wider hollows |
| Base roughness / variation | 0–1 / 0–2 | 0.72 and 0.5, a matte stone. Lower the base for polished surfaces |
| Metallic | 0–1 | 0. Exported as a flat map; leave it at 0 for stone, wood and fabric |
| Resolution | Original, 2K, 1K, 512 | Original 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.
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
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 format | Green channel | Choose |
|---|---|---|
| Blender, Maya | Y+ (up) | OpenGL |
| Unity | Y+ (up) | OpenGL |
| Godot | Y+ (up) | OpenGL |
| glTF / GLB, three.js | Y+ (up) | OpenGL |
| Unreal Engine, 3ds Max | Y− (down) | DirectX |
Already have a map in the wrong format? Most engines can flip green on import; Godot calls it Inverted Green.
Tips for using the generated maps
- 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
- 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
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.
More free texture and 3D tools
Frequently asked questions
Is this normal map generator free?
How do I convert an image to a normal map?
Should I pick OpenGL or DirectX normals?
What maps are in the ZIP?
Why does my normal map look inverted?
Can I make a seamless PBR texture?
Is my image uploaded to a server?
How long does it take, and what resolution should I pick?
Sources
- 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.Introduction to normal maps (bump mapping) — Unity Manual
“Unity uses Y+ normal maps, sometimes known as OpenGL format.”
- 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.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.Techniques for Creating Normal Maps — Epic Games, Unreal Development Kit documentation
“Unreal Engine uses normal maps where the green channel is facing down.”
- 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.Theory (PBR) — LearnOpenGL
“Metallic surfaces react different to light compared to non-metallic surfaces (also known as dielectrics).”
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