Nodes/kubakub nodes/kubakub apply lut (old)
ComfyUI Node

kubakub apply lut (old)

Get your Resolume look into ComfyUI, or your ComfyUI look out

By kubakubkub·Created about a month ago·Updated 2 days ago· 10
kubakub apply lut (old)
  • images
  • mask
  • images
◄lut▾►
◄strength1.00►
◄lut_path►

What it's for

If you're making content for projection mapping you already own a pile of .cube files - Resolume, MadMapper, After Effects, Resolve, whatever the house system uses. This node applies one of them to your frames, inside the graph, so the thing you preview in ComfyUI is the thing that plays on the building instead of a picture you grade again later in a second application.

It's the second half of a pair: kubakub colour match fits a look and can write you a .cube; kubakub apply lut reads one and applies it. Same idea as colour match, different direction - one goes image → look, this one goes look → image.

How it works

It parses the .cube text directly and applies the table to each frame: 1D or 3D LUTs both work, which covers the classic Resolve/AE .cube exports. strength blends between your untouched frames and the full look, so 0.35 is a faint version of the grade rather than an on/off switch. The optional mask restricts the look to part of the frame - white is full strength, grey is partial, and a mask of another size gets resized to the frames. One mask serves the whole batch.

Where the files come from is the nicest detail: the dropdown is built from input/luts, models/luts and output/kubakub_luts, so anything colour match saved is immediately selectable, and anything you drop into the input folder shows up next to it.

Inputs and outputs

  • images - the frames to grade (a still or a batch).
  • lut - the .cube you picked from the dropdown. If none of those folders has any .cube at all, the dropdown literally reads (none: put .cube files in input/luts).
  • strength - 0 to 1, default 1. How much of the look.
  • lut_path (optional) - any .cube path, and it wins over the dropdown. This is the escape hatch for project folders and network shares.
  • mask (optional) - grade inside only.

One output: images. Feed it to deflicker if the grade introduced movement, then to kubakub export video / frames.

Install

Manager → kubakub nodes. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/kubakubkub/ComfyUI_KubaNodes
python -m pip install -r ComfyUI_KubaNodes/requirements.txt

That requirements.txt is one line long - opencv-python-headless>=4.8 - and if you already run opencv-python or opencv-contrib-python, keep yours rather than letting pip swap in a second build. The pack wants ComfyUI 0.37.0+ for its node API.

Common issues

  • "kubakub apply lut: no .cube file". The node raises rather than quietly passing your frames through, which is the right behaviour and still annoying at 2am. Check the spelling, and note that lut_path is checked first - a stale path there overrides a perfectly good dropdown selection.
  • Your freshly copied .cube isn't in the list. The option list is built when the node loads, so a new file in input/luts needs a ComfyUI restart (or paste the path in lut_path). This is the single most common "the node is broken" that isn't.
  • The grade looks blown out. Check strength and check the LUT's colour space assumptions - a log-to-Rec709 LUT applied to already-Rec709 frames does exactly what you'd expect, which is nothing good. Frames come through in 0-1 float, so a LUT that expects a wider range will crush.
  • Nothing happens at all. A .cube that parses but does nothing usually means the LUT was authored for a different primaries/gamma pair. Look at the file in a text editor - a 3D LUT lists its DOMAIN_MIN/DOMAIN_MAX, and if the domain isn't the usual 0-1, that's your answer.
Categorykubakub/2d/post

Inputs (5)

NameTypeDefaultDescription
imagesIMAGE—
lutCOMBOA .cube from input/luts, models/luts, output/kubakub_luts.
strengthFLOAT1.000–1How much of the look: 1 = all of it, 0 = the frames as they are.
lut_pathoptSTRINGAny .cube file; wins over the list.
maskoptMASKThe look only inside this mask (white = full, grey = partly); outside the frames stay as they are. One mask serves every frame; another size is resized.

Outputs (1)

NameTypeDescription
imagesIMAGE—