Nodes/ComfyUI_PHRenderFormerWrapper/RenderFormer Mesh Combine
ComfyUI Node

RenderFormer Mesh Combine

Merge every object in your scene into one renderable list

By paulh4x·Created about a year ago·Updated about a year ago· 37
RenderFormer Mesh Combine
  • 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 required mesh input.
  • MESH_ANIMATED - a dict of {"start_meshes": ..., "end_meshes": ...} covering every mesh, static or animated. Wire this to the Scene Builder's mesh_sequence input 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_2mesh_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 a MESH can plug in - including a MeshTarget'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 MESH goes to the Scene Builder's mesh input while MESH_ANIMATED goes to mesh_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.

CategoryPHRenderFormer

Inputs (8)

NameTypeDefaultDescription
mesh_1MESH
mesh_2optMESH
mesh_3optMESH
mesh_4optMESH
mesh_5optMESH
mesh_6optMESH
mesh_7optMESH
mesh_8optMESH

Outputs (2)

NameTypeDescription
MESHMESH
MESH_ANIMATEDMESH