- image
- image
You finally get the shot. It's also lit through a lime jelly. Two moves from here: reroll and hope, or correct it. ꘇ top.rgb is the correct-it node - three gains, three offsets, applied per channel, no model, no trip to Photoshop.
It lives in Genereti / TOP, the top.* half of the Genereti pack - a realtime creative-coding toolkit arranged in TouchDesigner-ish families: top.* textures, chop.* signals, dat.* data. This is one of the small, boring, load-bearing texture operators.
What it actually does
Multiply, then add. Each RGB channel gets its own gain, then its own offset, and the result is clamped to 0–1. Alpha is left completely alone.
The queued PyTorch implementation and the Live WebGPU shader are the same math, which is rarer than you'd hope in realtime packs:
out.rgb = clamp(rgb * [red_gain, green_gain, blue_gain] + [red_offset, green_offset, blue_offset], 0, 1)
out.a = a
Gain first, offset second matters. Gain is a multiplier, so it acts relative to the existing color; offset is a flat lift or crush applied after scaling, which is what you want for opening up shadows or knocking down a floor. Flip them in your head and your grade stops making sense.
And note what it isn't: a tone curve. There's no shoulder, so anything past 1.0 clips hard. If you want black and white points, gamma, contrast around 0.5 and saturation in one pass, that's ꘇ top.level. If you want hue rotation or saturation scaling, that's ꘇ top.hsv. ꘇ top.rgb is the channel surgeon.
The six numbers that matter
All six are on the node - no hidden options:
- red_gain / green_gain / blue_gain - 0 to 4, default 1. Nothing above 1 is subtle: 1.06 on red is already a visible warm shift.
- red_offset / green_offset / blue_offset - −1 to 1, default 0. These are the ones you use at ±0.03–0.06 for a cast. Positive lifts the channel everywhere, including the black point, which is why a blue offset reads as "cool shade" and not "cool highlight."
Defaults are a deliberate no-op, so you can park the node in a chain and leave it alone. Three recipes worth keeping: a green cast on skin is usually green_gain 0.95, a touch of blue_offset 0.04 plus red_gain 0.98 reads like moonlight, and red_gain 1.06 / blue_gain 0.96 warms a cold-lit plate without touching the prompt. Swapping channels or turning a channel into a mask is ꘇ top.channels - different job.
Where you put it earns its keep. Correcting before ꘇ top.bloom changes which pixels cross the glow threshold; correcting after it just tints the glow you already committed to. And because alpha passes through untouched, it's safe to grade a cutout mid-chain - plenty of nodes in this ecosystem quietly drop that fourth channel.
The single output is image, an ordinary ComfyUI IMAGE. Wire it to a preview, into ꘇ top.composite, or into the source of a feedback chain.
Installing it
Genereti is one folder, not a family of packs:
cd ComfyUI/custom_nodes
git clone https://github.com/languel/genereti.git genereti
./.venv/bin/python -m pip install -r genereti/requirements.txt # use ComfyUI's Python
Windows PowerShell wants \.\.venv\Scripts\python.exe; Portable wants its bundled python_embeded\python.exe - never global pip. requirements.txt is essentially a frontend floor: torch, NumPy and Pillow already come from Comfy. No model downloads. Manager install by searching "Genereti" works, but registry availability has been intermittent, so git is the reliable path. Restart ComfyUI, hard-refresh the browser page, and note that Live mode wants a modern WebGPU-capable browser.
Where people get burned
- You can't find the node. It's under
Genereti / TOP, display nametop.rgb. Search "top." rather than "rgb" to skip past the twenty RGB-splitting nodes from other packs. - Nothing happens when you tweak it. Defaults are identity by design - and check you're looking at a fresh preview. Cached previews cost people real minutes.
- Live refuses to run. The browser path bails with a WebGPU error when the adapter or browser is missing; switch to Queue (
Run) and the torch path handles it. - Highlight detail vanishes. Any gain above 1 clips at 1.0. Recover by grading earlier in the chain, or by lowering the gain and lifting the offset instead.
- Live and Queue look slightly different. Live keeps intermediate textures at 8-bit rgba8unorm while Queue stays in float, so an extreme lift can band in Live and not in Queue. Grade with Queue if you're delivering frames.
- The pack argues with an old install. If you previously had the split
genereti_comfy_*folders incustom_nodes, Genereti refuses to register and tells you to move them out. Keep them elsewhere for rollback.
One last thing: the README calls this a super-alpha classroom release and asks you to back up workflows before updating. Believe it. top.rgb is one of the safest nodes in the pack - it's the rest of the pack you should be careful with.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| red_gain | FLOAT | 1.000–4 | — |
| green_gain | FLOAT | 1.000–4 | — |
| blue_gain | FLOAT | 1.000–4 | — |
| red_offset | FLOAT | 0.00-1–1 | — |
| green_offset | FLOAT | 0.00-1–1 | — |
| blue_offset | FLOAT | 0.00-1–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |