GenPBR is a free height map generator (also called a heightmap generator or height map maker). Upload a color texture and it builds a grayscale heightmap from the relief in that image. Use the result for displacement, parallax, or as the elevation check next to your normal map. Preview in 3D on the generator, then export PNG. No signup for core use.
Lighter pixels are higher. Darker pixels are recessed. If your shader expects the opposite, turn on Invert height before you export.
Height map from an image
An image to heightmap workflow starts from an albedo, a diffuse, or a reference photo. GenPBR reads relief from that plate (large forms and edges, with fine photographic grain smoothed so the map does not go furry) and writes an 8-bit grayscale PNG. This is a first-pass heightmap generator from image, not a laser scan. Hard mechanical CAD edges and hero silhouettes still belong in a modeled or sculpted displacement if the silhouette itself must be exact.
- Open the generator and upload the source texture.
- Use Height Contrast to separate raised faces from grooves, and Height Brightness to shift the mid level.
- Compare the height preview with the normal. A bump in the normal should be a light area in the height map, unless you inverted height on purpose.
- Export the grayscale PNG, or ZIP it with the rest of the material.
How to read the grayscale
Engines treat this file as data, not as a color texture. Import it as linear / non-color. Mid gray is the resting surface, white is the peak, and black is the deepest recess in the default orientation. Displacement shaders often expect that range in 0 to 1. If the map looks flat in engine, raise contrast in GenPBR before you crank displacement scale, so you are not amplifying an almost-gray image.
| Use | What the height map does |
|---|---|
| Parallax or height blend | Shifts texture samples by view angle. The silhouette stays put. Good for brick, tile, and trim sheets. |
| Tessellation or displacement | Moves vertices. The silhouette can change. Needs a mesh dense enough to show the relief. |
| Normal map only | Changes lighting, not position. Generate normals too, from the same image, when you are not displacing. |
Height map vs normal map
Normals encode direction for lighting. A heightmap encodes elevation. Real-time materials often ship both: the normal map generator for shading, and this grayscale map where the pipeline actually samples height. They should agree. If the normal says a brick sticks out and the height map says it is a hole, you inverted one of them.
Roblox SurfaceAppearance uses a normal map, roughness, and metalness. It does not take a separate height channel. Use this height output in Unity, Unreal, Blender, and other pipelines that displace or parallax. Keep the normal export for Roblox.
Free heightmap generator in the browser
The heightmap tool runs in the browser, so there is nothing to install. Core resolutions need no account. The same session can also produce the normal, roughness, and metallic maps, which keeps the material aligned. For the full set, continue with image to PBR or the texture map generator. A longer walkthrough is on the height map from image article.