3D LUT Apply ποΈ
Drop a Film LUT on Your Render Without Leaving ComfyUI
- image
- image
- summary
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
.cubeLUTs (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_pathis 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
strengthis 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.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | β | |
| lut_path | STRING | β | |
| strength | FLOAT | 1.000β1 | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | β |
| summary | STRING | β |