Transmission Map
Transmission maps without the 3D model — derive them from a flat image
- image
- source_mask
- mask
- image
- mask
- transmission_info
Transmission is the map that controls how much light passes through a surface - think stained glass, leaves lit from behind, wax, thin fabric. And like its sibling Thickness Map, it's the map people forget to make. Transmission Map derives one from a plain image with a set of real dropdowns and sliders, so you can generate a plausible transmission pass without ever touching a 3D modeling package. Same idea as thickness, different shading model: thickness drives SSS falloff, transmission drives how much of the background shows through.
How it works
The source_mode dropdown picks what the map is built from: combined_transmission (the default, blends value/luma for an all-round transmission guess), alpha (transparent pixels = high transmission - the natural choice for glass and cutouts), value, luma, saturation, detail, or mask (build from a supplied source_mask). Then normalize_mode shapes the tone curve - auto_percentile (2nd–98th percentile stretch, the safe default), auto_range, or manual_range with explicit value_min/value_max. gamma and contrast shape the response, detail_radius/detail_strength add high-frequency variation, blur_radius smooths, and invert_values flips the convention.
The workflow hook: this is the node you chain after generating an albedo or a cutout mask. Alpha-based transmission is the standout - if your image already has transparency, alpha mode gives you a transmission map that's correct by construction for glassy materials, which is a lot more reliable than guessing from luminance.
The inputs that matter
source_mode- start withalphaif your image has transparency,combined_transmissionotherwisenormalize_mode-auto_percentileis the right defaultgamma/contrast- the tone responseinvert_values- flip for the renderer's expected convention
Optional source_mask feeds the mask mode; optional mask region-restricts. Outputs: image (grayscale map as RGB), mask (single channel), and transmission_info logging source mode, the actual normalized range, and coverage.
Installing it
Ships in MKRShift Nodes from criskb. ComfyUI Manager → "MKRShift Nodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart ComfyUI; it's under MKRShift Nodes → Surface → Maps. No models or extra deps - numpy/Pillow/torch.
Common gotchas
New pack, no community lore, so the code is ground truth. This node uses real widgets, not the pack's JSON convention, so there's no JSON-parsing trap - the trap is conceptual. The big one: transmission and thickness are easy to confuse, and using a transmission map where the renderer expects thickness (or vice versa) produces wrong-but-not-obviously-wrong shading. Check your renderer's map naming before you wire it in. And auto_percentile's outlier protection means a single super-bright pixel won't wash out the map - if your transmission looks dead flat, that's a contrast/gamma problem, not a normalization bug.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| source_mode | COMBO | 7 options: combined_transmission, alpha, value, luma, saturation, detail, +1 | |
| normalize_mode | COMBO | 3 options: auto_percentile, manual_range, auto_range | |
| value_min | FLOAT | 0.0000–1 | — |
| value_max | FLOAT | 1.0000–1 | — |
| percentile_low | FLOAT | 2.00–100 | — |
| percentile_high | FLOAT | 98.00–100 | — |
| detail_radius | FLOAT | 2.00.1–64 | — |
| detail_strength | FLOAT | 0.150–2 | — |
| gamma | FLOAT | 1.000.1–4 | — |
| contrast | FLOAT | 1.000.1–4 | — |
| blur_radius | FLOAT | 0.00–128 | — |
| invert_values | BOOLEAN | false | — |
| mask_feather | FLOAT | 8.00–256 | — |
| invert_mask | BOOLEAN | false | — |
| source_maskopt | MASK | — | |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| transmission_info | STRING | — |