UltraShape Load Coarse Mesh
Point this at your coarse mesh — and mind the path rules
- model
- coarse_mesh
UltraShape doesn't refine a mesh out of thin air - it needs a starting shape and this is the node that loads it. Give it the path to a coarse mesh (GLB, GLTF, OBJ, PLY, STL) and it samples that geometry into the point-and-voxel representation the diffusion model wants, then hands you a coarse_mesh socket for the Refine node.
The mental model from the wider pack still applies: the coarse mesh is your Trellis or Hunyuan3D output - a decent silhouette with mushy detail - and UltraShape's whole job is to sharpen it against your reference image. This node is the loading dock between "something generated geometry" and "the refiner understands it."
The path rules - read these before anything else
The mesh_path string has opinions, and they're the #1 "why won't it find my file" source in this pack. It resolves, in order:
- Absolute path that exists - used as-is.
input/mesh.glboroutput/mesh.glb- resolved relative to your ComfyUI root folder.mesh.glb(no prefix) - silently assumed to live ininput/.
So the file in your ComfyUI input/ folder is input/mesh.glb or just mesh.glb. If you drop the mesh in output/, you have to say output/mesh.glb. Miss the prefix and the node logs "Mesh path not found" and dies with a FileNotFoundError. Don't fight it - either use the path rules above or bypass them entirely with the UltraShape Mesh Selector upload node, which outputs a correctly-prefixed string automatically.
How it actually works
Under the hood it's more interesting than a plain loader. The pack uses a SharpEdgeSurfaceLoader that samples two kinds of points from your mesh: num_sharp_points (default 204,800) biased toward edges and corners, and num_uniform_points (default 204,800) spread evenly over the surface. Those points get normalized (scaled into a unit-ish box by normalize_scale, default 0.99) and voxelized into the latent tokens the VAE conditions on. That's the trick that makes refinement fast: the model only has to fill in detail around the structure you already gave it, instead of inventing a whole shape.
The few inputs you'll touch:
mesh_path- required, covered above.num_latents- the one to know. Default 0 means "use the config's default token count (usually 32768)." More tokens = more detail and more VRAM; the tooltip says so. This is a quality dial, not a fix-it knob.normalize_scale,num_sharp_points,num_uniform_points- leave the defaults until you have a specific reason. A catastrophically simple mesh is the one case where sampling counts come up, and even then it's rare.
It needs a model from UltraShape Load Model - there's no way around loading the weights first. Output is a single coarse_mesh of type ULTRASHAPE_MESH, which plugs straight into UltraShape Refine.
Install and gotchas
Same story as the whole pack:
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyUI-UltraShape1
cd ComfyUI-UltraShape1
pip install -r requirements.txt
Restart, then download ultrashape_v1.pt from infinith/UltraShape on HuggingFace into ComfyUI/models/UltraShape/. ComfyUI Manager also finds it under ComfyUI-UltraShape1.
The gotcha most people hit first: the node runs on GPU, so the sampled surface tensor goes straight to your card's VRAM. 400k+ sample points plus voxel indices is small by model standards, but it stacks with the weights the Load Model node already parked there. If you're OOMing, shave num_latents back or run the model with low_vram before you blame the mesh. And if your mesh is so simple the tensor sizes don't line up, the pack notes it pads voxels automatically - ugly but functional.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| model | ULTRASHAPE_MODEL | — | |
| mesh_path | STRING | Path to coarse mesh (.glb/.obj/.ply/.stl). Supports: 'input/mesh.glb', 'output/mesh.glb', or just 'mesh.glb' (defaults to input/). Absolute paths also work. | |
| normalize_scaleopt | FLOAT | 0.990.5–1 | — |
| num_sharp_pointsopt | INT | 20480010000–500000 | — |
| num_uniform_pointsopt | INT | 20480010000–500000 | — |
| num_latentsopt | INT | 00–131072 | Number of latent tokens. 0=use config default (usually 32768). Higher=more detail but more VRAM |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| coarse_mesh | ULTRASHAPE_MESH | — |