Height Processor (Lotus)
Turn Lotus depth output into an actual usable height map
- lotus_depth
- height
Depth models are great at producing a map that looks like depth and lousy at producing one you can actually drop into a 3D pipeline. Lotus is no exception: its output comes out of the VAE in whatever channel arrangement and value range the model happened to emit, which is almost never what a displacement or PBR height input expects. Height Processor (Lotus) exists to close that gap - it takes the raw LotusSampler → VAEDecode output and turns it into a clean, normalized, optionally inverted height map with a controlled bit depth.
The KB's depth-estimation essay is a good context for why this matters: Lotus is one of the community's top-two depth models, frequently the choice for texture/geometry work precisely because it's fast relative to Marigold's diffusion-stepped approach. But "fast and good" and "ready to use" are different things, and this node is the ready-to-use half.
How it works
The pipeline is a short sequence of fixes, each aimed at a real Lotus quirk. First it converts to grayscale - Lotus outputs RGB even though depth is one channel, so the node averages the channels with luminance weights and repeats it back to 3-channel so downstream nodes that insist on RGB don't choke. Then it normalizes: it finds the min and max of the tensor and rescales the whole map to span 0–1. That step alone fixes the "my height map looks flat, everything is in the 0.3–0.4 range" complaint that's nearly universal with raw depth output. Then, if you tick invert, it flips the values - essential because some models emit depth as "far = white" and displacement wants "high = white."
Finally, bit_depth (8-bit / 16-bit / 32-bit) rescales the output values into the range that matches how you intend to save it. The tooltip is the key warning: 16/32-bit only survives if you actually save as EXR or TIFF - save to PNG and you're back to 8-bit regardless.
The single output is height, an IMAGE ready to feed displacement, Height to Normal Converter, or the pack's PBR pipeline.
The inputs that matter
- lotus_depth - the raw Lotus output. Wire
LotusSampler → VAEDecode → here, as the node's own docstring instructs. - invert - flip this if your height comes out hollow or inverted against your engine's expectation.
- bit_depth - pick
16-bitif you plan to save EXR; it's the sensible default for real material work.
Installing it
Ships with ComfyUI-TextureAlchemy. ComfyUI Manager → search "TextureAlchemy" → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/amtarr/ComfyUI-TextureAlchemy
Restart and find it under Texture Alchemist → Maps. The node itself needs nothing, but the upstream Lotus model does - install Kijai's ComfyUI-Lotus separately and grab a Lotus checkpoint, as the pack README lists it as an optional source dependency.
Common issues
- "The height map looks totally flat." That's the normalization working exactly as designed - depth values compressed into a small range get stretched to full 0–1. If it still looks flat after that, the source image genuinely lacks depth variation.
- "It's inverted - mountains are valleys." Un-tick
invert, or tick it if you haven't. One of the two is correct for your engine; the map is telling you which. - "I set 16-bit but my file bands anyway." Save as EXR or TIFF. PNG cannot hold more than 8-bit per channel no matter what the node says.
- "I don't have Lotus installed." You'll see a missing-node error at workflow load. Grab ComfyUI-Lotus first; this node is only useful downstream of it.
The honest summary: this node doesn't add depth, it cleans depth. Feed it raw Lotus and get a height map that won't fight you in the next five nodes.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| lotus_depth | IMAGE | — | |
| invert | BOOLEAN | false | Invert height values |
| bit_depth | COMBO | 16-bit | Output bit depth (save as EXR for 16/32-bit) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| height | IMAGE | — |