Nodes/ComfyUI Field/Field Noise
ComfyUI Node

Field Noise

Perlin, Simplex and Worley That Look the Same at Every Resolution

By jeremieLouvaert·Created 3 months ago·Updated 24 days ago· 1
Field Noise
  • reference_image
  • reference_mask
  • mask
  • preview
◄noise_typeperlin►
◄scale6.0►
◄octaves4►
◄gain0.50►
◄lacunarity2.00►
◄coverage0.50►
◄distributionuniform►
◄seed0►
◄width512►
◄height512►
◄offset_x0.00►
◄offset_y0.00►

The one you'll actually start with

Everybody's noise node in ComfyUI is a latent-noise generator: it makes the tensor you sample from. Field Noise makes something different - a mask. A controllable, resolution-independent, deterministic pattern of values you can use to decide where things happen. Multiply it by an edge field and your effect lands on the contours of the image; threshold it and you've got organic blobs; wire it into Field Composite and you've got a spatially random blend instead of a uniform one.

And now the part that justifies the whole pack: it's a procedural function of position, not of pixel index. scale is "cells across the longer edge", so a 512 preview and a 2048 render are the same picture sampled more finely. Change the aspect ratio from 1:1 to 16:9 and your circles stay circles, because both axes are divided by max(width, height) rather than by width and height separately. If you've ever generated a noise mask, upscaled the workflow, and gotten a visually different result, this is the fix.

Five kernels, one coverage control

noise_type gives you perlin (default), simplex, value, worley_f1 and worley_f2f1. Perlin and simplex are the smooth gradient noises you'd expect; value is blockier; the two Worley variants are cellular - f1 is the distance to the nearest feature point (bubbles), f2f1 is the difference between the second-nearest and nearest (a crackle/vein pattern).

octaves, gain and lacunarity are standard fBm: layer count, per-octave amplitude falloff, per-octave frequency multiplier. Octaves are fixed regardless of resolution, which is the invariant the whole pack protects.

Then coverage, and this is the good bit. Noise is bell-shaped, not uniform, so thresholding it at 0.5 doesn't select half the frame - the fraction depends on the type, the octaves and the gain. In uniform mode (the default) the node applies a probability integral transform, estimated from a probe of the field over the visible window, so coverage = 0.3 means "30% of the frame is above the midpoint" for every type and every setting. That consistency is what makes noise comparable with edge fields and distance fields inside Field Combine.

native skips the transform and maps the raw kernel straight to 0–1 by its measured range. It looks washed out, and it's supposed to - a bell curve squeezed into a box does. The author keeps it mainly as the negative control that proves the coverage mechanism has teeth, which is a refreshingly honest reason to ship a mode.

offset_x / offset_y pan across the field in frame units (1.0 shifts by one frame width). seed drives the hash tables and a lattice offset, and width/height set the output.

Outputs and the reference inputs

Two outputs: mask (the field) and preview (the same thing as a 3-channel IMAGE). Wire preview to a Save Image when you're tuning; wire mask to Threshold, Combine, Composite, Morphology, or a sampler.

The reference_image and reference_mask inputs are worth more than they look: wire the image you're going to composite onto and the field inherits its width, height, batch size and device, so nothing downstream resizes. If you wire both, the image wins and the console tells you.

Why it's precise about the ugly bits

Two of the five kernels don't have an analytically known range, so their constants are measured: simplex uses 99.20433810130643, and Worley's native maxima come out at 1.32 for f1 and 1.40 for f2f1. The simplex number is the tell that nothing here was copy-pasted - this build's gradients are 16 unit vectors shared with the Perlin kernel, so the commonly cited 70.0 constant wouldn't apply.

The node also warns you in two situations: trailing fBm octaves get dropped if the finest would exceed the hash table's 4096-cell period, and a note fires (without changing anything) if the finest octave falls below 2 pixels per cell and will alias. Neither is an error; both tell you your settings aren't doing what the numbers suggest.

Install

ComfyUI Manager → search ComfyUI Field, or:

cd ComfyUI/custom_nodes
git clone https://github.com/jeremieLouvaert/ComfyUI-Field

Restart. No model files, no pip step - requirements.txt is empty because torch is already there. Nodes land under AKURATE/Fields/Generate.

Where it goes wrong

Cranking octaves and expecting more visible detail is the classic one. Past the hash table's period, higher octaves are silently dropped, and if your base scale is low the finer octaves fall below two pixels per cell and just alias into noise. The console tells you both times - read the console.

And a reality check worth knowing before you start: this pack is new enough that the community signal is essentially nil - searching the usual places for "ComfyUI-Field" turns up Reddit threads about something else entirely. There's no pile of tutorials to copy settings from. Read the tooltips and watch the console; the pack's own documentation is unusually good, and it's all you've got.

CategoryAKURATE/Fields/Generate

Inputs (14)

NameTypeDefaultDescription
noise_typeCOMBOperlin5 options: perlin, simplex, value, worley_f1, worley_f2f1
scaleFLOAT6.00.1–512Noise lattice cells spanning the longer output dimension
octavesINT41–8Number of fBm layers. Fixed regardless of resolution
gainFLOAT0.500–1Amplitude falloff per octave
lacunarityFLOAT2.001–4Frequency multiplier per octave
coverageFLOAT0.500–1Fraction of the frame above the midpoint. 0.5 is a no-op
distributionCOMBOuniformuniform: PIT-normalised, coverage is exact. native: raw kernel range, coverage is approximate
seedINT00–4294967295—
widthINT51216–8192—
heightINT51216–8192—
offset_xFLOAT0.00-4–4Pan across the field, in frames. 1.0 shifts by one frame width
offset_yFLOAT0.00-4–4Pan across the field, in frames. 1.0 shifts by one frame height
reference_imageoptIMAGE—
reference_maskoptMASK—

Outputs (2)

NameTypeDescription
maskMASK—
previewIMAGE—