Nodes/camera-comfyUI/MergeSplats
ComfyUI Node

MergeSplats

The dumb way to join two Gaussian clouds (and why dumb is fine)

By Alexankharin·Created about a year ago·Updated about a month ago· 36
MergeSplats
  • splats_a
  • splats_b
  • merged_splats
deviceauto

If you've got two GSPLAT objects and you want one GSPLAT object, this is the node. MergeSplats just concatenates every Gaussian in cloud A onto every Gaussian in cloud B and hands you back a single cloud. No re-projection, no overlap logic, no re-rendering. It is the splat equivalent of torch.cat, and for a lot of real workflows that's exactly what you want.

The name is doing a bit of work, though. In camera-comfyUI there are two ways to combine splat clouds: MergeSplats (dumb concat) and FuseSplats (weighted voxel merging with keep/discard/average/smart modes). Reaching for Merge when you actually need fusion is how you end up with 10,000 overlapping Gaussians all fighting over the same pixels. Use Merge when the two clouds cover different regions of space and you just want one object to render or save - the classic case being FisheyeToGaussian, which predicts splats from several pinhole angles, rotates each into the same frame, and then needs them stitched into a single world cloud before rendering.

How it works

Under the hood it takes each of the splat cloud's tensors - xyz, scale, rotation, opacity, and the two color feature tensors f_dc / f_rest - and concatenates them along the point dimension. That's the whole trick. The one hard requirement is that both clouds share the same spherical-harmonic order and f_rest width; if they don't, the node raises a ValueError instead of producing garbage. In practice that means merging clouds that came from the same producer pipeline (same SH order), which is exactly what the pack's own fusion workflows assume.

The inputs that matter

Only three, and you only really set one:

  • splats_a / splats_b - the two GSPLAT inputs. Order doesn't change the result.
  • device - auto (default) puts both clouds on the same device before merging; cpu and cuda let you force it. Leave it on auto unless you're seeing device-mismatch errors.

The output is a single merged_splats GSPLAT that flows into anything else that takes a splat cloud - RenderSplat, SplatPolish, SavePlySplat, or SphereSplatSeed's sibling nodes.

Installing it

MergeSplats ships in the camera-comfyUI pack. Install the pack once and you get all 30+ nodes in it: ComfyUI Manager → Custom Nodes Manager → search camera-comfyUI → Install, then restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/Alexankharin/camera-comfyUI.git
cd camera-comfyUI && python install.py   # Manager does this automatically

The install.py step pulls optional heavy deps (gsplat, the SHARP submodule, a Flux inpainting pack); none of them are needed just for MergeSplats, so it works even on a bare install.

Common issues

  • "Splats must share the same SH order and f_rest size" - the one error you'll actually hit. Both inputs need to come from the same generation pipeline; don't try to merge a SHARP single-image cloud with something built by BuildSplats4D's canonical splats without thinking about it.
  • Overlapping clouds look mushy - that's expected with plain concat. If the clouds overlap heavily, switch to FuseSplats instead.

Keep Merge in your back pocket for when you just need two clouds to be one.

CategoryCamera/GSplat

Inputs (3)

NameTypeDefaultDescription
splats_aGSPLAT
splats_bGSPLAT
deviceoptCOMBOauto3 options: auto, cpu, cuda

Outputs (1)

NameTypeDescription
merged_splatsGSPLAT