Affine Velvet Noise Options
The sparse-impulse mask for fine detail
- noise_options
WASVelvetOptions is the one-input config node behind Affine's velvet_noise pattern, and it earns its name. Velvet noise is a sparse scattering of tiny high-frequency impulses - picture a field of isolated needles rather than a continuous texture. As a mask, it targets enhancement at a peppering of individual pixels and lets everything between them stay untouched. That makes it one of the best patterns in the WAS Affine pack for gentle fine-detail work, because the effect never floods a region; it pricks it.
The README's pattern guidance files velvet_noise under "fine detail work" alongside highpass_white and ring_noise, and that's the honest slot for it. Where ring noise carves out a specific frequency band, velvet gives you scattered single-point impulses - the "add a little grain of crispness everywhere" option. It's a favorite for hair, skin texture, and fabric where you want a touch more definition without a visible mask pattern showing up in the result.
How it works
One input, velvet_taps_per_kpx (default 14, range 1–10000) - the density of impulses per kilo-pixel (1000 pixels). It's literally a count of taps scattered across the mask. At 14, you get a sparse sprinkle; crank it toward hundreds and it becomes a dense field that starts to behave like high-frequency noise rather than discrete impulses.
The sparse-impulse nature is what keeps it subtle: because most pixels get no enhancement at all, the affine scale/bias applied through a velvet mask lands on isolated points. The eye integrates those points into "slightly more defined texture" instead of "the image got processed." That's the entire trick, and it's why velvet is so forgiving at higher scales than blob-based patterns - there's nothing big enough to overdo.
It outputs the standard noise_options DICT, wired into the noise_options input on Latent Affine, the KSampler Affine family, or the Ultimate Affine KSampler nodes, with pattern set to velvet_noise. As elsewhere in this pack, noise_options layers over and overrides the base options dict.
Installing it
It ships inside WAS Affine (WASasquatch/was_affine), by the author of the well-known WAS Node Suite. Manager: search "WAS Affine", install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was_affine.git
Restart ComfyUI afterward. No model downloads; deps are just torch/numpy (matplotlib in requirements.txt for schedule plots), and the pack explicitly doesn't need UltimateSDUpscale nodes.
Where it works best
- Skin and fabric detail. A velvet mask at modest density is the closest thing this pack has to "crisp it up without anyone noticing." Pair with a low positive scale.
- Rescuing soft LoRA output. The README pitches Affine as a fix for light-LoRA flatness, and velvet is the least intrusive pattern for exactly that.
- Deterministic grain. Like the other procedural patterns, it's seeded - hold
affine_seedfixed for a stable mask across frames or batches.
The one real gotcha: it's a config node. If the consuming affine node's pattern isn't velvet_noise, this does nothing. And if you're after a visible texture rather than a whisper, you want tile lines or cross-hatch instead. But for "I want slightly sharper detail and no mask footprint," velvet is quietly the best pattern in the pack.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| velvet_taps_per_kpx | INT | 141–10000 | Impulse density: taps per kilo-pixel (sparse high-frequency impulses). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| noise_options | DICT | — |