Procedural Patterns
Procedural patterns without a model download — the ComfyUI trick for guided shapes
- pattern_image
- pattern_mask
This node is the rare ComfyUI addition that is pure math and zero megabytes. Procedural Patterns generates symmetrical patterns - concentric torus rings, radial beams, spiral rings, or a combined mess of all three - and hands them to you as an image and a mask. No model files, no weights, no VRAM beyond the tensors themselves. It's from the ComfyUI_illumorae pack, a small collection of randomization and variation-exploration tools by CorvaeOboro, and it's one of the few nodes in the pack that touches pixels instead of strings.
Why would you want a synthetic pattern in the middle of a generation workflow? Because it's a cheap, fully deterministic way to steer structure. Drop the pattern_image into an img2img pass and the rings give the sampler something to hang composition on. Use the pattern_mask to tell an inpainting or regional-prompt node where to work. It's the same instinct as feeding a generated mandala into a style transfer - you're injecting visual rhythm without waiting on a ControlNet preprocessor.
How it works
Everything is generated from parameters, numpy-style, on the CPU. The three concrete families are:
- torus_rings - concentric bands radiating from a center, good for depth and focus
- radial_beams - lines shooting out from a point, energy and direction
- spiral_rings - radial plus angular phase, the one that looks like a galaxy
Each band is built with a thickness, a falloff (how soft the edges are), and a count. There's also combined, which stacks the families. center_x/center_y place the origin, rotation and scale transform the whole thing, invert flips it, and colorize (with optional color_a/color_b hex strings) tints it.
Here's the gotcha the brief warns about, and it's worth repeating because it will bite you: the seed only does anything in two situations. If pattern_type is random, the seed picks which family you get. If chaos_mode is on, the seed randomizes every parameter. Otherwise the output is fully deterministic and the seed is dead weight - you can crank it all day and nothing changes. So if you're seeding for variation and nothing moves, check those two toggles first.
The inputs that matter
You don't need to touch all fourteen. For a first run:
- width / height - default 512 each, range up to 8192. Step is 8, so keep values on that grid.
- pattern_type - the family dropdown,
randomincluded. - ring_count / beam_count and their
_thickness/_falloffsiblings - the actual shape controls. Defaults (8 rings, 12 beams, 0.3 thickness, 0.5 falloff) are a reasonable start. - chaos_mode - the one that turns it into a slot machine.
Outputs are pattern_image (IMAGE) and pattern_mask (MASK). The mask is the useful half for compositing work - a clean single-channel you can wire into anything that eats masks.
Installing it
Part of the illumorae pack, so: ComfyUI Manager → search "illumorae" → install, or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/CorvaeOboro/ComfyUI_illumorae
Then restart ComfyUI. No model downloads, no heavy deps - the pack's requirements are numpy/pillow/torch, which you already have in any working ComfyUI. The pack is CC0 and every node is self-contained, so if you want only this one, you can copy its ComfyUI_illumorae_GenProceduralPatterns subfolder into custom_nodes and nothing else.
Troubleshooting
The main things people hit: the seed-not-working surprise above, and forgetting that this is a guide, not a texture pack - if you feed rings into img2img at high denoise they get smeared into whatever the model wants to draw, so keep the influence modest. There's no IS_CHANGED weirdness to fight since the outputs recompute cleanly with the seed, and nothing here touches the network, so a "random" run is instant. Not the flashiest node in your graph, but the one that keeps working when the checkpoint changes out from under you.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| width | INT | 51264–8192 | — |
| height | INT | 51264–8192 | — |
| pattern_type | COMBO | 5 options: random, torus_rings, radial_beams, combined, spiral_rings | |
| ring_count | INT | 81–100 | — |
| ring_thickness | FLOAT | 0.300.01–1 | — |
| ring_falloff | FLOAT | 0.500–0.99 | — |
| beam_count | INT | 121–360 | — |
| beam_width | FLOAT | 0.300.01–1 | — |
| beam_falloff | FLOAT | 0.500–0.99 | — |
| center_x | FLOAT | 0.500–1 | — |
| center_y | FLOAT | 0.500–1 | — |
| rotation | FLOAT | 00–360 | — |
| scale | FLOAT | 1.00.1–10 | — |
| invert | BOOLEAN | false | — |
| colorize | BOOLEAN | false | — |
| chaos_mode | BOOLEAN | false | — |
| seed | INT | 00–18446744073709550000 | — |
| color_aopt | STRING | #000000 | — |
| color_bopt | STRING | #FFFFFF | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| pattern_image | IMAGE | — |
| pattern_mask | MASK | — |