Nodes/Skoogeer-Noise/Latent Perlin Fractal Noise
ComfyUI Node

Latent Perlin Fractal Noise

Smooth, structured variation instead of TV static

By ttulttul·Created 9 months ago·Updated 3 months ago· 14
Latent Perlin Fractal Noise
  • latent
  • mask
  • LATENT
seed0
frequency2.00
octaves4
persistence0.50
lacunarity2.0
strength0.50
channel_modeshared

Plain Gaussian noise is the boring option for perturbing a latent: it's flat, uncorrelated static. Perlin noise is the opposite - it's smooth noise, built from a lattice of gradients, so nearby pixels move together. Add a few octaves of it on top of each other and you get the classic fractal "clouds on a mountain range" look that game devs have been using for terrain since the 90s. This node takes that pattern and injects it into your latent, scaled relative to the latent's own standard deviation.

Why would you want that in a diffusion workflow? Because smooth, structured variation reads as intentional variation once it goes through the sampler. A low strength Perlin bump on a latent nudges the image toward soft, cloud-like detail or gentle color drift; a higher one starts pulling out wave, bark, or flame-like textures depending on your frequency. If you're doing img2img variation hunting and plain noise keeps giving you dead flat copies or chaos, Perlin is the middle path - it decorrelates your latents while keeping spatial structure intact.

The inputs you'll actually set

The fBm-style controls are the classic Perlin stack, and they're all exposed:

  • frequency (default 2) - the base lattice frequency. Lower = big, broad features; higher = finer detail. This is your main "scale" dial.
  • octaves (default 4) - how many noise layers stack up. Each octave doubles the frequency (via lacunarity) and halves the amplitude (via persistence). More octaves = richer, more natural detail, marginally slower.
  • persistence (0.5) and lacunarity (2.0) - the classic Perlin pair. Leave them alone until you know what you're doing; the defaults are the community-standard values for a reason.
  • strength (0.5) - how hard the noise hits, scaled relative to the latent's standard deviation rather than in raw units. 0.5 is a gentle nudge; 1.0 is a firm shove.
  • channel_mode - shared reuses one noise field across all channels (coherent, keeps the RGB relationships intact), per_channel reseeds per channel (more chaotic, more colorful breakup).

seed makes it repeatable, and the optional mask input limits the injection to a region (resized to latent resolution). The single LATENT output drops back into your graph wherever the original latent was headed - typically into a sampler or a VAE decode.

One quirk worth knowing: for 5D latents (B, C, T, H, W - video/flow-matching shape), this node generates genuine 3D Perlin across (T, H, W), so the noise stays temporally coherent by construction. That's why it has no temporal_mode parameter - the image-only siblings do. If you want per-frame reseeding, that's what the Simplex node's temporal_mode: animated is for.

Installing and using it

It's part of the Skoogeer-Noise pack. Install via ComfyUI Manager (search "Skoogeer-Noise"), or:

cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise

then restart ComfyUI. No models to download - the pack's only deps (torch, numpy, einops, pyyaml) are all ComfyUI staples. On Flux.2, remember the latent-noise wrap: Unpatchify Flux.2 Latent → your noise node → Patchify Flux.2 Latent, or the 2x2 patchified channels produce block artifacts.

Common issues

The two failure modes are "nothing happened" and "everything melted." Nothing happened almost always means strength is too low relative to the latent's std - these latents have small variance, so trust the relative scaling and bump strength rather than cranking frequency. Melted usually means frequency and octaves both got cranked; drop octaves back to 3–4 and lower strength. And if your whole image shifts hue rather than gaining structure, flip channel_mode from per_channel back to shared.

CategoryLatent/Noise

Inputs (9)

NameTypeDefaultDescription
latentLATENTLatent that will be perturbed with fractal Perlin noise.
seedINT00–18446744073709550000Seed controlling the procedural noise pattern.
frequencyFLOAT2.000.01–64Base lattice frequency. Higher values produce finer details.
octavesINT41–12Number of noise layers to accumulate.
persistenceFLOAT0.500–1Amplitude multiplier between octaves.
lacunarityFLOAT2.01–6Frequency multiplier between octaves.
strengthFLOAT0.500–5Scales the normalized noise relative to the latent's standard deviation.
channel_modeCOMBOsharedShared noise across channels or unique noise per channel.
maskoptMASKOptional mask (often image-sized) to limit the noise injection to masked areas. The mask is resized to latent resolution (bicubic when downscaling).

Outputs (1)

NameTypeDescription
LATENTLATENT