Anisotropy Map
Anisotropy maps for brushed metal, without the shader-science
- image
- source_mask
- mask
- image
- mask
- anisotropy_info
Brushed metal and satin are the textures that separate a nice material from a believable one, and the thing that makes them read correctly is anisotropy - the direction light stretches along the surface. x1AnisotropyMap derives that directional map from a base texture so you don't have to paint a flow field by hand. It lives in the Surface/Maps branch of MKRShift Nodes, the same lane that gives you cavity, clearcoat, and roughness derivations before you pack them into a PBR set.
This pack is young - no impressions yet, no Reddit presence I could find - so treat it as fresh but well-structured code. The map nodes in particular follow one clean, repeatable shape: pick a source, derive a scalar, normalize it, mask it.
How it works
The node turns your texture into a two-component flow field. source_mode picks what drives the material response - combined_anisotropy is the built-in heuristic that looks for smooth, metallic, fiber-like regions that want directional highlights. direction_mode then sets the flow: horizontal, vertical, a fixed angle, or computed flows like gradient_tangent (follows stripes, brushing, and weave already in the texture - a strong default), radial, or tangential. gradient_radius controls how much the gradient directions get smoothed.
Here's the part that surprises people: the image output is encoded, not a plain grayscale. R and G hold the direction, B holds the strength. That's the format x1PreviewMaterial's anisotropy input expects, so the intended path is image → x1PreviewMaterial → anisotropy, no hand-remapping. If you just want the scalar strength, grab the mask output instead. anisotropy_info logs the resolved settings.
Inputs that matter
direction_mode+direction_angle_deg- the flow direction is the whole looksource_mode-combined_anisotropyis the sensible default; the direct channels (luma,saturation,detail) are there when the heuristic missesnormalize_mode/percentile_low/percentile_high- the standard MKRShift strength remap;auto_percentileis what you want 90% of the timedetail_strength- how strongly local texture breakup suppresses the anisotropic responsecenter_x/center_y- the origin forradial/tangentialflows
Installing
ComfyUI Manager → search MKRShift Nodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart ComfyUI. No models, no requirements.txt - it runs on what ComfyUI already ships.
Where people get burned
- The
imageoutput is not a viewable scalar map - it's the encoded direction map. Previewing it raw looks like noise/color mush. Reach for themaskoutput for a readable strength map, or plug straight intox1PreviewMaterial. - These derivation nodes are all-or-nothing on normalization: if you flip to
manual_range, you ownvalue_min/value_max, and a wrong range can clip the whole map to solid black or white. - The
maskoutput is the derived strength scalar, not the optional input mask you fed in. Same pack-wide convention, same confusion.
Brushed steel, satin clothing, carbon fiber, anodized parts - any material with a visible machining or weave direction. That's the job this node exists for.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| source_mode | COMBO | 6 options: combined_anisotropy, value, luma, saturation, detail, mask | |
| direction_mode | COMBO | 7 options: horizontal, vertical, angle, gradient_tangent, gradient_normal, radial, +1 | |
| direction_angle_deg | FLOAT | 0.0-180–180 | — |
| center_x | FLOAT | 0.500–1 | — |
| center_y | FLOAT | 0.500–1 | — |
| gradient_radius | FLOAT | 2.00–64 | — |
| 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.150–2 | — |
| 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 | — |
| anisotropy_info | STRING | — |