ControlNet Preprocess NormalBae
ControlNet for People Who Care About Light
- image
- image
Most ControlNet preprocessors answer "where are the edges?" or "where are the people?" NormalBae answers "which way does every surface face?" - and that's the question you ask when lighting, form, and 3D believability matter more than outlines. Runware_controlnet_preprocess_normalbae runs that surface-normal extraction on Runware's cloud: image in, a color-coded normal map out as an IMAGE. Normal maps are the preprocessor of choice for relighting, product shots, and any generation where the way light wraps around an object has to survive.
How it works
BAE (Bridging Appearance and Edge) is the estimator family behind this one - it reads an image and produces per-pixel surface orientation, usually rendered as an RGB map where each channel encodes a direction. Wire that into a ControlNet and the model inherits the source's form and shading logic: spheres stay round, corners stay sharp, and light lands the way the source says it should. Like every preprocessor in this pack, the extraction happens server-side; you don't host the weights, you pay a fraction of a cent per map.
The inputs
- image (required) - the source whose surface geometry you want to preserve.
- outputFormat (JPG/PNG/WEBP) and ttl (toggle + value) - delivery details.
Output is image - the normal map. JPG will technically hold it, but for a normal map, PNG avoids compression artifacts in the color channels that define direction - worth reaching for if your map feeds a finicky model.
Wiring it up
The canonical chain: this node → RunwareBuild_controlNet (guideImage) → an image model's controlNet socket. On the builder, weight controls how hard the surface form grips the output - normal maps want a decent weight for the structure to survive, and lowering it too far just gives you a vaguely 3D-flavored image instead of one that matches the source's form.
Install and setup
Standard for the pack: ComfyUI Manager → "Runware" → install → restart, or clone and pip install -r ComfyUI-Runware/requirements.txt (runware-sdk, pillow, soundfile). API key via Settings → Runware API key, RUNWARE_API_KEY, or runware auth login, and funded credits - the ~$20 minimum top-up with a card on file being the standard entry friction.
Troubleshooting
- Map looks like an RGB mess - that's actually what normal maps look like; don't judge them by eye the way you'd judge a depth map. If it looks colorful and smooth, it's probably working.
- Generation's lighting ignores it - raise
weightin the builder and make sure the map is feedingguideImage. Normal control is subtler than edge control; it needs enough weight to be felt. - Source is too flat - a diffuse, poorly lit photo gives weak normals. Good lighting in, good form out.
NormalBae is the preprocessor you reach for when "describe it nicely" isn't enough - when the object's form and how light falls on it are the whole point. For product work and anything lighting-driven, it's the quiet workhorse of the ControlNet family.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| ttlopt | BOOLEAN | false | Enable to set ttl. Off uses the model's default. |
| ttl_valueopt | INT | 60 | Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`. |
| outputFormatopt | COMBO | JPG | File format for the generated image. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |