Nodes/ComfyUI libigl/Sharpen Guided Normal (backend)
ComfyUI Node

Sharpen Guided Normal (backend)

Edge-preserving sharpen with actual dials

By PozzettiAndrea·Created 10 months ago·Updated 4 days ago· 218
Sharpen Guided Normal (backend)
  • trimesh
  • sharpened_mesh
  • info
normal_iterations5
vertex_iterations10
sigma_s1.0
sigma_r0.35

Here's the problem with most mesh sharpeners: they give you one or two knobs and hope. Sharpen Guided Normal is the GeometryPack backend for when you want to control the tradeoff between flattening noise and keeping real edges. It's guided normal filtering with a min-range metric - the technique behind a lot of good scan cleanup - and it exposes four sliders that map to real geometry decisions rather than abstract "strength."

You'll normally hit it as the guided_normal option in the Sharpen Mesh dropdown, but it's also searchable directly as "Sharpen Guided Normal (backend)".

How it works

Guided filtering works in two phases, and this node splits them into two separate iteration counts so you can tune them independently.

Phase one - filter the normals. Each face's normal gets blended with its neighbors, but the blend is weighted by similarity: faces pointing in nearly the same direction average together, while faces at a sharp angle to their neighbors mostly keep their own normal. That's the edge-preserving part. Two parameters steer it:

  • sigma_s (default 1, 0.1–10) - spatial weight as a multiple of average edge length. Bigger = larger neighborhood = smoother regions, at the risk of blurring genuine features.
  • sigma_r (default 0.35, 0.01–1) - the normal-similarity threshold. The tooltip is the honest one: 0.35 corresponds to roughly a 40° dihedral angle. Lower sigma_r = only very similar normals blend = more aggressive edge preservation; higher = more gets averaged.

Phase two - move the vertices. Once you have cleaned normals, the vertices are nudged so the surface actually matches them. vertex_iterations (default 10, 1–100) controls how many passes that takes; more iterations mean better convergence. normal_iterations (default 5, 1–50) is the count for the normal-filtering phase itself - more passes = flatter near-flat regions, which is the "smooth" axis of the result.

Inputs and outputs

Input is trimesh plus those four: normal_iterations, vertex_iterations, sigma_s, sigma_r. Outputs are sharpened_mesh (TRIMESH) and info (STRING) diagnostics. That's it - no hidden magic.

How to actually dial it

Two sanity rules. First, if your output has floating creases or "steppy" artifacts, sigma_r is too high - bring it down toward 0.1 and the filter will stop averaging across real edges. Second, if the result is still noisy but the shape looks fine, add normal_iterations rather than cranking sigma_s, since a big spatial sigma is what blurs real features. The vertex pass is mostly a convergence setting; leave it at default unless you see visible drift.

Compared to siblings: two_step is the CAD recommendation, l0_minimize flattens aggressively, but Guided Normal is the one you want on organic-but-detail-critical meshes - a scanned statue, a terrain tile, anything with both fine noise and hard features. Install is the pack standard (ComfyUI Manager → "GeometryPack", or the manual clone + pip install -r requirements.txt --upgrade + python install.py), with the usual note that the comfy-env/pixi installer is experimental and slow on first run.

Categorygeompack/smoothing

Inputs (5)

NameTypeDefaultDescription
trimeshTRIMESH
normal_iterationsINT51–50Iterations for guided bilateral normal filtering. More iterations produce smoother/flatter regions while preserving sharp edges.
vertex_iterationsINT101–100Iterations for updating vertex positions to match filtered normals. More iterations give better convergence.
sigma_sFLOAT1.00.1–10Spatial weight sigma as a multiple of average edge length. Controls the neighborhood size for normal filtering. Larger = smoother but may blur sharp features.
sigma_rFLOAT0.350.01–1Normal similarity threshold. Controls which normals are averaged together. Smaller = more aggressive edge preservation. 0.35 corresponds to roughly 40 degree dihedral angle threshold.

Outputs (2)

NameTypeDescription
sharpened_meshTRIMESH
infoSTRING