⬡ Polyhedron Filter
One-node color grading, and the preview actually shows the grade
- image
- image
⬡ Polyhedron Filter is color grading for people who don't want a five-node chain and a separate preview to trust. Exposure, temperature, tint, contrast, gamma, shadows, highlights, saturation, vibrance, hue shift, a .cube LUT, and an unsharp sharpen pass - all in one node, with a before/after preview that shows the actual grade rather than an approximation.
The preview is the part that makes it trustworthy. Color grading tools that fake their preview are a known annoyance - you dial a look in, run the graph, and the render drifts because the preview was running a different math. This node's browser preview applies the same LUT file the backend will, read through the pack's own route, so what you set is what renders. The color controls act on the image output and move the preview live; a divider compares the original on the left against the graded result on the right.
Every number is a slider
Every numeric field doubles as a slider: click-drag horizontally to scrub the value and watch the preview react live, or click once and type an exact number. That's the workflow this node is built around - grab exposure, drag until the midtones sit right, done. The fields you'll actually touch, in grading order:
exposure(EV stops; +1 doubles light, −1 halves it) - first step of the pipeline.temperature/tint- white balance: cool-to-warm and green-to-magenta.contrast/gamma- contrast around mid-grey, gamma for midtones (below 1 brightens them).shadows/highlights- lift or deepen the dark range, recover or push the brights, each through a soft luma mask.saturation/vibrance- uniform saturation (−1 = grayscale) vs. saturation weighted toward muted colors.hue_shift- rotate all hues around the wheel, in degrees.
The LUT and the sharpen pass
The .cube LUT (lut_name, from the pack's luts/ folder - the repo ships identity_16.cube as the one non-none option) is applied after the color controls, with its own lut_strength blend (0 → ungraded, 1 → fully LUT-graded). The unsharp mask runs last: sharpen_amount (0 disables) and sharpen_radius (larger radius = coarser detail sharpened). So the pipeline is: color controls → LUT → sharpen, in that order.
preset loads named parameter sets from the pack's presets/ folder; loading one sets the sliders directly and they stay freely adjustable afterwards. Both directions run through one whitelist, so a hand-edited preset can't push unknown keys into the node.
Installing it
Part of the ⬡ Polyhedron Suite pack. ComfyUI Manager → "Polyhedron Suite", or:
cd ComfyUI/custom_nodes
git clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git
# restart ComfyUI
No extra Python dependencies - the LUT files and presets ship with the pack. This is one of the few nodes in the suite that opens server routes (three of them, for the LUT/preset preview), which is why the preview can be honest.
Gotchas
Remember the pipeline order when something looks off: if your sharpen looks like it's fighting the LUT, that's the design - sharpen is deliberately last so it sharpens the graded image, not the original. And preset is a loading mechanism, not a live binding: it sets the sliders and steps away, so if you edit the preset file on disk, you reload it to get the new values. If the node renders blank under Nodes 2.0 (Modern Node Design), disable it in Settings.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| exposure | FLOAT | 0.00-4–4 | Exposure in EV stops. 0 leaves brightness unchanged; +1 doubles light, -1 halves it. First step of the grading pipeline. Click-drag to scrub live. |
| temperature | FLOAT | 0.00-1–1 | White balance temperature. Negative shifts toward blue (cooler), positive toward orange (warmer). Click-drag to scrub live. |
| tint | FLOAT | 0.00-1–1 | White balance tint. Negative shifts toward green, positive toward magenta. Click-drag to scrub live. |
| contrast | FLOAT | 0.00-1–1 | Contrast around mid gray. Negative flattens, positive steepens. Click-drag to scrub live. |
| gamma | FLOAT | 1.000.2–3 | Midtone gamma. Values below 1 brighten midtones, above 1 darken them. 1 is neutral. Click-drag to scrub live. |
| shadows | FLOAT | 0.00-1–1 | Lifts (positive) or deepens (negative) the darkest tonal range through a soft luma mask. Click-drag to scrub live. |
| highlights | FLOAT | 0.00-1–1 | Recovers (negative) or pushes (positive) the brightest tonal range through a soft luma mask. Click-drag to scrub live. |
| saturation | FLOAT | 0.00-1–1 | Uniform colour saturation. -1 is grayscale, 0 unchanged, +1 strongly saturated. Click-drag to scrub live. |
| vibrance | FLOAT | 0.00-1–1 | Saturation weighted toward muted colours: boosts dull areas more than already-vivid ones. Click-drag to scrub live. |
| hue_shift | FLOAT | 0-180–180 | Rotates all hues around the colour wheel by the given degrees. 0 is neutral. Click-drag to scrub live. |
| lut_name | COMBO | none | 3D LUT (.cube) applied after the colour controls. Files are read from this pack's luts/ folder; 'none' skips the LUT. |
| lut_strength | FLOAT | 1.000–1 | Blend between the ungraded (0) and fully LUT-graded (1) image. Only used when a LUT is selected. Click-drag to scrub live. |
| sharpen_amount | FLOAT | 0.000–2 | Unsharp-mask strength applied as the last pipeline step. 0 disables sharpening. Click-drag to scrub live. |
| sharpen_radius | FLOAT | 1.00.5–5 | Unsharp-mask blur radius in pixels. Larger values sharpen coarser detail. Click-drag to scrub live. |
| preset | COMBO | none | Named parameter set from this pack's presets/ folder. Loading a preset sets the sliders; they stay freely adjustable afterwards. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |