RenderFormer Mesh Combine
Merge every object in your scene into one renderable list
- mesh_1
- mesh_2
- mesh_3
- mesh_4
- mesh_5
- mesh_6
- mesh_7
- mesh_8
- MESH
- MESH_ANIMATED
A real scene is never one object. It's a character on a pedestal with a backdrop behind them, and each piece is its own mesh. RenderFormerMeshCombine is the node that stitches all those separate MESH outputs into a single object list the Scene Builder can consume. It's one of the 15 nodes in paulh4x/ComfyUI_PHRenderFormerWrapper, the "100% vibecoded" wrapper around Microsoft's RenderFormer (SIGGRAPH 2025).
How it works
It's a straightforward merge with an animation twist. The inputs are mesh_1 through mesh_8 - mesh_1 is required, the rest optional. For each connected input, the node checks whether it's a static MESH or an animated one (the start/end dict from RenderFormerMeshTarget), and flattens them into two combined frames:
MESH- the merged start-frame object list. Wire this to the Scene Builder's requiredmeshinput.MESH_ANIMATED- a dict of{"start_meshes": ..., "end_meshes": ...}covering every mesh, static or animated. Wire this to the Scene Builder'smesh_sequenceinput for video.
Static meshes get deep-copied into the end frame (so they stay put through the animation), while animated meshes bring their own end states. The Scene Builder then uses the animated list and smartly removes any object that's being animated from the static frame so nothing renders twice - that dedup logic is why this chain works cleanly.
The inputs
mesh_1- required. Everything else can chain off it.mesh_2…mesh_8- optional extra meshes. The advanced example workflow shows the pattern: one chain runs LoadMesh → Remesh → RandomizeColors, another runs LoadMesh directly, and both converge here. Anything that outputs aMESHcan plug in - including aMeshTarget's animated output.
One thing to note: the README's basic example doesn't use this node - it goes LoadMesh → RandomizeColors → Scene Builder with a single object. Combine is for when your scene has multiple independent objects, which is most real use.
Installing it
# ComfyUI Manager: search "ComfyUI_PHRenderFormerWrapper"
cd ComfyUI/custom_nodes/
git clone https://github.com/paulh4x/ComfyUI_PHRenderFormerWrapper.git
cd ComfyUI_PHRenderFormerWrapper
git clone https://github.com/microsoft/renderformer.git renderformer
pip install -r requirements.txt
python -c "import imageio; imageio.plugins.freeimage.download()"
Restart ComfyUI.
Common issues
- Objects missing from the render - check that all meshes reach the combine, and that
MESHgoes to the Scene Builder'smeshinput whileMESH_ANIMATEDgoes tomesh_sequence. Cross them up and you'll get half your scene. - An animated object renders as a double - on older pack versions this happened; current builds dedupe animated objects from the static list automatically. Update via Manager.
- Polygon budget across combined meshes - remember RenderFormer's 8192-polygon total limit applies to the whole scene, not per object. If you combine several dense meshes, remesh each one before it reaches here.
It's the plumbing node - boring, essential, and the reason the advanced workflow can handle "multiple, independent objects" at all.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| mesh_1 | MESH | — | |
| mesh_2opt | MESH | — | |
| mesh_3opt | MESH | — | |
| mesh_4opt | MESH | — | |
| mesh_5opt | MESH | — | |
| mesh_6opt | MESH | — | |
| mesh_7opt | MESH | — | |
| mesh_8opt | MESH | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| MESH | MESH | — |
| MESH_ANIMATED | MESH | — |