Bevel/Emboss Effect
Photoshop's bevel and emboss, as a node
- image
- mask
- IMAGE
Bevel and emboss is the classic Photoshop layer-style effect, and this node ports it to the graph: it computes a synthetic depth map from the image and lights it from a chosen angle, so edges either pop up (bevel) or get pressed down (emboss). It's pure deterministic pixel math - no model, no diffusion pass - which is exactly the kind of job the post-processing layer of the ecosystem says you should reach for a node for instead of burning a generation. Think UI panels, game assets, chunky title art, "engraved" labels, or giving a flat render a fake 3D rim.
The mechanism is old-school and cheap. An angle vector (from angle, in degrees, default 135 - the classic upper-left light) is used with depth to build an offset, and the result is split into highlight and shadow channels whose strengths are set by highlight_opacity and shadow_opacity (both default 0.75, and both allowed up to 5.0 if you want to overdrive them). soften blurs the transition for a rounder, less chiseled look. There are four modes:
emboss- raises the whole surface; the classic "pressed into metal" relief.bevel_inner- a bevel cut inward from the image's alpha/edge.bevel_outer- a bevel that extends outward past the shape.pillow_emboss- the rim-lighting effect that looks like the subject is resting on a cushion of light.
bevel_width controls how far the bevel extends from the edge (default 5). Because some of these modes key off the image's shape, feeding it a cutout with a clean alpha gives you the Photoshop experience; a flat full-frame image mostly bevels the outer border.
Masking it
The optional mask input is where this gets more useful than the Photoshop filter. With mask_mode you pick apply_to_masked or apply_to_unmasked, so you can bevel only a specific region (a logo, a face, one object) while the rest of the frame stays untouched. mask_blur feathers the mask boundary so the effect doesn't stop at a hard line - which is the difference between "inserted" and "designed." If you've got a mask from a segmentation model, this is the way to apply the effect precisely instead of to the whole frame.
Output is a single IMAGE. The only required inputs are image, depth, angle, the two opacities, soften, mode, bevel_width, and debug_device (a leftover toggle that prints device info - you can ignore it). Everything has a sensible default; you can add the node and move exactly one slider and get a reasonable result.
The one thing to watch: depth and bevel_width interact, and cranking both makes the effect go muddy rather than "more 3D." Start with depth around 5 and bevel_width 5, then raise soften if edges look too hard. Since it's GPU-accelerated it's effectively free per frame, so it's a legitimate video-batch effect too - apply it to every frame of a UI-animation render.
It ships in TrentNodes (ComfyUI Manager, search "Trent Nodes", or clone + pip install -r requirements.txt), and has no model downloads. For a Photoshop-style post effect that runs in milliseconds and never invents detail, it's the right tool.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| depth | FLOAT | 5.00–100 | — |
| angle | INT | 135-360–360 | — |
| highlight_opacity | FLOAT | 0.750–5 | — |
| shadow_opacity | FLOAT | 0.750–5 | — |
| soften | FLOAT | 0.00–50 | — |
| mode | COMBO | 4 options: emboss, bevel_inner, bevel_outer, pillow_emboss | |
| bevel_width | FLOAT | 5.01–100 | — |
| debug_device | BOOLEAN | false | — |
| maskopt | MASK | — | |
| mask_modeopt | COMBO | 2 options: apply_to_masked, apply_to_unmasked | |
| mask_bluropt | FLOAT | 0.00–100 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |