Chromatic Shift
Fringing that looks like glass, not a filter
- image
- mask
- image
- mask
- chromatic_info
Chromatic aberration is the color fringing you get from real lenses, and a little of it is one of the cheapest "this was shot through glass" tells in the book. x1Chromatic applies it as a controlled photo-grade pass - per-channel pixel shifts, plus an optional prismatic spread - from MKRShift Nodes' VFX/Photo branch. Same neighborhood as bloom and bokeh, and like them, it's deterministic CPU math, no models.
The pack is young (no impressions, no community footprint I could find), so expectations should be honest: fresh code, test-suite QA, no tutorial pile yet. The VFX/Photo branch is where it's most self-consistent, and this node is a good example of the house pattern - a settings_json string widget with a frontend slider panel on top.
How it works
Two separate mechanisms, switchable by strength. The first is a straight per-channel shift: rgb_shift_x and rgb_shift_y displace the color channels relative to each other (in pixels), which is the classic "misregistered channels" fringe you see at high-contrast edges. The second is the interesting one: prismatic_strength with prismatic_distance and prismatic_angle spreads the channels outward from a center along an angle - that's the prism-like split that reads as refractive rather than just misaligned. chromatic_edge_weight biases the effect toward edges (where real CA actually lives), and chromatic_green_shift adds the green/magenta fringe you can't get from a plain RGB slide. mix blends the treated frame back with the original.
Outputs: image, mask (matte of where the fringing landed), chromatic_info (settings log).
Inputs that matter
rgb_shift_x/rgb_shift_y- the basic fringe; a pixel or two is plenty, more than ~3 looks brokenprismatic_strength+prismatic_angle- the "lens prism" direction of the lookchromatic_edge_weight- push this up if the fringe is washing across flat areas instead of hugging edges
Installing
ComfyUI Manager → search MKRShift Nodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart ComfyUI. No models, no requirements.txt - numpy/PIL math on the CPU.
Where people get burned
- The classic overdo. A 1px RGB shift reads as "shot on film." A 5px shift reads as "I found a chromatic aberration filter." This node gives you both knobs; restraint is the actual skill.
- Prismatic on flat subjects. Edge-weighted prismatic looks great on backlit subjects and metal edges, and terrible on soft skin. Use the optional
maskinput (withmask_feather) to keep it off the areas that shouldn't fringe. - The
maskoutput is the effect matte, not your input mask. Pack-wide convention. - Corrupted
settings_jsonsilently resets to defaults - if the fringe suddenly disappears, check the JSON before the sliders.
The good news: because it's deterministic, once you find a setting that reads as "nice vintage lens" on your subject, it reproduces exactly every run. That's the whole point of a cheap finishing pass done right.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"rgb_shift_x":0,"rgb_shift_y":0,"prismatic_strength":0.0,"prismatic_distance":5.0,"prismatic_angle":25.0,"chromatic_edge_weight":0.65,"chromatic_green_shift":0.0,"mask_feather":12.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| chromatic_info | STRING | — |