ComfyUI Node

Height Combiner

Stack height detail without wrecking your displacement

By amtarr·Created 9 months ago·Updated 4 months ago· 58
Height Combiner
  • base
  • layer1
  • layer2
  • height
layer1_modeadd
layer1_strength1.00
layer2_modeoverlay
layer2_strength1.00

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 - add for stacking detail, max/min for 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.

CategoryTexture Alchemist/Height

Inputs (7)

NameTypeDefaultDescription
baseIMAGE
layer1optIMAGE
layer1_modeoptCOMBOadd6 options: add, max, min, multiply, screen, overlay
layer1_strengthoptFLOAT1.000–2
layer2optIMAGE
layer2_modeoptCOMBOoverlay6 options: add, max, min, multiply, screen, overlay
layer2_strengthoptFLOAT1.000–2

Outputs (1)

NameTypeDescription
heightIMAGE