Sharpen Normal
Adding bite to normal maps without breaking the vectors
- normal
- normal
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.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| normal | IMAGE | — | |
| strength | FLOAT | 1.00–5 | Sharpening strength |
| radius | FLOAT | 1.00.1–10 | Blur radius for unsharp mask |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| normal | IMAGE | — |