BD Blender Decimate
The decimator that remembers your color boundaries
- mesh
- color_field
- mesh
- status
Plain decimation is easy - shrink a mesh to a target face count and watch every hard edge dissolve into mush. That's useless for stylized low-poly work, where the whole point is keeping clean silhouettes and crisp color seams at a fraction of the triangle count. BD Blender Decimate is BrainDead's full-featured answer: a Blender-based decimator that detects color boundaries and planar structure before it starts removing geometry, then preserves them as sharp/seam edges while it works.
The headline feature is the color_field input. This is the correct way to keep colors through decimation: wire a COLOR_FIELD (from BD_SampleVoxelgridColors or BD_UnpackBundle) directly into the node instead of pre-applying colors to the mesh. The pack is emphatic about why - pre-applied colors force faces to split at color seams, which destroys the topology you're trying to clean. Sampling colors spatially on clean topology, then preserving them during decimation, gives you a low-poly mesh where the colors and the hard edges actually agree.
The inputs that matter
- target_faces (default 5000) - the face budget. Everything else is in service of hitting this without wrecking the mesh.
- detect_color_edges (default on) + color_edge_threshold (0.15) - marks color boundaries as sharp/seam edges. Lower threshold = more edges preserved. This is the "CRITICAL" toggle in the pack's own docs.
- planar_angle (7°) and sharp_angle (14°) - the planar decimation merge angle and the post-decimation sharp-edge mark angle. Lower planar angle = flatter, more faithful surfaces.
- use_planar_grouping + planar_group_angle (15°) + planar_group_min_size - optional structure-aware grouping that finds planar regions from face normals and marks their boundaries.
- preserve_boundaries / preserve_colors - both on; preserve mesh borders and transfer colors with face-based lookup (no bleeding).
- remove_internal (+
internal_methodSIMPLE/RAYCAST) - jacketing cleanup for hidden internal faces, off by default.
Optional: color_field (the star input), timeout, and debug_path to dump a debug GLB when you need to see what went wrong. Outputs: decimated mesh + status.
Install and the Blender gotcha
Pack install is standard - ComfyUI Manager → "BrainDead", or:
cd ComfyUI/custom_nodes
git clone https://github.com/BizaNator/ComfyUI-BrainDead
cd ComfyUI-BrainDead
pip install -r requirements.txt
Restart, update ComfyUI (V3 API required), and - this being a Blender node - make sure a real Blender exists on the system. The README says it's bundled; the binary isn't in the repo. The code checks bundled blender-5.0.1, sibling packs, then /usr/bin/blender. No Blender, no decimation.
Where people get burned: they decimate to an aggressive target and blame the node when the silhouette wobbles - but the real fix is usually detect_color_edges + planar_grouping doing their job, or pre-running BD Blender Cleanup. For a quick stylized look, run this after BD Planar Grouping with straighten_boundaries=True, then finish with BD Blender Merge Planes. That's the pack's documented hard-edge pipeline, and it's genuinely good.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| mesh | TRIMESH | — | |
| target_faces | INT | 5000100–500000 | Target face count after decimation |
| pre_cleanup | BOOLEAN | true | Fix non-manifold geometry before decimation |
| detect_color_edges | BOOLEAN | true | CRITICAL: Detect color boundaries and mark as sharp/seam edges for preservation |
| color_edge_threshold | FLOAT | 0.150.01–1 | Color difference threshold for edge detection (lower = more edges) |
| fill_holes | BOOLEAN | true | Fill holes in mesh before decimation |
| remove_internal | BOOLEAN | false | Remove internal/hidden faces (jacketing cleanup) |
| internal_method | COMBO | SIMPLE | SIMPLE=fast, RAYCAST=more accurate but slower |
| planar_angle | FLOAT | 7.00–45 | Angle threshold for planar decimation (merge coplanar faces) |
| sharp_angle | FLOAT | 140–90 | Angle threshold for marking sharp edges after decimation |
| preserve_boundaries | BOOLEAN | true | Preserve mesh boundaries during planar decimation |
| preserve_colors | BOOLEAN | true | Transfer vertex colors with face-based lookup (no bleeding) |
| fix_normals | BOOLEAN | true | Recalculate normals to face outward |
| use_planar_grouping | BOOLEAN | false | Detect planar groups from face normals and mark boundaries as sharp/seam |
| planar_group_angle | FLOAT | 151–90 | Max angle between normals in same planar group (lower = more groups = more preserved edges) |
| planar_group_min_size | INT | 101–1000 | Minimum faces per group (smaller groups merged into neighbors) |
| color_fieldopt | COLOR_FIELD | — | |
| timeoutopt | INT | 60060–3600 | Maximum processing time in seconds |
| debug_pathopt | STRING | Optional: Full path to save debug GLB (e.g., /tmp/decimate_debug.glb) |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| mesh | TRIMESH | — |
| status | STRING | — |