Feather vs SDF

   225   3   0
User Avatar
Member
70 posts
Joined: March 2025
Offline
Unfortunately, the bevel created by the feather node looks like a wrinkled surface on curved shapes, which is very unsightly if you're simulating refraction or reflection.

This is clearly visible in the normal map where the color changes, and these wrinkles are clearly visible. The screenshot shows a comparison of the normal map and some parts of the bevel created by SDF and Feather on the same shape. This text in the clip with Feather looked very wrinkled in the final result, and you'd have a hard time understanding why.

So, guys, use Feather only on rectangular parts, and for proper quality, use SDF.
Edited by Gaalvk - June 19, 2026 04:59:55

Attachments:
cop.mp4 (4.3 MB)
Screenshot 2026-06-19 1135551.jpg (39.4 KB)

User Avatar
Staff
7106 posts
Joined: July 2005
Offline
This is somewhat frustrating as "Feather: Circle" _is_ using the same eikonal equation as the SDF building. The catch is that in the Font SOP we can use the 0.5 cut-off of the antialiased font to get a sub-pixel starting distance; but in the feather case it effectively will trigger off the on-off status of the 1 pixels. So your smooth distance from a bumpy pixelated border will have wrinkles in the normal :<

Unfortunately as Feather is meant to work with grey scale input, we can't use a thresholding trick as there is no universal threshold to pick.
User Avatar
Member
70 posts
Joined: March 2025
Offline
Ah, thanks, I get the idea.

But what's confusing is that I turned antialiasing on and off—it had almost no effect on the wrinkles. You can even use SDF circle solid - sdftomono - feather(circle) - slopedir — and the wrinkles are immediately visible, regardless of whether antialiasing is enabled.

Just for information.
User Avatar
Staff
7106 posts
Joined: July 2005
Offline
Yep, if your "feather" amount is a slower drop off than the antialiasing is, it basically just replaces the antialiasing outright.

Consider 1 dimensions
1 0.5 0 0 0
If this is feathered at 0.1 per voxel
1 0.9 0.8 0.7 0.6

Essentially the peak at "1" will overwrite all the antialiased values around it, so they become meaningless.

By contrast, the SDF process picks one value to declare as the boundary and measures from that. But this means if you have a big patch with a values of 0.25, it will disappear if you have 0.5 as your boundary.
  • Quick Links