comfy / hunyuan3D / texGen
Hunyuan3D's texture pass, hosted
- image_url
- mesh
- model_air
- api_config
- model
- fbx_model
- thumbnail
- rigged_model
- rigged_fbx_model
- animated_model
- animated_fbx_model
- basic_animations
- workflow_id
- raw_json
Here's the workflow that makes image-to-3D actually usable: generate a shape cheap, then spend your real effort on the texture. The Hunyuan3D texGen node is the second half of that - it takes a mesh you already have and repaints it from a reference image, on Civitai's cloud, without a single local model file.
What it is
The comfy / hunyuan3D / texGen recipe in the civitai/civitai-comfy-nodes pack. Mechanically it's identical to its siblings: submit a job to the Civitai orchestration API, poll, get native Comfy outputs back. The difference is which fields it requires. Where imageTo3D just needs a picture, texGen wants two things:
image_url- the reference image (IMAGE socket). This is what drives the paint stage; the texture is hallucinated from this picture's look.mesh- aCIVITAI_AIRinput, not a file. You fill it by wiring a Civitai Model Selector node and picking the mesh (or by wiring themodeloutput of a prior shapeGen/imageTo3D run if the pack lets you - the selector path is the reliable one).
So the natural loop is: shapeGen (or imageTo3D) makes the geometry → texGen reskins it. The mesh travels as an AIR reference, which means the whole thing stays cloud-side - you never download the GLB just to re-upload it.
The inputs
Beyond the two required ones, the schema is the Hunyuan3D diffusion panel again:
model_version-v2,v2.1,v2-mini.enable_pbr- default true, and here it actually matters. PBR means the texture ships as metalness/roughness/albedo channels rather than a single baked diffuse map, so it relights properly in a game engine. Keep it on unless you have a reason not to.should_remesh- default off. Turn it on to let the pipeline rebuild geometry as part of the job; useful if your source mesh is rough.steps,cfg_scale,sampler,scheduler- the texture model's sampling knobs. Defaults are fine.prompt- a text hint for the paint stage, e.g. material descriptors ("rusty metal", "painted wood").
The outputs
model (URL to the textured GLB), fbx_model, thumbnail (IMAGE → wire into Preview Image), then the usual rigged/animated slots that mostly stay empty on Hunyuan3D, plus workflow_id and raw_json.
Installing it
Standard pack install - ComfyUI Manager, search Civitai Comfy Nodes, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/civitai/civitai-comfy-nodes.git
pip install -r civitai-comfy-nodes/requirements.txt
No model downloads; requests + python-socketio are the only deps.
The gotchas
- Credentials or nothing. Wire a Civitai Auth node, set
CIVITAI_API_TOKEN, or sign in via the sidebar. No token, no texture. - The mesh input is the thing people fumble. It's not a file path - it's an AIR socket. If you don't see a place to type a path, that's because there isn't one. Use the Model Selector's Browse button.
- Metered, per run. Texture passes bill in Buzz; watch
raw_jsonif you're running a lot of iterations. - Texture quality ceiling. Hunyuan3D's PBR texturing is "furthest along" of the open pipes, but it's not production-grade. Expect to do cleanup for anything that ships.
- Organic shapes are the weak spot. Faces, animals, cloth reconstruct worse than hard-surface props across the whole model family. Budget accordingly.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| image_url | IMAGE | — | |
| mesh | CIVITAI_AIR | — | |
| model_versionopt | COMBO | v2 | 3 options: v2, v2.1, v2-mini |
| model_airopt | CIVITAI_AIR | — | |
| stepsopt | INT | 11–150 | — |
| cfg_scaleopt | FLOAT | 0.000–30 | — |
| sampleropt | COMBO | euler | 18 options: euler, euler_ancestral, heun, heunpp2, dpm_2, dpm_2_ancestral, +12 |
| scheduleropt | COMBO | normal | 7 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +1 |
| resolutionopt | INT | 11–8192 | — |
| vae_num_chunksopt | INT | 80001000–500000 | — |
| octree_resolutionopt | INT | 25616–512 | — |
| mesh_thresholdopt | FLOAT | 0.600–1 | — |
| seedopt | INT | 00–4294967295 | — |
| shiftopt | FLOAT | 1.000–2147483647 | — |
| should_remeshopt | BOOLEAN | false | — |
| enable_pbropt | BOOLEAN | true | — |
| api_configopt | CIVITAI_CONFIG | Optional Civitai Auth connection; defaults to CIVITAI_API_TOKEN or stored OAuth login. |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| model | STRING | — |
| fbx_model | STRING | — |
| thumbnail | IMAGE | — |
| rigged_model | STRING | — |
| rigged_fbx_model | STRING | — |
| animated_model | STRING | — |
| animated_fbx_model | STRING | — |
| basic_animations | STRING | — |
| workflow_id | STRING | — |
| raw_json | STRING | — |