VectorscopeCC
Color-grade the latent, not the pixels
- model
- MODEL
Ever finished a generation and reached for the saturation slider in an editor? This is the node that makes you stop doing that. VectorscopeCC is a model patch that applies brightness, contrast, saturation, and color-channel shifts to the image while it's still a latent noise field, one denoising step at a time.
It's a port of Haoming02's famous SD WebUI Vectorscope-CC extension - the same Haoming02 who maintains Forge Classic/Neo - brought to ComfyUI by pamparamm, the author behind ComfyUI-ppm. And a heads-up: the name is a bit of a lie. There's no vectorscope display here, and no fancy color wheel like the A1111 original had. What you get is the color grading, minus the visuals.
Why grade the noise instead of the pixels? Grading a finished image in an editor can posterize, band, and generally fight what the model already baked into the texture. Apply the same look during denoising and it stays coherent with the model's lighting and film grain. The WebUI extension was pitched as "offset noise during inference" - that's exactly the trick: instead of training with biased noise, you bias the noise per generation.
How it works
Each step, the node reads the latent, picks a "target" signal, and nudges the latent's channels toward it. Your strength values get divided by the total step count, so the number you type is roughly the total effect across the whole run. It reads the latent format off the model: SD1.5 treats channel 0 as luminance and channels 1–3 as color; SDXL converts your RGB values into CbCr, because its latent channels are YCbCr-ordered. The channel math lives in cc_nodes.py if you want to verify.
The inputs that matter
- brightness, contrast, saturation - the obvious ones. Saturation multiplies the color channels per step (0.05–3, default 1 = no change).
- r, g, b - the color direction. These are the components of the hue you're nudging the noise toward; positive flips to negative reverses it. This is where the WebUI's color wheel got encoded into three sliders.
- method - which signal to bias against. Straight uses the model's current clean prediction, Cross uses the raw noisy latent, Multi-Res uses kohya's multires noise, and Ones / N.Random / U.Random use constant or random targets. The Abs. variants take absolute values, which is handy for pushing colors away from neutral gray.
- scaling - how the strength ramps across the schedule: Flat applies it evenly, the Cos/Sin family tapers it toward the start or end.
- alt - swaps the straight/cross targets.
Here's the part I like: with all strengths at 0 and saturation at 1, the node is a no-op. Drop it in, dial things up, zero risk.
Output and wiring
One output, MODEL. Put it between your checkpoint loader and the KSampler, in the same spot you'd drop a LoRA - model patches chain, so it plays fine with LoRAs and CFG nodes. If you have DiffusionCG from the same pack, they combine: grade the color here, normalize the range there.
Install and gotchas
ComfyUI Manager → search "ComfyUI Vectorscope CC", or:
cd ComfyUI/custom_nodes
git clone https://github.com/pamparamm/ComfyUI-vectorscope-cc
Restart ComfyUI. No model downloads, no exotic dependencies - it's pure torch plus ComfyUI internals.
The real gotcha is how it works: the pack hijacks ComfyUI's sampler loop (a CallbackManager patches KSAMPLER.sample) and injects a per-step callback, but only fires it for the model branch you've wired in. If another custom node also monkeypatches the sampler, or you use a sampler that bypasses the standard path, behavior can get unpredictable - when in doubt, test with the node bypassed. And it only knows SD1.5 and SDXL latent layouts; the code branches on exactly those two. Feed it anything else and nothing explodes, the adjustments just won't line up with the channel layout you're expecting.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| alt | BOOLEAN | false | — |
| brightness | FLOAT | 0.00-10–10 | — |
| contrast | FLOAT | 0.00-10–10 | — |
| saturation | FLOAT | 1.000.05–3 | — |
| r | FLOAT | 0.00-10–10 | — |
| g | FLOAT | 0.00-10–10 | — |
| b | FLOAT | 0.00-10–10 | — |
| method | COMBO | Straight Abs. | 9 options: Straight, Straight Abs., Cross, Cross Abs., Ones, N.Random, +3 |
| scaling | COMBO | Flat | 5 options: Flat, Cos, Sin, 1 - Cos, 1 - Sin |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |