Texture Noise Field
The tileable fBm noise generator your material lane has been missing
- image
- mask
- noise_info
If you've ever needed a roughness map, a displacement base, or a grungy overlay and found yourself stitching noise tiles and fighting seams, this is the node that quietly ends that problem. Texture Noise Field generates a grayscale noise field - fBm by default, plus value, turbulence, and ridged variants - and it is seamless by construction. Not "seamless after you fix it," seamless because the noise grid wraps. Feed the output straight into a material pack or a bump lane and it just tiles.
How it works
The engine is classic fractal noise, done in pure numpy with no model in sight. The base primitive is wrapped value noise: a random grid of values interpolated across cells, with the grid wrapping so the left edge and right edge agree. Fractal Brownian motion (fBm) layers octaves of that noise - each octave doubles the frequency (lacunarity), each gets less weight (gain) - and the sum is renormalized. That's the whole trick, and it's the same one every "clouds" filter in every image editor has used for thirty years.
The variant setting is where the character comes from: fbm is your standard soft cloudy noise, value is the single-octave cheap version, turbulence takes the absolute value of the field to make sharp folds, and ridged inverts that for ridge-like wrinkles. octaves (1–8), lacunarity, and gain shape how much detail stacks up; detail_mix blends in an extra small-scale field on top. Every value is deterministic on seed, so the same settings always produce the same field - which makes it a genuinely useful, repeatable base for a texture instead of a dice roll.
The inputs that matter
All of it lives in one settings_json text box, which is the MKRShift convention you'll see across this pack - you edit JSON, not sliders. The pre-filled defaults are sane, so you can run it as-is and tune from there. The ones you'll actually touch:
variant- fbm / value / turbulence / ridgedscale_px- the feature size of the noise (160 px by default)octavesandgain- how much fine detail and how fast it falls offseed- change it to get a different fieldcontrast/balance/invert- post-shaping of the grayscale
Outputs: an image (the field as grayscale RGB), a mask (the same field as a single channel - this is what you wire into height, bump, or roughness inputs), and a noise_info string describing what actually ran.
Installing it
This ships in MKRShift Nodes, the big utility pack from criskb. Easiest route is ComfyUI Manager - search "MKRShift Nodes" and hit install. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Then restart ComfyUI. No model downloads and no pip extras for this node - the whole texture lane is numpy/Pillow/torch, which any ComfyUI install already has. (The README's ffmpeg and slicer requirements only matter for the pack's video and G-code nodes; you can ignore them.)
Common gotchas
The pack is young - at time of writing it has essentially zero community footprint, so you're early and nobody's written the "here's what bit me" posts yet. Two things I can tell you from the code. First, if you break the JSON in settings_json (missing quote, trailing comma), the node silently falls back to defaults - there's no error, it just runs with different values than you think. Second, out-of-range values get clamped, not rejected. Both are confusing until you know they're happening, so when output doesn't match your edits, look at the JSON first.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| settings_json | STRING | {"width":1024,"height":1024,"variant":"fbm","scale_px":160.0,"octaves":5,"lacunarity":2.0,"gain":0.55,"detail_mix":0.18,"contrast":1.15,"balance":0.0,"invert":false,"seed":17} | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| noise_info | STRING | — |