Nodes/ComfyUI-ControlNet-Nodes/CCTech Normal Map Preprocessor (BAE) ⚡
ComfyUI Node

CCTech Normal Map Preprocessor (BAE) ⚡

Normal maps with BAE — relighting, material, and the SDXL-era condition that never made it to Flux

By ChrisColeTech·Created 5 days ago·Updated a day ago· 2
CCTech Normal Map Preprocessor (BAE) ⚡
  • image
  • IMAGE
resolution512

A normal map doesn't tell you how far things are - it tells you which way every surface faces. Where a depth map is grayscale distance, a normal map is a color-coded picture of surface orientation: RGB channels encoding the X, Y, Z of each pixel's direction. That makes it the condition for relighting, material, and shape work - the thing you reach for when you want the model to respect how a surface curves and catches light.

BAE is the standard name here. It's the normal-map estimator behind ControlNet's normal conditioning, and its natural pairing is with IC-Light-style relighting: feed a subject and let the model re-light them according to where their surfaces actually point.

One honest caveat before you get attached: this is an SDXL-era condition. The 2025-26 union ControlNets rebuilt canny, depth, pose, and edges for the new bases, but normal maps never made the trip - the menu shrank, and normals stayed behind on SD 1.5/SDXL. So plan to use this on those ecosystems, or hand the map to an edit model that can read an input image of structure. On a Flux-union workflow there's simply no normal mode to plug it into.

How it works

BAE (Bae et al.'s NNET) uses an EfficientNet-B5 encoder feeding an uncertainty-aware BatchNorm decoder. The "uncertainty-aware" part is the interesting bit: the decoder learns where it's unsure about the surface direction, which keeps the map smooth on ambiguous regions instead of making confident guesses there. This node is a from-scratch port of the architecture from comfyui_controlnet_aux (Apache-2.0). It's also the reason the pack's requirements include timm - that's the optional dependency needed to build the EfficientNet-B5 backbone, so it's the one node family in this pack that installs something extra. Weights download on first use into ComfyUI/models/normal_bae/.

Inputs and outputs that matter

  • image - the photo or render to estimate normals from.
  • resolution (default 512, 64–2048) - internal working size.

That's it. One image in, one normal map out - the pack's DSINE node is the fancier camera-aware cousin, but BAE is the simpler standard you can trust without thinking about intrinsics.

Installing it

Part of ChrisColeTech/ComfyUI-ControlNet-Nodes, under 🤖 CCTech/Preprocessors. Install via ComfyUI Manager (search "ComfyUI-ControlNet-Nodes") or:

cd ComfyUI/custom_nodes
git clone https://github.com/ChrisColeTech/ComfyUI-ControlNet-Nodes

Restart ComfyUI. On a standard install the pack's requirements.txt brings in timm automatically; if you installed by hand or it errors on import, add it explicitly with pip install timm. You'll know if it's missing - the node will throw at first run instead of producing a map.

Common issues

Two gotchas. First, the timm dependency - if the node errors the moment it runs and mentions EfficientNet, that's the missing backbone, install timm and restart. Second, the first-run checkpoint download. And the workflow-level trap is the ecosystem gap above: a normal map only helps where a normal-conditioned ControlNet exists, so on a modern base you're likely feeding this to an edit model or working in SDXL. Don't burn a session hunting for a Flux normal-mode union - it isn't there, and it isn't coming.

Category🤖 CCTech/Preprocessors

Inputs (2)

NameTypeDefaultDescription
imageIMAGE
resolutionINT51264–2048

Outputs (1)

NameTypeDescription
IMAGEIMAGE