Height Combiner
Stack height detail without wrecking your displacement
- base
- layer1
- layer2
- height
A single height map is usually a lie. The big sculpted shape wants one resolution, and the fine pore-and-grain detail wants another - squeeze them into one map and you either get a noisy displacement or a smooth blob. HeightCombiner is the node that lets you stack both: give it a macro base and one or two detail layers, pick how they combine, and it hands back a single height image that carries all of it. It's the height-specific cousin of a normal map blender, and it lives in the TextureAlchemy pack's Texture Alchemist/Height category.
You reach for it in a PBR workflow when you have a broad displacement map from something like Lotus or Marigold depth, and you want to punch in micro-relief from a procedural or tiled detail map without regenerating anything. Three maps in, one displacement out, no model involved - it's pure tensor math on the GPU.
How it works
Nothing fancy, which is the point. The base input is your canvas; layer1 and layer2 are optional overlays. Each layer gets resized to match the base if the resolutions differ, then dropped to grayscale (the node averages channels, so color input is fine - only the luminance matters). The blend happens per-layer with the mode you pick, then a strength slider (0–2) lerps between the untouched base and the blended result, so you can dial in how much of the layer actually lands.
The six blend modes are the standard Photoshop-adjacent set: add, max, min, multiply, screen, and overlay. Practically, add is the workhorse for layering detail onto a height (values push upward), max keeps the highest of the two maps (great for "dents carve out" control), and overlay adds contrast instead of raw displacement. The output is a 3-channel image even though the data is grayscale, clamped to 0–1, ready to feed a displacement node or the pack's PBR saver.
The inputs that matter
You only really set three things per layer:
- layer1 / layer2 - the detail maps. Both optional; wire up just one if that's all you have.
- layer1_mode / layer2_mode -
addfor stacking detail,max/minfor boolean-ish height operations. - layer1_strength / layer2_strength - 0 leaves the base untouched, 1 fully applies the blend, up to 2 overshoots.
The single output is height - one IMAGE, no batch weirdness.
Installing it
The whole pack installs at once, so you get this node plus forty-some siblings. In ComfyUI Manager search "TextureAlchemy" (it also shows as "Texture Alchemy"), hit install, restart. Manual route is the same as any custom node:
cd ComfyUI/custom_nodes
git clone https://github.com/amtarr/ComfyUI-TextureAlchemy
Then restart ComfyUI and look under Texture Alchemist → Height. One thing that trips people up: the README's old install step says "copy the ComfyUI_PBR_MaterialProcessor folder" - that's a leftover from the pack's pre-rebrand name, ignore it and just clone. There are no pip requirements and no model downloads for this node; it runs on PyTorch, which ComfyUI already ships.
Common issues
- Everything comes out gray and muddy. That's normal for a height map - it's single-channel data shown as RGB. Judge it with a displacement preview, not your eyes.
- A layer isn't doing anything. Check the strength slider; at 0 it's bypassed entirely. And remember color input gets averaged to luminance, so a red-only detail map may look weaker than you expect.
- Resolution mismatch. Layers auto-resize to the base, so a 4K detail map over a 512 base gets downsampled whether you like it or not. Size the base deliberately.
It's a small node and it doesn't do much on its own, but if you're building material sets it's the difference between a flat displacement and one that reads as real surface at close range.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| base | IMAGE | — | |
| layer1opt | IMAGE | — | |
| layer1_modeopt | COMBO | add | 6 options: add, max, min, multiply, screen, overlay |
| layer1_strengthopt | FLOAT | 1.000–2 | — |
| layer2opt | IMAGE | — | |
| layer2_modeopt | COMBO | overlay | 6 options: add, max, min, multiply, screen, overlay |
| layer2_strengthopt | FLOAT | 1.000–2 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| height | IMAGE | — |