Body Decal Composite
The finishing step that decides whether the decal reads as ink, paint or neon
- image
- decal_layer
- decal_mask
- clip_mask
- composite_preset
- image
- mask
Body Decal Composite is the last node in the modular pipeline, and the one that decides how the decal actually interacts with the photo underneath it. Everything before this has built a layer - this node fuses it. You feed it the base image, the decal_layer and decal_mask from Body Decal Place (or the warped versions from Body Decal Surface Warp), pick a blend_mode and opacity, and get the final image out.
How it works
The blend math is exactly what you'd expect from any image editor, implemented per-pixel in numpy:
normal- the decal replaces the base where its mask is, scaled by opacity. Use for solid logos and clothing prints.multiply- darkens whatever's underneath. This is the classic tattoo look: black ink multiplies onto skin and lets skin tone show through.screen- lightens; glowing circuitry, neon, anything emissive.add- additive light; even punchier than screen, good for hard glow.overlay- contrast-boosting; this is what makes scars, makeup, and soft body paint sit in the surface instead of on it.
The final mask = decal mask × clip mask (if provided) × opacity. So opacity isn't just a transparency slider - it's baked into the alpha that the node also outputs, meaning you can chain the result onward without losing where the decal actually is.
The optional composite_preset input is a nice bit of ergonomics: it takes a BODY_DECAL_COMPOSITE_PRESET object (from Body Decal Composite Preset) that overrides both blend_mode and opacity. If you'd rather not think about blend modes at all, make a preset node, pick "tattoo" or "glow circuit", and stop fiddling.
Inputs and outputs
Required: image, decal_layer, decal_mask, blend_mode, opacity. Optional: clip_mask (multiplies into the final alpha - use it to confine the decal to a region of the base), and composite_preset. Outputs: image (the composited result, RGB) and mask (the final decal alpha, post-opacity, post-clip).
Wiring and gotchas
The typical chain is Body Decal Region → Body Decal Place → (optional) Body Decal Surface Warp → Body Decal Composite → preview/save. If you skipped surface warping, wire decal_layer and decal_mask straight from Body Decal Place.
The classic mistake is picking multiply for a decal that's white-on-transparent - multiply keeps the white base and just tints the photo, which looks wrong. Multiply wants dark ink with its background already knocked out; if your "tattoo" is rendering as a ghostly rectangle, fix alpha_mode upstream in Body Decal Place first, then come back to blending. And remember opacity defaults to 0.75, which is a soft look - many people reach for 1.0 for solid logos.
Install: Manager search "ComfyUI Body Decal", or git clone https://github.com/verias/comfyui-body-decal.git into ComfyUI/custom_nodes and restart. Deps are numpy and Pillow only.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| decal_layer | IMAGE | — | |
| decal_mask | MASK | — | |
| blend_mode | COMBO | 5 options: normal, screen, add, multiply, overlay | |
| opacity | FLOAT | 0.750–1 | — |
| clip_maskopt | MASK | — | |
| composite_presetopt | BODY_DECAL_COMPOSITE_PRESET | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |