Emissive Map
Emissive derivation without the eyeballing
- image
- source_mask
- mask
- image
- mask
- emissive_info
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.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"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_maskopt | MASK | — | |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| emissive_info | STRING | — |