Nodes/MKRShift_Nodes/Emissive Map
ComfyUI Node

Emissive Map

Emissive derivation without the eyeballing

By criskb·Created 7 months ago·Updated 5 months ago· 0
Emissive Map
  • image
  • source_mask
  • mask
  • image
  • mask
  • emissive_info
settings_json{"source_mode":"combined_emissive","threshold":0.6,"softness":0.1,"saturation_gate":0.35,"intensity":1.5,"blur_radius":0.0,"mask_feather":8.0,"invert_mask":false}

If you've ever exported an emissive map by hand - painstakingly selecting the neon sign, the lava, the glowing runes, and painting everything else black - you know it's the most tedious map in the PBR set. x1EmissiveMap automates the boring part: it reads your color image and derives an emissive map from the pixels that are bright enough and saturated enough to plausibly glow, and lets you tune what counts with a few thresholds.

It's part of MKRShift Nodes by Cris K B, under MKRShift Nodes/Surface/Maps - the same branch that gives you the edge wear mask, cavity map, and the rest of the material-map derivations.

How it works

The trick is that emissive isn't just "bright pixels." White paper is bright and does not glow; a neon sign glows. So the node gates on two things at once (you can see the logic in the source): a threshold on brightness (default 0.6) and a saturation_gate on color (default 0.35) - a pixel only qualifies if it's both bright enough and saturated enough. softness feathers the edge of that gate, so you get a soft ramp instead of a hard binary cut, which is what stops emissive maps from looking like vector masks.

Once the gate is set, intensity (default 1.5) scales the whole map - remember emissive values above 1.0 mean "glows brighter than white" in a physically-based renderer, so the default is already pushing past white. blur_radius optionally smears the mask if you want glow to bleed a little beyond the source pixel, which reads better in engine than a razor-sharp map.

The default source_mode is combined_emissive, which derives from that brightness-plus-saturation gate on the image. The node outputs an image that is the emissive color (source color times strength - so the emissive texture matches your albedo's hue), plus the mask if you want to inspect or reuse the gate itself.

The inputs that matter

  • threshold - brightness cutoff (default 0.6). Raise it to exclude more midtones.
  • saturation_gate - how colorful a pixel must be to glow (default 0.35). This is what stops paper and white walls from lighting up.
  • softness - how feathered the gate edge is (default 0.1).
  • intensity - overall scale; values over 1.0 give true HDR emission (default 1.5).
  • blur_radius - optional smoothing of the mask.

There's an optional source_mask input for deriving emission from a specific region only, plus the usual mask / mask_feather / invert_mask for localizing the output. The third output is an emissive_info string.

Installing it

cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes

Restart ComfyUI, or use ComfyUI Manager and search MKRShift_Nodes. No requirements.txt, no model files, no keys - pure numpy/PIL math.

Gotchas

Two things to know. First, the brightness-plus-saturation gate is smart but not magic: if your scene is lit such that the glowing thing isn't the brightest thing in the frame, the threshold will grab the wrong pixels - raise the threshold until only the emissive candidate survives. Second, the output image is emissive color, not a white mask, so if your pipeline expects a greyscale multiplier, take the mask output instead. And keep blur_radius low; in an engine, heavy pre-blur on an emissive map plus bloom is how you get the "everything glows" mush.

CategoryMKRShift Nodes/Surface/Maps

Inputs (4)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"source_mode":"combined_emissive","threshold":0.6,"softness":0.1,"saturation_gate":0.35,"intensity":1.5,"blur_radius":0.0,"mask_feather":8.0,"invert_mask":false}
source_maskoptMASK
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
emissive_infoSTRING