TRELLIS.2
Image to a real, textured 3D mesh — without the 3D stack
- image
- file_path
TRELLIS is Microsoft's 3D generation line, and TRELLIS.2 is the newest generation: take a single image, get back a textured, physically-plausible 3D mesh. Locally, that means downloading a multi-gigabyte model, satisfying a pile of Python dependencies, and waiting minutes on a card with serious VRAM - which is why most ComfyUI users never get past the idea. This node runs TRELLIS.2 on Runware's cloud and hands you back a finished .glb file saved to your output folder. If you've ever wanted "turn this photo of an object into a 3D model I can open," this is the lowest-friction path there is.
The image-to-mesh input is required - this node is the image-conditioned path (unlike Hunyuan 3D in the same pack, which also does pure text-to-3D). You give it an image, it gives you geometry, materials, and UVs in one shot.
How it works
It sends a 3dInference request to Runware, which returns a GLB. The node downloads it (named runware_<random>.glb) into your ComfyUI output folder and outputs a STRING file_path. There's a lot of hidden machinery under TRELLIS.2 - it generates sparse structure, then refines shape and texture in separate stages - and the widget list here is basically the exposed knobs for that pipeline. Most of them you will never touch, which is fine; the defaults are sensible.
The inputs that actually matter
image(required) - the reference. One clear, well-lit shot of the object you want. The cleaner the input, the better the mesh; busy backgrounds make it guess.meshFile- the sneaky good one. It takes a UUID or URL of an existing 3D model and re-textures it using your reference image, skipping geometry generation. If you already have a mesh and want new textures from a photo, this is a genuinely useful second feature hiding in the widget list.settings.geometryOnly- off by default; turns it on to skip texturing and get raw geometry. Good for blockout or if you'll re-texture later.settings.resolution- 512 / 1024 / 1536 voxel grid for generation. Higher = finer geometry and slower. 1024 is a reasonable default; drop to 512 for quick iterations.settings.decimationTarget- target polygon count (5000–1,000,000, default 500,000). Lower it for a lighter model - a game engine will thank you - at the cost of geometric detail.settings.dracoCompression.enabled- compresses the output GLB geometry with Draco (pluslevel,quantizationPosition, etc.). Flip this on if file size matters (web delivery, sharing); leave off if you'll keep editing the mesh.settings.remesh- on by default; produces cleaner topology. TheremeshBand/remeshProjectsub-knobs are for tuning that pass. Generally: leave remesh on unless you're chasing every last polygon.settings.textureSize- 1024–4096 texture map resolution (default 2048). 4096 if the texture detail matters; 1024 for quick versions.settings.textureFormat- WEBP (default) or PNG. WEBP is smaller; PNG if you need lossless.settings.stepsand theguidanceStrength/guidanceIntervalStart/rescaleTtrio forshapeSlat,sparseStructure, andtexSlat- the three sub-stages each have their own denoise steps and guidance. This is deep-end tuning; most people should leave these alone.stepsat 12 each is the default and fine.seedandnumberResults(1–4) - take a couple of seeded variations; 3D quality varies a lot between runs and picking the best is the normal workflow.
The output is file_path - a path string to the saved .glb.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/Runware/ComfyUI-Runware
pip install -r ComfyUI-Runware/requirements.txt
Or ComfyUI Manager → search Runware → install → restart. API key via Settings, RUNWARE_API_KEY, or runware auth login. No local models - that's the point.
Honest gotchas
3D generation is the slowest thing in this pack; a cloud TRELLIS.2 run is not a quick job, and multi-stage pipelines mean the "Rapid"-style speedups don't apply. Budget time and expect the run info to show a real cost. Second, the output is a file path, not an image or video tensor - you'll find the .glb in your output folder and open it in any mesh viewer or Blender. And treat the image input seriously: a cluttered or low-contrast reference will give you a lumpy result, and no amount of settings tuning fixes a bad input.
Inputs (42)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| seedopt | INT | 00–9223372036854776000 | Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range. |
| numberResultsopt | INT | 11–4 | Number of results to generate. Each result uses a different seed, producing variations of the same parameters. |
| meshFileopt | STRING | 3D model to re-texture (UUID or URL). Skips geometry generation and applies new textures using the reference image. | |
| settings.alphaModeopt | COMBO | OPAQUE | Material alpha mode for the output mesh. |
| settings.decimationTargetopt | INT | 5000005000–1000000 | Target polygon count for mesh simplification. Lower values produce lighter models at the cost of geometric detail. |
| settings.dracoCompression.enabledopt | BOOLEAN | false | Compress the output GLB geometry with Draco. |
| settings.meshCluster.globalIterationsopt | INT | 10–64 | Global iterations for chart clustering. |
| settings.shapeSlat.guidanceIntervalStartopt | FLOAT | 0.600–1 | Start of the sampling schedule fraction over which guidance is applied. |
| settings.sparseStructure.guidanceIntervalStartopt | FLOAT | 0.600–1 | Start of the sampling schedule fraction over which guidance is applied. |
| settings.texSlat.guidanceIntervalStartopt | FLOAT | 0.600–1 | Start of the sampling schedule fraction over which guidance is applied. |
| settings.shapeSlat.guidanceIntervalEndopt | FLOAT | 1.000–1 | End of the sampling schedule fraction over which guidance is applied. |
| settings.sparseStructure.guidanceIntervalEndopt | FLOAT | 1.000–1 | End of the sampling schedule fraction over which guidance is applied. |
| settings.texSlat.guidanceIntervalEndopt | FLOAT | 0.900–1 | End of the sampling schedule fraction over which guidance is applied. |
| settings.shapeSlat.guidanceRescaleopt | FLOAT | 0.500–1 | Dampens oversaturation from high guidance values. Lower values apply more correction. |
| settings.sparseStructure.guidanceRescaleopt | FLOAT | 0.700–1 | Dampens oversaturation from high guidance values. Lower values apply more correction. |
| settings.texSlat.guidanceRescaleopt | FLOAT | 0.000–1 | Dampens oversaturation from high guidance values. Lower values apply more correction. |
| settings.shapeSlat.guidanceStrengthopt | FLOAT | 7.501–10 | How closely the output follows the input image. Higher values enforce stricter adherence to the visible geometry. |
| settings.sparseStructure.guidanceStrengthopt | FLOAT | 7.501–10 | How closely the output follows the input image. Higher values enforce stricter adherence to the visible geometry. |
| settings.texSlat.guidanceStrengthopt | FLOAT | 1.001–10 | How closely the output follows the input image. Higher values enforce stricter adherence to the visible geometry. |
| settings.dracoCompression.levelopt | INT | 70–10 | Encoding effort for Draco compression. Higher values reduce file size further but encode more slowly. |
| settings.dracoCompression.quantizationNormalopt | INT | 148–30 | Quantization bits for vertex normals. Higher values produce smoother shading at the cost of file size. |
| settings.dracoCompression.quantizationPositionopt | INT | 168–30 | Quantization bits for vertex positions. Higher values preserve more positional detail at the cost of file size. |
| settings.dracoCompression.quantizationTexCoordopt | INT | 148–30 | Quantization bits for texture coordinates. Higher values keep textures sharper at UV seams at the cost of file size. |
| settings.meshCluster.refineIterationsopt | INT | 00–64 | Local refinement iterations for chart clustering. |
| settings.remeshopt | BOOLEAN | true | Whether to remesh the output for cleaner topology. |
| settings.remeshBandopt | FLOAT | 1.00 | Narrow-band width in voxels used for dual-contouring remeshing. |
| settings.remeshProjectopt | FLOAT | 0.00 | Projection factor for snapping remeshed vertices back to the original surface. |
| settings.shapeSlat.rescaleTopt | FLOAT | 3.001–6 | Timestep rescaling factor for the sampling schedule. Controls how guidance strength is distributed across steps. |
| settings.sparseStructure.rescaleTopt | FLOAT | 5.001–6 | Timestep rescaling factor for the sampling schedule. Controls how guidance strength is distributed across steps. |
| settings.texSlat.rescaleTopt | FLOAT | 3.001–6 | Timestep rescaling factor for the sampling schedule. Controls how guidance strength is distributed across steps. |
| settings.resolutionopt | COMBO | 1024 | Voxel grid resolution for 3D generation. Higher values capture finer geometric detail. |
| settings.meshCluster.smoothStrengthopt | INT | 10–10 | Smoothing strength applied during chart clustering. |
| settings.shapeSlat.stepsopt | INT | 121–50 | Number of denoising steps. More steps improve quality but increase generation time. |
| settings.sparseStructure.stepsopt | INT | 121–50 | Number of denoising steps. More steps improve quality but increase generation time. |
| settings.texSlat.stepsopt | INT | 121–50 | Number of denoising steps. More steps improve quality but increase generation time. |
| settings.textureFormatopt | COMBO | WEBP | Texture format for the output mesh. |
| settings.textureSizeopt | INT | 20481024–4096 | Resolution of the output texture map in pixels. Higher values produce finer surface detail. |
| settings.meshCluster.thresholdConeHalfAngleRadopt | FLOAT | 1.570–3.141592653589793 | Cone half-angle threshold in radians used during UV chart clustering. |
| ttlopt | BOOLEAN | false | Enable to set ttl. Off uses the model's default. |
| ttl_valueopt | INT | 60 | Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`. |
| outputFormatopt | COMBO | GLB | File format for the generated 3D model. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| file_path | STRING | — |