[Inference.Core] BAE Normal Map
Surface direction, not distance — the ControlNet condition people forget exists
- image
- IMAGE
Depth tells a model what's near and what's far. Normal maps tell it something different and often more useful: which direction every surface faces. A depth map of a sphere is a gradient; a normal map of the same sphere shows every point on its curve pointing a slightly different way. That distinction matters for anything relighting-adjacent - if you're pairing this with an IC-Light-style workflow, or you want the model to respect fine surface curvature rather than just front-to-back placement, normal maps are the condition to reach for. BAE is the standard normal-map estimator this whole ecosystem converged on for ControlNet work.
How it works
BAE predicts per-pixel surface orientation directly from a single 2D image - no depth map computed first and then converted, it's trained to estimate normals natively. The output is the classic tri-color normal map look: each color channel encodes one axis of the surface direction, so you get the recognizable blue-purple-green gradient shading rather than a grayscale depth image. Feed it to a normal-map ControlNet and the model steers generation to respect that surface geometry.
The inputs and outputs that matter
The simplest possible node - one setting beyond the image:
image- required, your source image.resolution(default 512) - working resolution.
One output: IMAGE, the normal map, wired into a normal-map ControlNet (not a depth ControlNet - the two aren't interchangeable, even though both nodes live in the same category here).
How to install it
ComfyUI Manager: search ComfyUI-Inference-Core-Nodes, install, restart. By hand:
cd ComfyUI/custom_nodes
git clone https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes
then run install.py, or pip install -e .[cuda12] (or .[cuda] / .[rocm] / .[directml] / .[cpu]). Restart ComfyUI. The BAE model weights download from Hugging Face the first time you run the node.
Common issues & troubleshooting
The mistake that actually happens with this node isn't a setting, it's a mismatch: loading a depth ControlNet and feeding it a normal map (or vice versa). They're both grayscale-ish spatial conditioning images and it's an easy swap to make by accident, but the ControlNet model was trained on one specific condition type and won't correctly interpret the other - results come out subtly wrong rather than obviously broken, which makes it a sneaky bug to spot. Double-check your ControlNet checkpoint is actually the normal-map variant before troubleshooting anything else.
Otherwise there's genuinely little to go wrong here - no model size picker, no mode toggle, just an image in and a normal map out. If the output looks flat or low-contrast, that usually means the source image itself has low surface detail (flat lighting, low-relief subject) rather than anything to fix on the node.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| resolutionopt | INT | 51264–2048 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |