Nodes/ComfyUI-Lotus-2/Lotus-2 (FLUX)
ComfyUI Node

Lotus-2 (FLUX)

Hairline depth and normal maps, made out of your own FLUX checkpoint

By 1038lab·Created 24 days ago·Updated 24 days ago· 6
Lotus-2 (FLUX)
  • image
  • model
  • conditioning
  • vae
  • IMAGE
◄modedepth►
◄steps1►
◄resolutionauto►
◄colormapauto►
◄guidance3.5►
◄unload_modelfalse►

Here's the thing that surprises people: Lotus-2 doesn't ship a model you load. It borrows yours. You point it at a FLUX.1-dev checkpoint you already have - fp8, or a GGUF via the Unet Loader - and it patches the Lotus-2 predictor and sharpener weights onto it as LoRAs, runs one or two forward passes, and hands you back a depth or normal map. Two wires, no CLIP loader, no second sampler.

That's the second engine in this pack, and it's the detail engine. Where the plain Lotus node smooths texture, this one is aimed at curly hair, fur, lace, thin occlusions and PBR-shaped surface data - at roughly ten times the per-image cost.

The two-stage mechanism

Stage one is the core predictor: the node encodes your image with the FLUX VAE, runs a single DiT forward pass at a timestep of 1/1000 with FLUX guidance, then passes the unpacked latent through a tiny Local Continuity Module - the 39KB "LCM" file, nothing more than two conv layers with a residual. That's the whole instant path. One step, ~13-15s, and the author is right that extra steps buy you almost nothing in depth.

Stage two only exists if you raise steps above 1. Then the core patcher gets unloaded, the detail sharpener is loaded instead, and it runs a short sigma schedule. The reason it exists is that FLUX processes latents in 2×2 pixel patches, and on ultra-high-frequency input a single step can leave faint patch grid lines. Two to four steps is the author's own advice for hair, fur and fine weave - smooth surfaces don't need it.

Inputs and the one you actually set

image and model are required. model is just your loaded FLUX diffusion model; the node loads the core and sharpener safetensors as LoRAs against it and unpatches them afterwards.

Then the optional set: mode (depth or normal), steps (1-10, default 1), resolution (auto, 768, 512, 1024, native), colormap (auto, gray, spectral, turbo), guidance (3.5), conditioning, vae, unload_model.

steps is the one that matters. Leave it at 1 unless the map is for curly hair, fur or lace, then try 2-4. resolution: auto clamps anything taller than 1024 down to 1024 and anything smaller than 512 up to it, with per-mode 768/512/1024 for manual control - everything is resized back to your input size at the end. And colormap: auto gives you clean normalized grayscale in depth mode and the standard RGB normal vector map in normal mode; in normal mode the colormap setting is ignored outright, because those RGB values are the data.

guidance is the FLUX distilled guidance scale - leave it alone until you have a reason. conditioning and vae are escape hatches: vae only earns its wire if the auto-lookup fails, and conditioning only if you want to override the bundled empty-prompt embedding. unload_model calls an all-models unload after the run, which will drop your FLUX too - great on a tight card, mildly annoying on a fast one.

One IMAGE output. Wire it into Apply ControlNet for depth work, a relight node for normal maps, or straight to Preview Image to eyeball it.

Install and the downloads

cd ComfyUI/custom_nodes
git clone https://github.com/1038lab/ComfyUI-Lotus-2

Or ComfyUI Manager, search ComfyUI-Lotus-2. (The README's clone line says ComfyUI-Lotus2.git; the repo is ComfyUI-Lotus-2.)

This node runs on ComfyUI internals only, but the pack's requirements.txt installs diffusers because the other node in it - plain Lotus - needs it. Install the requirements file if you install the pack by hand.

First run pulls lotus-2_core_predictor_* (1.43GB) plus the matching sharpener (1.43GB) and the LCM from Hugging Face into models/geometry_estimation/, with a mirror repo as fallback. Then you need a FLUX model loaded and, crucially, the FLUX VAE ae.safetensors in models/vae/. That's not a download the node performs - it's a lookup, and if the file isn't there it stops with a message telling you to put it there or wire an external VAE in. If you already run FLUX workflows you have it.

Real problems, not hypothetical ones

The first one is cost. Lotus-2 at one step is ~13-15s per image on a decent GPU, and each frame of a video is an image. This is not a video tool; that's what the plain Lotus node is for. Stay in its lane.

Before you wire this into a big pipeline, compare it against Depth Anything V2 Large on your image. Lotus v1 showed up in the community's eight-model comparison and the verdict was split: better at holding detail and contrast, likelier to get relative depth ordering wrong. Lotus-2 pushes further into the detail half of that trade. It also barely exists in r/comfyui and r/StableDiffusion discussion so far - exact-string hits over the last two years are in the single digits, mostly threads about the TV show - so nobody has stress-tested the "SOTA" claim for you. Test, then trust.

The third is VRAM. Steps above 1 swaps two 1.43GB patchers in and out on top of a 12B model, so on 8-16GB the configuration that behaves is a Q4/Q5 GGUF, steps: 1, and unload_model on.

Category🧪AILab/Geometry

Inputs (10)

NameTypeDefaultDescription
imageIMAGEInput image or video frames.
modelMODELFLUX.1-dev model (e.g. flux1-dev-fp8.safetensors or GGUF).
modeoptCOMBOdepthGeometry prediction mode: depth (Disparity Depth) or normal (Surface Normal vector map).
stepsoptINT11–101 = Instant 1-step Core Predictor (~15s); 2-10 = Multi-step detail sharpener.
resolutionoptCOMBOautoProcessing resolution.
colormapoptCOMBOautoauto: Standard Normal for normal mode, Clean Grayscale for depth mode. Or pick spectral/turbo.
guidanceoptFLOAT3.50–10FLUX guidance scale.
conditioningoptCONDITIONINGOptional. If not connected, automatically uses built-in authentic FLUX empty prompt.
vaeoptVAEOptional. If not connected, automatically loads local ae.safetensors.
unload_modeloptBOOLEANfalseFully unload models from VRAM after execution.

Outputs (1)

NameTypeDescription
IMAGEIMAGE—