Save Splat
How to get your gaussian splat out of ComfyUI and into a viewer
- model_3d
- viewport_state
- model_3d_info
- camera_info
- model_3d
- model_3d_info
- camera_info
- width
- height
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- default3d/ComfyUI, so files go tooutput/3d/.viewport_state- required, from a Load 3D node; it supplies the camera and metadata the viewport uses. The optionalcamera_infoandmodel_3d_infooverride 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.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model_3d | FILE_3D_SPLAT_ANY,FILE_3D_PLY,FILE_3D_SPLAT,FILE_3D_SPZ,FILE_3D_KSPLAT | A gaussian splat 3D file. | |
| filename_prefix | STRING | 3d/ComfyUI | — |
| viewport_state | LOAD_3D | — | |
| width | INT | 10241–4096 | — |
| height | INT | 10241–4096 | — |
| model_3d_infoopt | LOAD3D_MODEL_INFO | — | |
| camera_infoopt | LOAD3D_CAMERA | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| model_3d | FILE_3D_SPLAT_ANY | — |
| model_3d_info | LOAD3D_MODEL_INFO | — |
| camera_info | LOAD3D_CAMERA | — |
| width | INT | — |
| height | INT | — |