Deep Bump (mtb)
Fake normal maps from a flat image
- image
- IMAGE
If you do any 3D or texturing, this one's a small gift. Deep Bump takes a flat color image - a generated texture, a photo of brick or fabric or bark - and predicts a normal map from it, the kind of map a 3D renderer uses to fake surface bumps and grooves under lighting without any extra geometry. Point it at a tileable texture out of ComfyUI and you get a normal map you can drop straight onto a mesh in Blender.
It's a wrapper around DeepBump (GPLv3), a small neural net built for exactly this. And it does more than normals: the same node has three modes baked into one dropdown, so it also converts normals to a curvature map or to a height/displacement map. That's the full "I have a texture, I need the PBR maps to go with it" chain in a single node.
How it works
A compact ONNX model (deepbump256.onnx) looks at the color image and infers what the surface normals should be - which way each little patch of surface is facing. It's genuinely fast, so experimenting is cheap; the author's own advice is to just try settings and see. The curvature and height modes are downstream conversions that operate on a normal map you already produced.
The inputs that matter
image- your source. For "Color to Normals," feed the flat texture. For the other two modes, feed a normal map (typically the output of a first Deep Bump pass).mode- the operation: Color to Normals, Normals to Curvature, or Normals to Height. This decides which of the other inputs actually matter.color_to_normals_overlap(SMALL / MEDIUM / LARGE) - how much the model overlaps its processing tiles when generating normals. Larger overlap = fewer seams between tiles at the cost of speed.normals_to_height_seamless(default on) - tick this when your input texture tiles seamlessly. It tells the height conversion to treat the edges as wrapping, so your displacement stays tileable. Leave it off for a one-off, non-repeating image.
The single output is IMAGE - the normal, curvature, or height map, ready to save or feed onward. The author pairs this with MTB's Model Patch Seamless node to keep the whole texture repeatable across a tessellated mesh.
How to install it
ComfyUI Manager: search MTB Nodes (comfy_mtb), install, restart. Manually: cd ComfyUI/custom_nodes && git clone https://github.com/melMass/comfy_mtb, then restart. If a node's dependency is missing MTB fails just that node and points you at http://127.0.0.1:8188/mtb to fix it.
Common issues
The classic failure is the model file. auto_download is on by default and normally grabs deepbump256.onnx for you, but when it doesn't, you get an error like "the model deepbump could not be found, make sure to download it" - because it's looking in ComfyUI/models/deepbump/ and the file isn't there. Two real causes: the download quietly failed, or your antivirus deleted the .onnx (this actually happens - an .onnx file trips some scanners' heuristics). Fix: grab deepbump256.onnx, drop it in models/deepbump/, and whitelist it in your scanner if it keeps vanishing.
Beyond that, the mode gotcha bites newcomers: Curvature and Height expect a normal map as input, not a color image. Run Color to Normals first, then feed that result into a second Deep Bump set to Height or Curvature. And remember the license - DeepBump's model is GPLv3, which matters if you're shipping the maps in a commercial product.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| mode | COMBO | 3 options: Color to Normals, Normals to Curvature, Normals to Height | |
| color_to_normals_overlap | COMBO | 3 options: SMALL, MEDIUM, LARGE | |
| normals_to_curvature_blur_radius | COMBO | 7 options: SMALLEST, SMALLER, SMALL, MEDIUM, LARGE, LARGER, +1 | |
| normals_to_height_seamless | BOOLEAN | true | — |
| auto_downloadopt | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |