Normal Tweak
Fix the normal map instead of re-exporting it
- image
- strength_mask
- mask
- image
- mask
- normal_tweak_info
Every normal map you've ever generated or downloaded eventually needs the same three fixes: it's too flat, too bumpy, or in the wrong green-channel convention for your renderer. x1NormalTweak is the node that does all three without making you regenerate anything. You take an existing tangent-space normal map, adjust strength and softness, flip axes, convert between OpenGL and DirectX, and pass it on.
It sits in MKRShift Nodes' Surface/Tech Art branch, right after x1NormalMap and x1NormalBlend in the pack's surfacing pipeline. This is the "fix it in post" stage, and it's genuinely useful because normal-map convention mistakes are so common - and so silent. The author's own docs say it plainly: use this when a generated or painted normal map is too flat, too aggressive, or in the wrong green-channel convention for the target renderer.
How it works
The math is a slope-domain adjustment: it multiplies each normal's tangent slope away from a flat neutral, optionally softens the incoming field with a blur first, then re-normalizes so every vector ends up back on the unit sphere. The controls:
strength- slope multiplier. Below 1.0 flattens, above 1.0 exaggeratesblur_radius- softens the normal field before re-normalizing, which is how you calm down noisy baked mapsinput_convention- how the source is interpreted (openglordirectx)output_convention- how the result is written:match_input,opengl, ordirectxflip_x/flip_y- flip the red or green direction, for the classic "my detail is inverted" fix
The strength_mask trick
Beyond the basics, there's an optional strength_mask input, and it's the sleeper feature. It's a mask that locally blends between neutral and your requested strength. That means you can boost trim details or panel lines without overdriving the whole surface - feed a mask that's white on the detail you care about, black everywhere else, and the strength ramp applies only there. This is the node's real "tech art" moment; a plain strength slider can't do region-aware boosting.
Outputs are the familiar family trio: image (the adjusted normal map), mask (the final influence mask, combining strength_mask and the optional mask), and normal_tweak_info (a summary string of the resolved settings).
Inputs in a nutshell
Required: image, strength, blur_radius, input_convention, output_convention, flip_x, flip_y, mask_feather, invert_mask. Optional: strength_mask, mask. Unlike the settings-JSON nodes in this pack, these are proper widgets - one of the friendlier nodes in the family to just click around in.
Installing it
MKRShift Nodes installs through ComfyUI Manager (search "MKRShift Nodes") or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart, done. No requirements, no model downloads. The usual caveat applies - big repo, small family - but if you're doing material work the Surface branch is coherent enough to justify it.
Where people get burned
The input/output convention pair. If you leave output_convention on match_input, nothing gets converted - which is fine when the map is already correct, and silent when it isn't. Set it explicitly to opengl or directx once you know your target. And when a map looks "blown out," that's usually strength plus re-normalization fighting over baked-in noise; drop strength to 0.7 and add a small blur_radius before reaching for a full re-export.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| strength | FLOAT | 1.000–8 | — |
| blur_radius | FLOAT | 0.00–64 | — |
| input_convention | COMBO | 2 options: opengl, directx | |
| output_convention | COMBO | 3 options: match_input, opengl, directx | |
| flip_x | BOOLEAN | false | — |
| flip_y | BOOLEAN | false | — |
| mask_feather | FLOAT | 8.00–256 | — |
| invert_mask | BOOLEAN | false | — |
| strength_maskopt | MASK | — | |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| normal_tweak_info | STRING | — |