Diffusion
Orton-style diffusion for skin and highlights
- image
- mask
- image
- mask
- diffusion_info
If you've ever wondered how portrait photographers get that soft, glowy, slightly ethereal light on skin - the "dreamy" look - it's called diffusion. You blur the highlights, screen them back over the image, and suddenly harsh light becomes soft haloed light. x1Diffusion wraps that whole move in one node, and it's a staple of the MKRShift finishing pack for a reason: it's the single fastest way to make an over-sharp, crunchy AI portrait read as "shot on film."
It's from MKRShift Nodes by Cris K B, under MKRShift Nodes/VFX/Photo.
How it works
The mechanism is the classic diffusion/Orton pass, straight out of analog photography. The node isolates the bright parts of the image using highlight_threshold (0.68 default) with highlight_softness controlling the edge between "highlight" and "not highlight" - soft gates, no hard clipping. Those highlights get blurred by radius (12px default), tinted, and screened back over the original, scaled by highlight_strength. diffusion_strength then controls how much of that glowing blur bleeds into the overall result.
Two supporting knobs give it more of a real-grade feel: contrast_softness which fades contrast in the shadows so the softness doesn't just sit on top, and shadow_lift which raises the dark end - the combination is what keeps diffusion from turning into "everything slightly hazy." mix is the global wet/dry dial.
The practical difference between this and just blurring the image: diffusion only smears the highlights. Shadows stay defined, edges stay crisp, and what you get is the specific "glowing skin, sharp eyes" portrait look rather than a blurry mess. This is the same effect Lightroom sells as "Diffusion" / "Soft Glow" and that negative-clarity tricks approximate - wrapped as one node.
The inputs that matter
All inside the settings_json input (edit it directly or in the node's UI):
radius- how wide the glow spreads (default 12). Bigger = dreamier, mushier.highlight_threshold/highlight_softness- what counts as a highlight and how hard the boundary is.highlight_strength/diffusion_strength- glow intensity, and overall blend.shadow_lift- protects shadows from the haze.mix- how much of the effect survives to the output.
Optional mask input plus mask_feather / invert_mask if you want diffusion only on skin, not on the eyes or the background. Outputs: image, the applied mask, and a diffusion_info string.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart ComfyUI, or install via ComfyUI Manager (search MKRShift_Nodes). No requirements file, no models, no keys - pure pixel math.
Where it fits
In the finishing stack it plays well right before a film grain pass: diffusion softens the "AI sharpness," grain adds the "camera noise," and together they do more for realism than another upscale ever will (the post-processing KB makes exactly this argument). The trap is overdoing radius and diffusion_strength together - at high values skin turns to plastic. Keep diffusion_strength around 0.4–0.6, radius 8–16, and dial mix back if it still feels too strong. It's the soft-glow move, done properly.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"radius":12.0,"highlight_threshold":0.68,"highlight_softness":0.1,"highlight_strength":0.48,"diffusion_strength":0.45,"contrast_softness":0.25,"shadow_lift":0.1,"mix":1.0,"mask_feather":12.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| diffusion_info | STRING | — |