Sheen Map
The fabric PBR map most texture packs skip
- image
- source_mask
- mask
- image
- mask
- sheen_info
Most PBR texture work stops at albedo, normal, roughness, metallic. Then you hit a satin dress, a velvet curtain, or a puffer jacket and the render comes out flat, because those maps don't describe how cloth catches light at a grazing angle. That's what a sheen map is for, and x1SheenMap is the node that derives one from a plain image instead of leaving you to paint it by hand.
How it works
Sheen is the fabric-y soft reflection you see when light skims across the surface of cloth - velvet's the classic example, where the nap reflects differently than the weave. The node reads your input image and builds a scalar map of where that effect lives, using one of six source_mode channels: combined_sheen (the default, a mix tuned for fabric), saturation, value, luma, detail (a high-frequency texture pass), or mask (uses a supplied source mask instead of the pixels). It then normalizes that raw signal - by default auto_percentile cuts the histogram tails so the map uses the full range instead of being crushed into a grey blob.
The output is a grayscale map, but the node also lets you hand a tinted version back: tint_mode offers desaturated_source (fabric color, muted), source_color (keep the actual color), or white/warm-white/cool-white for lighting the sheen itself. tint_strength (0.85) decides how much of that tint bleeds into the grayscale core.
The inputs that matter
Unlike the JSON-blob MKRShift nodes, this one is all discrete widgets, which makes it friendlier to poke at:
source_mode- pick the channel that best separates sheen in your image. If the fabric is read via its texture, trydetail; if it's a value contrast, tryluma.detail_radius(2.0) anddetail_strength(0.20) - how much fine weave/pile detail gets pulled into the map.normalize_modewithpercentile_low/percentile_high- the auto-normalization range. Lower the high percentile if the map is washing out.gamma(1.0) andcontrast(1.1) - shape the response curve.invert_values- flip dark/light, which you'll want if you're feeding the result into a renderer that expects sheen the other way around.
Outputs are image (the tinted map you can preview or pack), mask (the plain grayscale sheen scalar - usually the one you actually wire into a material), and sheen_info (a text summary of source, range, and mask coverage). The optional source_mask restricts what gets analyzed, and mask restricts where the output applies - different jobs, don't conflate them.
Installing it
It ships in the MKRShift Nodes pack, installable as one unit. ComfyUI Manager: search "MKRShift", restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart after cloning. No models to download - this is pure numpy math on your image, CPU-friendly even on big textures.
Gotchas
The mask vs source_mask split is where people trip: source_mask tells the node which pixels are fabric at all (so the map doesn't pick up the background as sheen), while mask feathers or restricts where the final map is emitted. If your sheen map is bright in the wrong places - skin, walls, wood - that's a source_mask problem, not a tuning problem. And if your renderer already takes a sheen map, check its convention before flipping invert_values; half the renderers in the wild expect the map inverted relative to the other half.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| source_mode | COMBO | 6 options: combined_sheen, saturation, value, luma, detail, mask | |
| tint_mode | COMBO | 5 options: desaturated_source, source_color, white, warm_white, cool_white | |
| normalize_mode | COMBO | 3 options: auto_percentile, manual_range, auto_range | |
| value_min | FLOAT | 0.0000–1 | — |
| value_max | FLOAT | 1.0000–1 | — |
| percentile_low | FLOAT | 2.00–100 | — |
| percentile_high | FLOAT | 98.00–100 | — |
| detail_radius | FLOAT | 2.00.1–64 | — |
| detail_strength | FLOAT | 0.200–2 | — |
| tint_strength | FLOAT | 0.850–1 | — |
| gamma | FLOAT | 1.000.1–4 | — |
| contrast | FLOAT | 1.100.1–4 | — |
| blur_radius | FLOAT | 0.00–128 | — |
| invert_values | BOOLEAN | false | — |
| mask_feather | FLOAT | 8.00–256 | — |
| invert_mask | BOOLEAN | false | — |
| source_maskopt | MASK | — | |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| sheen_info | STRING | — |