ꘇ top.emboss
A directional relief effect, and it is not a depth map
- image
- image
Embossing is what you get when you pretend a flat image has a relief surface lit from one side: bright where the gradient faces the light, dark where it faces away, flat grey in between. top.emboss does exactly that, and the author writes the caveat into the node description rather than the docs: "This is image shading, not estimated scene depth." That sentence is the whole article, really.
Which matters, because "emboss" sounds like "normal map" and "normal map" sounds like "depth". It isn't either. Nothing here estimates geometry - it's a gradient of the picture's luminance, so a printed label on a flat can ends up looking embossed, and a genuinely deep object with no internal shading gets nothing. If you want actual normal/depth data for lighting a scene, you want a depth-estimation model, and the KB's depth material covers that separately.
Where it's genuinely useful: engraved-looking titles and logos, parchment and metal-grade quick relief, a cheap "letterpress" pass over a texture, and as a mask source when you want a directional highlight along edges. It's also one of the odd nodes you can use to make a nice relief from a noise field, since noise gradients become believable bumps.
How it works
The node computes a Sobel gradient of the luminance and projects it onto a direction: angle, in degrees, default 135. So angle is your light direction - flip it 180° and the relief inverts, which is the fastest way to make an emboss read as raised rather than stamped. strength scales the gradient; bias (default 0.5) is the flat-grey value the signed gradient is mapped around, and it's what keeps the midtones grey instead of crushed black. mix blends the result back toward the source, so low values give you a little relief over the original rather than a full grey conversion.
Alpha is preserved, and the luminance used for the gradient is alpha-weighted, so transparent areas don't produce phantom edges.
The inputs that matter
angle and strength are the two you'll actually tweak; bias is the one you touch when the image goes muddy or blown out. mix around 0.3–0.6 is usually where embossing looks like a treatment rather than a filter. Output is a single image - wire it through top.composite with over/screen to lay relief on top of the original, or multiply to darken it into the surface.
Install
ComfyUI Manager → search ꘇ Genereti → install, or:
git clone https://github.com/languel/genereti.git custom_nodes/genereti
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt
Restart Comfy and refresh the page. The pack's requirements are a single frontend pin - ComfyUI already provides torch and NumPy - and none of the texture nodes downloads a checkpoint or talks to a server. Find it as ꘇ top.emboss in Genereti / TOP; search genereti because the leading glyph sorts to the bottom.
Traps
Not depth, not a normal map. Repeating it because it's the trap: don't wire this into anything expecting a normal map. You'll get plausible-looking garbage.
Grey by default. With bias 0.5 and mix 1, a correctly-working emboss looks like a grey sheet with highlights - that's the operation, not a failure. Dial mix down if you wanted subtle relief instead of a conversion.
Grain again. Same as any gradient filter: noise gets embossed too, and it looks like sandpaper. Blur first if the source is grungy.
Live vs Queue. Live mode runs on the browser GPU (WebGPU required) and Queue runs PyTorch. Live intermediate textures are 8-bit while Queue keeps float, so the two can differ slightly on a high-strength pass.
Pack status: super-alpha, early classroom testing - back up workflows you care about before updating.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| angle | FLOAT | 135.00-360–360 | — |
| strength | FLOAT | 1.000–8 | — |
| bias | FLOAT | 0.500–1 | — |
| mix | FLOAT | 1.000–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |