Nodes/ComfyUI/Save Splat
ComfyUI Node Runs on cloud

Save Splat

How to get your gaussian splat out of ComfyUI and into a viewer

By Comfy-Org·Created 4 years ago·Updated about 5 hours ago· 128,055
Save Splat
  • model_3d
  • viewport_state
  • model_3d_info
  • camera_info
  • model_3d
  • model_3d_info
  • camera_info
  • width
  • height
filename_prefix3d/ComfyUI
width1024
height1024

Gaussian splats are ComfyUI's most underrated 3D output: a photoreal scene you can orbit and re-light, without ever reconstructing a mesh. Save Splat is the node that turns that into a file you can open elsewhere - a .ply you can load in any splat viewer, an .spz you can share without eating your drive. It's one of the "Save 3D (Advanced)" family that arrived in core around July 2026, and it's flagged experimental like the rest of the 3D nodes.

What it does

Give it a splat file object, and it writes that file to your output folder, shows it in the 3D viewport with camera and metadata, and passes everything through its outputs so you can chain another save after it. Same shape as Save 3D (Advanced), except the model_3d input is splat-native: PLY, SPLAT, SPZ, KSPLAT, or "any splat." Files land in output/3d/ with a counter-suffixed name (ComfyUI_00001_.ply by default), and the extension is taken from the model's own format.

The thing that actually bites: splats vs. splat files

There's a real distinction hiding in this node. A Splat (the tensor type that TripoSplat and the splat nodes output) is not a file. Save Splat only accepts a serialized file object. So if your graph ends in a splat tensor, you need Create 3D File (from Splat) (SplatToFile3D) in between to serialize it - then Save Splat writes it. That's the typical flow: TripoSplat → Create 3D File (from Splat) → Save Splat. If you loaded a splat from disk with Load 3D instead, its model_3d output plugs straight into Save Splat with nothing in between.

Picking a format

This is where a little knowledge saves you a headache. From the writer node's own tooltips:

  • PLY - standard 3D Gaussian Splat with full spherical harmonics. Most compatible, highest quality, biggest.
  • SPZ - Niantic's gzip-compressed format, roughly 10x smaller, but base color only.
  • KSPLAT - mkkellogg's SplatBuffer, uncompressed, base color only.

Rule of thumb: save PLY when quality and compatibility win, SPZ when you want something shareable. Watch out for the visual difference - base-color-only formats drop view-dependent shine, so a splat that shimmered as PLY can look flat after a lossy conversion. That's not your node failing, that's the format being honest about what it stores.

Inputs that matter

  • model_3d - the splat file object (PLY/SPLAT/SPZ/KSPLAT) to save.
  • filename_prefix - default 3d/ComfyUI, so files go to output/3d/.
  • viewport_state - required, from a Load 3D node; it supplies the camera and metadata the viewport uses. The optional camera_info and model_3d_info override it when wired.
  • width / height - preview render size in the viewport (1–4096), not a resample of your splat.

If something's wrong

If the node "won't take" your input, nine times out of ten you're feeding it a splat tensor instead of a file - add Create 3D File (from Splat). One honest caveat from the source: that serializer handles one item per batch and quietly uses the first if you batch, so keep splats single. And remember the .ply ambiguity: PLY files can be meshes or splats, and the two aren't interchangeable here - a mesh PLY belongs in Save 3D Model (SaveGLB), a splat PLY belongs here.

Category3d

Inputs (7)

NameTypeDefaultDescription
model_3dFILE_3D_SPLAT_ANY,FILE_3D_PLY,FILE_3D_SPLAT,FILE_3D_SPZ,FILE_3D_KSPLATA gaussian splat 3D file.
filename_prefixSTRING3d/ComfyUI
viewport_stateLOAD_3D
widthINT10241–4096
heightINT10241–4096
model_3d_infooptLOAD3D_MODEL_INFO
camera_infooptLOAD3D_CAMERA

Outputs (5)

NameTypeDescription
model_3dFILE_3D_SPLAT_ANY
model_3d_infoLOAD3D_MODEL_INFO
camera_infoLOAD3D_CAMERA
widthINT
heightINT