Texture Ripple Field
Water ripples, moiré, and interference — a seamless ripple field
- image
- mask
- ripple_info
Rippled water, corrugated surfaces, interference patterns, even cheap LCD-screen moiré - they all start from the same math: concentric or directional waves that overlap and beat against each other. Texture Ripple Field is the procedural generator for that family, and it comes with the pack's usual guarantee: the output is seamless, so a water tile actually tiles.
How it works
procedural_ripple_pattern starts with a wave field and lets you bend it. The pattern_mode chooses the geometry: directional is parallel traveling waves, rings is concentric ripples spreading from centers, and interference (the default) overlaps multiple wave directions so they create that classic water-surface crosshatch. radial_mix blends the directional waves with the ring pattern, interference controls how strongly the overlapping waves beat against each other, and warp_strength distorts the whole field with noise so it looks like a moving surface rather than a static grating. direction_deg rotates the base waves, and ripple_scale_px sizes them.
Like every generator in this pack it's wrapped value noise in numpy - no model, no GPU, deterministic on seed. Set a seed, get the same ripples every time; change it, get a different layout.
The inputs that matter
Settings live in one settings_json text box (the pack's JSON-over-sliders convention). Defaults are runnable; the ones you'll edit:
pattern_mode- directional / rings / interferenceripple_scale_px- wave spacing (160 px default)interferenceandradial_mix- the two knobs that make it look like water instead of a fencewarp_strength- how much the ripples wanderseed- new patterncontrast/balance/invert
Outputs: image (grayscale field as RGB), mask (single-channel field - drop it straight into a displacement or normal lane), and ripple_info with the resolved settings. Seamless by construction, so no detile pass downstream.
Installing it
Part of MKRShift Nodes from criskb. Via ComfyUI Manager, search "MKRShift Nodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart ComfyUI; it's under MKRShift Nodes → Surface → Texture. No model files, no pip extras - just numpy/Pillow/torch. The README's ffmpeg/slicer notes belong to other lanes of the pack.
Common gotchas
The pack is too new for there to be community posts about it, so trust the source. The two silent traps to remember: malformed JSON in settings_json falls back to defaults without erroring, and out-of-range numbers are clamped rather than rejected. Both make the node appear to ignore you. For a first attempt, leave interference around 0.5–0.6 and crank warp_strength a little - the default 0.24 is conservative, and real water reads with more wandering.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| settings_json | STRING | {"width":1024,"height":1024,"pattern_mode":"interference","ripple_scale_px":160.0,"direction_deg":28.0,"radial_mix":0.42,"interference":0.58,"warp_strength":0.24,"contrast":1.15,"balance":0.0,"invert":false,"seed":71} | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| ripple_info | STRING | — |