AfterDark Film Color Split & Clarity
The teal-and-orange movie look, without re-rolling your seed
- image
- image
That teal-shadow / orange-highlight split is the single most recognizable color move in modern cinema, and it's a perfect example of something you should post-process instead of prompting for. Re-rolling generations until the sampler happens to give you the grade is a lottery. A split-tone pass is a couple of tensor operations that run in a millisecond and change exactly nothing else about your image. AfterDark Film Color Split & Clarity is exactly that: independent tints for your shadows and highlights, plus a local micro-contrast "clarity" boost on top.
It ships in the HackAfterDark category as part of the AfterDark Film pack, alongside its siblings - grain, halation, light leaks, and a LUT loader. This one is the quiet, compositional one. If you want the movie look, this is the first node in the pack to reach for.
How it works
The code is short and honest. It builds a Rec.709 luminance map of your image (0.2126 R, 0.7152 G, 0.0722 B), then splits it into per-pixel shadow and highlight weight maps using a midpoint you control. The balance slider shifts that midpoint - pull it positive and more of the frame counts as "shadow" territory. Both weights get a 1.5 power falloff, so the tint rolls off smoothly instead of ending in a hard line, and each tint is a fixed RGB multiplier preset blended in by intensity.
The clarity pass is a textbook high-pass: a 5×5 average-pool blur is the "low-pass", you subtract it to isolate detail, then add that detail back scaled by micro_contrast. That's the same trick as an unsharp mask - local texture without a global contrast curve that clips your highlights. See the post-processing side of ComfyUI: this is the "reach for the cheap deterministic primitive" lesson, done properly.
Inputs that matter
Only two decisions really matter for a beginner:
- shadow_tint / shadow_intensity -
Teal / Cyan,Deep Blue,Emerald Green,Warm Sepia, orNeutral. Intensity is 0–1; 0.2 is a tasteful start. - highlight_tint / highlight_intensity -
Golden Amber,Warm Yellow,Peach Rose,Cool Cyan, orNeutral. The classic pairing is teal shadows + golden amber highlights.
Then balance (-1 to 1) shifts where the shadow/highlight boundary sits, and micro_contrast (0–1) adds the clarity. The node outputs a single image (IMAGE), so it slots anywhere after a VAE decode and before your Save Image - or chain it with the pack's grain node for the full "shot on film" finish.
Installing it
One-time setup, shared by every node in this pack:
cd ComfyUI/custom_nodes
git clone https://github.com/hackafterdark/ComfyUI-HackAfterDark-Nodes
Then restart ComfyUI (or hit Refresh in ComfyUI Manager). You can also search "HackAfterDark" in Manager and install the pack by its title, AfterDark Film AR Selector. The film nodes need nothing extra: no model downloads, no API keys. The pack's requirements.txt lists google-generativeai, but that's only for the Gemini Prompter node it also ships - this one runs on torch and numpy, which ComfyUI already has.
Where people get tripped up
The two things worth knowing: it expects a decoded 0–1 RGB image, not a latent - wire it after your VAE decode. And it only tints the first three channels, so if your tensor has an alpha channel it passes through untouched, which is usually exactly what you want. Since everything is clamped to 0–1 at the end, you can't blow the output out; you just dial back micro_contrast if edges start ringing. That's the whole failure mode.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| shadow_tint | COMBO | Teal / Cyan | 5 options: Neutral, Teal / Cyan, Deep Blue, Emerald Green, Warm Sepia |
| shadow_intensity | FLOAT | 0.200–1 | — |
| highlight_tint | COMBO | Golden Amber | 5 options: Neutral, Golden Amber, Warm Yellow, Peach Rose, Cool Cyan |
| highlight_intensity | FLOAT | 0.200–1 | — |
| balance | FLOAT | 0.00-1–1 | — |
| micro_contrast | FLOAT | 0.150–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |