Height Map Generator
Drop an image. Get a greyscale height map. In your browser — your file never leaves the tab.
Your image never leaves the tab. Everything runs on your GPU.
TL;DR. Drop a photo or a texture. The tool builds a greyscale height map from it — white is high, black is low. Three sliders control how much detail survives (Detail), how much overall contrast (Contrast), and how much smoothing you want on top (Smoothing). Invert flips the convention if your engine expects black = high.
What a height map actually is
A height map is the most boring file in the PBR set and arguably the most useful. It’s a single greyscale channel where every pixel’s brightness is a number between 0 and 1 — and that number means “how high is this point”. White is up. Black is down. The engine uses that height for parallax (cheap fake displacement), tessellation displacement (actual geometry push), terrain heightfields, and as the source data when you want to derive a clean normal map.
You can think of it as a topographic map of the surface, only there are no contour lines and the geographer is the GPU. (I’ll show myself out.)
What the three sliders are doing under the hood
The tool runs an edge-preserving smooth on the input — seven passes of bilateral-style filtering that keeps the major features sharp while flattening the noise. Then auto-levels normalises the result so the darkest 1% of pixels go to black and the brightest 1% go to white. The sliders adjust that base output:
- Detail — how much of the original photo’s high-frequency content (the texture you can feel on the surface) gets blended back in. Low = smooth low-poly hill. High = topographic detail down to the micro-grain.
- Contrast — straight tone-curve contrast on top of the auto-levelled result. Useful when the input is very flat and you want more dramatic peaks.
- Smoothing — a final Gaussian on top. Zero by default. Crank it if your downstream displacement is producing speckle.
Height map or displacement map — which one do I have?
Mostly the engine’s name for it. A height map is a greyscale image on disk. A displacement map is the same image when an engine uses it to actually push geometry up and down. Blender calls it “displacement”. Unreal calls it “height map”. 3ds Max calls it “displacement”. Unity might use either depending on the shader. They’re the same file with different job titles.
The exception: parallax occlusion mapping (POM) is sometimes called “parallax mapping” in the older docs, and it specifically expects a height map (no actual geometry change). If your shader has a slot called “parallax”, “height”, or “POM”, this tool’s output is what you want.
Use this height map to generate a clean normal map
The single best way to make a normal map is to start with a height map and convert it. Brightness-based gradient is the literal definition of surface direction, so the math is exact. Drop a photo here, generate the height map, download it, then head to the normal map generator and use the height map you just downloaded as the input. The result will be more accurate than running the normal-map generator directly against the photo — because the height map has already filtered out the lighting in the original photo.
For Unity, Unreal, and Blender
All three default to white = high. If you’re seeing the geometry pucker inward instead of pushing outward, toggle Invert and re-download.
- Unity — slot the height map into the “Height Map” input of a Standard or URP/HDRP shader for parallax. For actual tessellation, use a custom HDRP shader graph node.
- Unreal Engine — connect to the “World Position Offset” of a tessellated material, or use it as the parallax input on a non-tessellated one. Nanite ignores displacement maps entirely; you’d use this for traditional materials only.
- Blender — plug into the “Height” input of a Displacement node, then into the Material Output’s “Displacement” socket. Set the Displace mode to “Displacement Only” or “Both” depending on whether you also want bump.
The Photoshop alternative angle
The Photoshop NVIDIA Texture Tools filter has a “height map from luminance” option that’s essentially a glorified desaturate. This tool does the same idea but with edge-preserving smoothing and auto-levels, so the output is usable as displacement data instead of just a flat greyscale. Works in a browser tab, no install, no licence.
Straight answers
What is a height map?
A single-channel greyscale image where brightness encodes elevation. White is high, black is low. Used for parallax, tessellation displacement, terrain heightfields, and as the source for generating normal maps.
What’s the difference between a height map and a displacement map?
Mostly nothing — they’re the same file. “Height map” is the file on disk; “displacement map” is what some engines call it when the file is being used to push geometry. Blender and 3ds Max favour the “displacement” name; Unity and Unreal often use “height” even for displacement.
Can I generate a normal map from a height map?
Yes — and it’s the most accurate way. Download the height map, then use it as the input on the normal map generator. Because brightness in a height map is literally surface elevation, the gradient gives you exact surface direction with no photo-lighting artefacts.
Will the output work in Unreal Engine 5 / Nanite?
Yes for non-Nanite materials (parallax, POM, World Position Offset on tessellated meshes). Nanite ignores displacement maps — it uses real geometry. So a height map is useful in UE5 for non-Nanite assets and for terrain Landscapes, but won’t do anything on a Nanite mesh.
How big can the input be?
Up to 2048×2048. Larger images are downsampled on the way in. The downloaded file is at the (post-downsample) full resolution; the on-screen preview is at 384px for slider responsiveness.
Is it really CC0?
The tool is free; the output is whatever rights you have over the input. If you upload your own photo, the height map is yours. If you upload someone else’s work, that’s on you.
One last thing
A height map is a topographic survey of a flat photo. White is the peak. Black is the valley. If your render still looks flat, raise the Detail slider before you blame the geometry.
Need a full PBR set generated from a prompt? Try the AI texture generator. Need just the normal map next? Use the normal map generator — feed it the height map you just downloaded for the most accurate result.
Built by Voise. 3D artist since 2009. Melbourne. Drop a question via the community page if a height map looks wrong — I read everything.