Edge Scraper is a simple node group that will create a mask for edge damages, inspired by the filters in many modern PBR texturing tools. It does this completely procedurally, with no UVs or baking required. You can use this mask to blend between metallic and painted textures to add paint wear to hard surface models, or to add some shine to the edges of concrete or plastic materials. Or really anything you can imagine, it's designed to be modular!
100% procedural, no UVs or baking needed
Got an asset that's impractically big to directly texture? Or one you just don't feel like unwrapping? Edge Scraper has you covered. It will instantly generate an edge wear mask based on the geometry itself. It's designed to be used with triplanar or tiling textures and procedural noise, and can quickly put worn and damaged looks on sketches and concept models. It also works great for large scale assets that would require several zillions of MB of textures to paint directly, but where you still want mesh-dependent wear effects.
Works with Cycles and Eevee
Edge Scraper works in both Cycles and Eevee. So you can use it in projects with either renderer, as well as use Eevee to get quick previews while you adjust it in a Cycles scene.
It's just a node group
Edge Scraper is simple and modular. It's just a single node with a single float output: "mask". No addons to install with it, no vomitting 8 nodes groups into your scene, no limitations on what shaders you can use it with. (If you're curious, it's essentially a wrapper around the ambient occlusion node with some noise textures)
Built-in instance variations
Got some instances? The noises in Edge Scraper have a per-instance offset so your instances will all have their own wear patterns. It's using a per-instance random offset to the W/time value of object space noise rather than relying on world space noise, so it's still safe for animated objects. Note: deforming meshes are not supported.
Adjustable scale
The size of the wear patterns and noise is adjustable with a single parameter, so you can easily fit it to your assets, no matter their scale.
Documentation:
Useage: To use Edge Scraper, append the node group and add it to your material. Its "mask" output is a simple grayscale mask. You can use this output directly on the metallic channel, or use it as a mix factor for materials or other shader parameters. The source file includes some usage examples.
Parameters:
Edge Width This is the main scale control for the effect, and is loosely approximate to the width of the damage strip in meters. Larger values will produce thicker edge highlights.
Edge Fade Adds a patchy appearance to the edge damage, to avoid it being continous on every edge. Higher values will unevenly diminish the edge wear.
Noise Scale Adjusts the scale of the noise textures that produce the effects. This value is relative to the "edge width" parameter as well as the object's scale transform. You should only need to adjust this to fine tune the damage size.
Noise Roughness Mapped directly to the "roughness" value on the noise textures, this makes adjust the noise to be more smooth vs more ragged. Higher values will produce many small details, lower values will have a more hand-drawn look.
Cavity Strength Masks off the edge wear in crevices, where the surrounding geometry would protect the edge from damage. Higher values make this effect more aggressive.
Scratches Adds some additional noise away from the edges to mimic additional damage. Higher values increase the coverage area of these damage patterns.
FAQ:
Q: Ok, what's the catch with this? It can't be that easy?
A: It is that easy, the catch is this is a fairly performance intensive way to do edge damages. I'd recommend using a texture-based solution where it's practical to do so, especially for animations.
Q: Help, it masked my entire mesh! (but Eevee is fine)
A: Short answer is that Cycles' AO node gets confused if edge width is greater than the thickness of the mesh. It see the opposite wall when searching for the perpendicular wall and believes EVERYTHING is an edge as a result. You should be able to avoid this if you set the "edge width" parameter low enough. Eevee does not have this problem since it relies on SSAO to find the edges rather than raytracing.
Q: Why isn't exposed on the node group?
A: The more parameters you expose, the harder and more intimidating the node is to use. It also requires more connections inside the group which makes it harder for power users to figure out what's going on if they want to crack open the node group. I tried to settle for a balance. I may not have hit it, feedback for version 2 is welcome!