Nodes/MKRShift_Nodes/Normal Tweak
ComfyUI Node

Normal Tweak

Fix the normal map instead of re-exporting it

By criskb·Created 7 months ago·Updated 5 months ago· 0
Normal Tweak
  • image
  • strength_mask
  • mask
  • image
  • mask
  • normal_tweak_info
strength1.00
blur_radius0.0
input_convention
output_convention
flip_xfalse
flip_yfalse
mask_feather8.0
invert_maskfalse

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 exaggerates
  • blur_radius - softens the normal field before re-normalizing, which is how you calm down noisy baked maps
  • input_convention - how the source is interpreted (opengl or directx)
  • output_convention - how the result is written: match_input, opengl, or directx
  • flip_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.

CategoryMKRShift Nodes/Surface/Tech Art

Inputs (11)

NameTypeDefaultDescription
imageIMAGE
strengthFLOAT1.000–8
blur_radiusFLOAT0.00–64
input_conventionCOMBO2 options: opengl, directx
output_conventionCOMBO3 options: match_input, opengl, directx
flip_xBOOLEANfalse
flip_yBOOLEANfalse
mask_featherFLOAT8.00–256
invert_maskBOOLEANfalse
strength_maskoptMASK
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
normal_tweak_infoSTRING