Trellis2 - Mesh Refiner Multi-View
Fixing Trellis2's single-image mesh refiner
- pipeline
- trimesh
- front_image
- back_image
- left_image
- right_image
- mesh
- bvh
Trellis2 gets you a mesh from a single image faster than almost anything else on your own GPU. The catch: its Mesh Refiner node only looks at that one view while it refines geometry. Everything behind the object - the recesses, the occluded side, the bits the front photo simply doesn't show - is inferred from a picture that can't actually see them, and the result tends to lean on bilateral symmetry and blur where detail should be. This node is the fix: Trellis2 - Mesh Refiner Multi-View runs the same refinement pass but conditions it on up to four images (front / back / left / right) and blends their guidance per-view during sampling. It's the difference between "a chair" and "a chair you can spin around and not wince at."
What it actually is
This isn't a new model or a fork of the pipeline - it's a drop-in add-on for visualbruno/ComfyUI-Trellis2, the maintained ComfyUI wrapper for Microsoft's Trellis.2 image-to-3D stack. It ships exactly one node, and it plugs into your existing Trellis2 workflow in place of the stock Mesh Refiner. The core idea was originally proposed as a pull request to the base repo (visualbruno/ComfyUI-Trellis2#125 by Chris Uzelac, still open as a reference); this pack packages it as a separate custom node so you don't have to run a patched fork. It patches methods onto the pipeline class at runtime - clever, but it means the install story has one non-negotiable rule: you must have the base ComfyUI-Trellis2 installed in the same custom_nodes/ first. Without it, startup fails with a clear error.
How it works
The node monkey-patches Trellis2ImageTo3DPipeline with two methods on its first run. sample_mesh_slat_multiview does the shape SLat sampling using a multi-view guidance-interval sampler - picked dynamically to match your active base sampler (Euler / Heun / RK4 / RK5) - while refine_mesh_multiview orchestrates the whole pass: per-view DINO conditioning, mesh SLat encoding and upsampling, shape and optional texture sampling, then a final tiled decode.
The patching happens lazily instead of at import time for a reason that tells you the authors know ComfyUI well: sibling custom nodes are registered under path-derived module names, so ComfyUI doesn't guarantee load order. The node sidesteps this by resolving the pipeline class and its sibling modules (like SparseTensor and the samplers) at runtime from type(pipeline).__module__. On first use it also verifies every helper it depends on still exists and raises a readable RuntimeError if upstream renames something - so a Trellis2 update breaks loudly and helpfully, not with a cryptic AttributeError mid-generation.
The inputs that matter
Most of the long input list is the standard shape/texture sampler set from the base refiner (steps, guidance strength, rescale, interval start/end - you can ignore almost all of it). What you actually touch:
front_image(required) plusback_image,left_image,right_image(optional, any combination works) - front-only runs fine, front+back helps, all four is where the detail gains show.pipelineandtrimesh- wire these from the Trellis2 LoadModel and the mesh output of your initial reconstruction.resolution(512 / 1024 / 1536) - your main VRAM dial. 1024 is the sensible default; drop to 512 on 8GB cards, go 1536 if you've got the headroom and the detail is worth the wait.generate_texture_slat(default on) - leave it on unless you only want geometry; thebvhoutput (useful for later texturing passes) is only built when it's enabled.
Outputs are mesh (MESHWITHVOXEL) and bvh (BVH). The mesh feeds your export/save node; the bvh is there for texture generation pipelines that need raycasting against the geometry.
Installing it
ComfyUI Manager (search "ComfyUI-Trellis2 Multi-View Refiner") or:
cd ComfyUI/custom_nodes
git clone https://github.com/cuzelac/ComfyUI-Trellis2-MultiViewRefiner
Restart ComfyUI, then search for Trellis2 - Mesh Refiner Multi-View under the Trellis2Wrapper category. The add-on itself has zero Python dependencies - everything heavy (the ~4B-parameter Trellis.2 models, cumesh, and friends) comes from the base pack, which downloads the microsoft/TRELLIS.2-4B model from Hugging Face on first load. That base install is where people get burned: Windows users have reported the model picker producing broken path separators, and Trellis2 generally wants a recent CUDA torch build (2.8.0+cu128 is the one the community keeps recommending). If the refiner errors immediately, your Trellis2 install - not this node - is the thing to fix.
Gotchas worth knowing
The README is upfront that this has no dino-lock - upstream added a dino_lock guardrail to the single-view samplers in April 2026, and the multi-view sampler class doesn't inherit it. If an update of the base pack breaks the node with one of those "out of date" RuntimeErrors, update this add-on and check the repo. And manage expectations: more views and per-view blending cost real time and VRAM, so don't feed it four images at 1536 resolution on a mid-range card and expect instant results. For Trellis2 refinement, though, this is the one to reach for - nothing else does multi-view conditioning on the same pipeline without forcing you onto a fork.
Inputs (27)
| Name | Type | Default | Description |
|---|---|---|---|
| pipeline | TRELLIS2PIPELINE | — | |
| trimesh | TRIMESH | — | |
| front_image | IMAGE | — | |
| seed | INT | 123450–2147483647 | — |
| resolution | COMBO | 1024 | 3 options: 512, 1024, 1536 |
| shape_steps | INT | 121–100 | — |
| shape_guidance_strength | FLOAT | 6.500–99.99 | — |
| shape_guidance_rescale | FLOAT | 0.050–1 | — |
| shape_rescale_t | FLOAT | 4.000–9.99 | — |
| texture_steps | INT | 121–100 | — |
| texture_guidance_strength | FLOAT | 3.000–99.99 | — |
| texture_guidance_rescale | FLOAT | 0.200–1 | — |
| texture_rescale_t | FLOAT | 3.000–9.99 | — |
| max_num_tokens | INT | 9999990–999999 | — |
| generate_texture_slat | BOOLEAN | true | — |
| downsampling | COMBO | 16 | 3 options: 16, 32, 64 |
| shape_guidance_interval_start | FLOAT | 0.100–1 | — |
| shape_guidance_interval_end | FLOAT | 1.000–1 | — |
| texture_guidance_interval_start | FLOAT | 0.000–1 | — |
| texture_guidance_interval_end | FLOAT | 0.900–1 | — |
| use_tiled_decoder | BOOLEAN | true | — |
| front_axis | COMBO | z | 2 options: z, x |
| blend_temperature | FLOAT | 1.00.1–10 | — |
| sampler | COMBO | euler | 4 options: euler, heun, rk4, rk5 |
| back_imageopt | IMAGE | — | |
| left_imageopt | IMAGE | — | |
| right_imageopt | IMAGE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| mesh | MESHWITHVOXEL | — |
| bvh | BVH | — |