Nodes/MKRShift_Nodes/Chromatic Shift
ComfyUI Node

Chromatic Shift

Fringing that looks like glass, not a filter

By criskb·Created 7 months ago·Updated 5 months ago· 0
Chromatic Shift
  • image
  • mask
  • image
  • mask
  • chromatic_info
settings_json{"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}

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 broken
  • prismatic_strength + prismatic_angle - the "lens prism" direction of the look
  • chromatic_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 mask input (with mask_feather) to keep it off the areas that shouldn't fringe.
  • The mask output is the effect matte, not your input mask. Pack-wide convention.
  • Corrupted settings_json silently 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.

CategoryMKRShift Nodes/VFX/Photo

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"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}
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
chromatic_infoSTRING