Nodes/OmniNodes/3D LUT Apply 🎞️
ComfyUI Node

3D LUT Apply 🎞️

Drop a Film LUT on Your Render Without Leaving ComfyUI

By TensorVizionΒ·Created 3 months agoΒ·Updated about 8 hours agoΒ· 0
3D LUT Apply 🎞️
  • image
  • image
  • summary
β—„lut_pathβ–Ί
β—„strength1.00β–Ί

The entire color-grading world - DaVinci Resolve, Premiere, every LUT pack you've ever downloaded - runs on .cube LUT files, and ComfyUI mostly ignored them. 3D LUT Apply fixes that gap: it loads a standard Adobe/IRIDAS .cube file and applies it to your image with a strength slider. That's a real workflow unlock, because the colorist's shelf is full of ready-made film looks - Kodak emulation, teal-and-orange blockbuster, bleach bypass - that you can now drop onto a render as a deterministic post-pass instead of trying to coax the same grade out of a prompt. A LUT is a lookup table, not a model: millisecond, free, and it won't rewrite your subject's face. This is the "do color correction with a table, not with img2img" lesson applied directly.

How it works

It parses the .cube file - reads the LUT_3D_SIZE N header and the NΒ³ RGB triplets (red varying fastest, then green, then blue, the standard ordering) - then maps every pixel through the table using trilinear interpolation. That interpolation detail is why it looks good: a LUT's grid points (commonly 17, 33, or 65 per axis) rarely line up with actual pixel values, and nearest-neighbor lookup would band on smooth gradients. Trilinear keeps gradients smooth.

strength blends the graded result back with the original - 1.0 is fully graded, 0.0 is unchanged - so you can apply 30% of a heavy look instead of 100%. That single slider replaces the separate blend node you'd otherwise need.

One safety note baked into the docs: LUT files contain only RGB float data, so loading an untrusted .cube carries no code-execution risk. That's a nice property of the format, and the pack is right to call it out.

Inputs and outputs

  • image - the IMAGE to grade.
  • lut_path - a plain text field. You type the path; there's no file browser. Absolute paths work best.
  • strength - 0 to 1.
  • image - the graded result.
  • summary - confirms what it loaded (size, domain).

Where it fits

Anywhere you want a consistent look without fighting the sampler: apply a film LUT as the final post-pass before save, batch-grade an entire video's frames for a consistent look, or use it to match a render's grade to a reference you've already graded elsewhere. It slots into the post-processing layer the ecosystem keeps under-served - the deterministic pixel operations that a diffusion pass is the wrong tool for. It's also a great fit for video work, where a per-frame LUT keeps every frame exactly in grade.

Install and troubleshooting

No dependencies beyond ComfyUI's bundled stack:

cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes

Restart, find it under TensorVizion/Image (ComfyUI Manager, search "OmniNodes", also works).

  • "This is a 1D LUT file" error - the node only supports 3D .cube LUTs (LUT_3D_SIZE). It raises a clear, named error rather than misreading a 1D file, but the fix is to grab a 3D LUT.
  • LUT not found - lut_path is a raw string; check the path is right and that the file is actually readable from where ComfyUI runs.
  • Grade looks too strong - that's what strength is for. Most film LUTs look better at 0.3–0.7 than 1.0.

If you've got a folder of LUTs collecting dust from your video-editing days, this is the node that finally lets them earn their keep inside ComfyUI. Small, deterministic, and exactly what post-processing should be.

CategoryTensorVizion/Image

Inputs (3)

NameTypeDefaultDescription
imageIMAGEβ€”
lut_pathSTRINGβ€”
strengthFLOAT1.000–1β€”

Outputs (2)

NameTypeDescription
imageIMAGEβ€”
summarySTRINGβ€”