Normal Blend
Stack a detail normal onto a base without the seams
- base_normal
- detail_normal
- mask
- image
- mask
- normal_blend_info
Layering normal maps is one of those operations that sounds trivial and is secretly full of traps. You can't just average two normals - they're not color values, they're direction vectors, and naive blending flattens both. x1NormalBlend does the math properly, which is why it's the node you want when you're building a surface from parts: a broad base normal from one source, a fine detail normal from another, blended in tangent space.
It's from the Surface/Tech Art branch of MKRShift Nodes, and it's the natural companion to the pack's x1NormalMap and x1NormalTweak. The author's own docs nail the workflow: whiteout is the most practical default for stacking broad and fine detail normals.
How it works
The node decodes both incoming tangent-space normal maps, does the blend in a proper vector space, then re-encodes. Your blend modes:
- whiteout - the standard "stack detail on top" blend, named for the characteristic look of the intermediate result. Keeps the base's broad shapes while adding the detail map's fine features. Reach for this 90% of the time.
- add - a raw vector addition, which pushes the result harder. Good for exaggerating, easy to overdo.
- lerp - a straight linear mix. This is the one that flattens, so treat it as the "fade between two complete surfaces" option rather than "add detail to surface."
strength scales how hard the detail map bites (default 1.0, range up to 4.0), so you can dial a subtle overlay in without committing to a full blend.
Inputs and outputs
Required: base_normal and detail_normal (both IMAGE), plus blend_mode, strength, mask_feather, and invert_mask. Optional: mask, which limits where the detail normal is applied - that's your "only the panel lines get the detail" switch.
Outputs:
image- the blended tangent-space normal mapmask- the effective blend mask after feathering and invertingnormal_blend_info- aSTRINGsummary of the resolved settings
The pack derives these maps in Surface/Maps and refines them here in Surface/Tech Art, and the two categories were clearly designed to chain. x1NormalMap → x1NormalBlend → x1NormalTweak is a complete surfacing pipeline with no gaps.
Installing it
MKRShift Nodes installs like any custom node - ComfyUI Manager, search "MKRShift Nodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart and it's live. No requirements.txt, no model downloads; this is pure torch/numpy math. The honest caveat is repo size - the pack ships Blender bridges, G-code printers, and audio tools alongside these surface nodes, so you're pulling a big install for a small family. It's worth it if you're doing real material work, because the Surface branch is coherent in a way most packs aren't.
Where people get burned
Mostly convention confusion, which is the eternal normal-map problem: if your base is OpenGL-convention and your detail is DirectX (or vice versa), the blend fights itself and detail reads inverted. Check both maps before blaming the blend. Also - if you blend with lerp and your detail "disappears," that's not a bug, that's linear blending doing exactly what linear blending does to vectors. Switch to whiteout and your detail comes back.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| base_normal | IMAGE | — | |
| detail_normal | IMAGE | — | |
| blend_mode | COMBO | 3 options: whiteout, add, lerp | |
| strength | FLOAT | 1.000–4 | — |
| mask_feather | FLOAT | 8.00–256 | — |
| invert_mask | BOOLEAN | false | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| normal_blend_info | STRING | — |