LUT Blend
Stack up to three .cube LUTs without a grading app
- image
- mask
- image
- mask
- lut_blend_info
LUTs are the fastest way to move an image toward a look - a .cube file is just a color transform table, and applying one is a lookup, not a model run. But if you've ever wanted to combine LUTs - 60% of this teal-and-orange plus 40% of that film emulation - you know the pain of chaining lookup nodes and hand-tuning opacity between them. LUT Blend is the MKRShift node that does it in one place: up to three .cube LUTs, each with its own mix weight, blended together with a real blend mode and a master intensity.
It's in MKRShift Nodes/Color/LUT, the pack's grading lane. The KB's post-processing doc makes the case for LUTs as the canonical deterministic color tool - a lookup table does in milliseconds what a re-roll does in minutes, with zero seed lottery. This node is that idea with a mixer on it.
How it works
The dropdowns (lut_a, lut_b, lut_c) list every .cube file the pack can find, each with its own mix_a/mix_b/mix_c weight (0–1). Each selected LUT is applied via trilinear lookup - the standard interpolation through the cube's grid - then the three results are combined with blend_mode: normal (weighted mix), screen/add (LUTs that lift and glow), or overlay/soft_light (LUTs that texture and grade). intensity (default 1.0) is the master strength on top of everything - think of it as one global opacity knob for the whole stack.
The gotcha that trips everyone up
The LUT dropdowns are empty until you provide LUTs. The pack ships with zero .cube files - the folder only has a README. So your first run will show only "None" as an option. Fix it by dropping your LUTs in either of two places:
ComfyUI/custom_nodes/MKRShift_Nodes/luts/(the pack's own folder), orComfyUI/input/luts/(the pack also scans the standard input directory).
After adding files, refresh ComfyUI's node list (the dropdown populates at load). Subfolders are fine - the node labels LUTs by their relative path.
That's also the honest workflow note: this node is only as good as your LUT library. If you have no .cube files, grab some free LUTs (film emulation packs, Kodak/Fuji print looks) and drop them in - then the mixers finally have something to blend.
Outputs and wiring
image is the graded result, mask reflects the effect, and lut_blend_info tells you which LUTs resolved and which warnings came up (it'll flag a LUT it couldn't find). The optional mask input scopes the blend to a region.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
then restart, or search MKRShift_Nodes in ComfyUI Manager. No pip requirements, no model downloads.
One workflow tip: LUTs are designed to be the last step, applied to a properly-exposed image. If you run a LUT before correcting exposure, you're grading through a filter - the LUT's contrast range is fixed, so your later corrections fight it. Apply LUT blend after your curves and you'll get the look the LUT author intended.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| lut_a | COMBO | None | 1 options: None |
| mix_a | FLOAT | 1.000–1 | — |
| lut_b | COMBO | None | 1 options: None |
| mix_b | FLOAT | 0.000–1 | — |
| lut_c | COMBO | None | 1 options: None |
| mix_c | FLOAT | 0.000–1 | — |
| blend_mode | COMBO | 5 options: normal, screen, overlay, soft_light, add | |
| intensity | FLOAT | 1.000–1 | — |
| mask_feather | FLOAT | 12.00–256 | — |
| invert_mask | BOOLEAN | false | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| lut_blend_info | STRING | — |