ComfyUI Node

Sharpen Normal

Adding bite to normal maps without breaking the vectors

By amtarr·Created 9 months ago·Updated 4 months ago· 58
Sharpen Normal
  • normal
  • normal
strength1.0
radius1.0

Sharpen a normal map like a regular photo and you get garbage. The naive approach - run an unsharp mask and clamp - squishes vectors out of unit length, and the moment they stop being unit length your lighting lies to you. Sharpen Normal does the version that works: it sharpens in tangent space, then renormalizes every vector so the map stays physically valid. That normalization step is the whole reason to use this node instead of a generic sharpen filter.

How it works

The node unpacks the normal map from 0–1 storage back to −1…1 tangent space, blurs it with a Gaussian kernel sized from radius, and adds the difference back scaled by strength - textbook unsharp mask. Then the important part: it divides each vector by its own length so all three channels come back to unit length, and repacks to 0–1. The math is what your renderer expects a normal map to be, which means you can push strength surprisingly high without the output breaking.

strength runs 0 to 5; 1.0 is a good first shot, and 0 is a clean passthrough if you want to toggle the effect. radius (0.1–10) controls how far the blur that feeds the sharpening reaches - small radii bite at fine detail, larger radii bring out broader, softer bump structure.

What to set

Start at strength 1.0, radius 1.0. If detail looks like it's starting to "chunk" - discrete facets on what should be smooth surfaces - back the strength down rather than the radius. This node is the usual suspect after Lotus or Marigold normal extraction (that's the kijai/ComfyUI-Lotus family this pack's README points at for source normal maps), where the model output can be a bit mushy.

Installing it

It's in amtarr/ComfyUI-TextureAlchemy. ComfyUI Manager → search "Texture Alchemy", or:

cd ComfyUI/custom_nodes
git clone https://github.com/amtarr/ComfyUI-TextureAlchemy

Restart and find it under right-click → Add Node → Texture Alchemist → Normal. No extra dependencies or model files for this node; the pack runs on ComfyUI's built-in PyTorch.

The honest gotcha

Because vectors get renormalized, over-sharpening doesn't blow up the value range - it makes edges crunchy instead, and it can also create faint halos at strong transitions that read as over-baked bevels. If you're going to stack this with a normal-combiner later (adding micro-detail on top), do the sharpening after the combine, not before, or you'll sharpen the base twice. And the usual pack quirk applies: a console banner prints every run. Fine. Normal-map purists will also note this sharpens in tangent space, so if your map is in a weird space to begin with, fix the format first - the pack has a normal-format converter for exactly that.

CategoryTexture Alchemist/Normal

Inputs (3)

NameTypeDefaultDescription
normalIMAGE
strengthFLOAT1.00–5Sharpening strength
radiusFLOAT1.00.1–10Blur radius for unsharp mask

Outputs (1)

NameTypeDescription
normalIMAGE