Skip to content

Gaussian splat tools explained: what each one actually does in the pipeline

By Atlas World Model EditorialUpdated 5 min read

Independent article. Not affiliated with any vendor on this page.

Key facts

The confusionThese tool names sit at four different stages, so "which is best" usually has no answer until you say which stage(as of 2026-09-07)
Stage 1 — capturePhotos or video of a real place; overlap matters more than camera quality(as of 2026-09-07)
Stage 2 — trainTurns the captured images into splats; the step that costs time and compute(as of 2026-09-07)
Stage 3 — viewA viewer renders an existing splat file; it never creates one(as of 2026-09-07)
Stage 4 — importEngines need a splat renderer plus a separate collision proxy(as of 2026-09-07)
Spark (viewer runtime)MIT-licensed three.js renderer reading .ply, .spz, .splat, .ksplat and .sog(as of 2026-09-07)source
Generative shortcutThe Marble World API returns .spz and .ply splats, a mesh and a video without a capture session(as of 2026-09-07)source
How few photosWorld Labs says Atlas reconstructs from two or three images — self-reported, not independently reproduced(as of 2026-09-07)source

Ask which Gaussian splatting tool is best and you will get a list mixing phone apps, desktop trainers, research frameworks, browser renderers and generative APIs — as if they were alternatives to each other. They are not. Most of them cannot do each other’s job at all. Product names below are used only to identify the tools; this page describes the pipeline stage each one occupies rather than benchmarking their output.

The pipeline has four stages

Almost every question about splat tooling dissolves once you know which stage you are asking about.

  1. Capture — get images of a real place.
  2. Train — turn those images into a splat.
  3. View — render a splat file that already exists.
  4. Import — put it in an engine and make it useful.

A phone scanning app covers stages 1 and 2. A research framework is stage 2 only. A browser viewer is stage 3 and can never be anything else. A generative world model such as Marble skips 1 and 2 entirely. “Best” is only meaningful once the stage is named.

Stage 1: capture

You are giving the trainer enough angles to solve for geometry. What matters, roughly in order:

  • Overlap. Every surface should appear in several frames from meaningfully different positions. This is the single biggest determinant of quality, and it is where most first attempts fail.
  • Coverage. Walk the whole space, including the boring parts. Gaps become artefacts, and the trainer will confidently invent something wrong.
  • Consistent lighting. Move around the light, not the light around the scene. Changing exposure mid-capture confuses the solve.
  • Stillness. People, pets and moving leaves become smears. Splats assume the world held still.

Phone capture is genuinely good enough for most scenes. Polycam and Luma are the common consumer entry points, and Scaniverse is a phone-native option in the same space; each hides stage 2 behind their own service, so you capture and receive a result. For classical capture, plan on dozens to hundreds of overlapping photos, which is the working assumption behind the guidance above.

Stage 2: train

This is where the images become splats, and it is the stage with real cost — minutes to hours of GPU time depending on scene size and quality target.

Three ways to get through it:

A hosted service does it. The consumer scanning apps take this route. Least control, least effort, and often the sensible choice.

You run a trainer. Postshot is a desktop route; Nerfstudio is the open-source framework most research work builds on. You get parameter control, local iteration and no upload of your source material — in exchange for setup, a capable GPU, and knowing what the parameters do. This is the right tier if you are producing splats regularly or need them to look a particular way.

You skip it. Generative world models produce the scene directly. The Marble World API takes text, one image, several images, a panorama or video and returns Gaussian splat and GLB mesh exports (World Labs docs) with no capture session and no training run. Atlas goes further on the reconstruction side: World Labs reports faithful results from two or three reference images (The Decoder), a figure that is self-reported and not independently reproduced, and Atlas remains early access.

The distinction that matters between routes two and three: a trainer reconstructs what was photographed, while a generative model invents whatever you did not photograph. For a location that must match reality, that difference is the whole decision.

Stage 3: view

A viewer renders a splat someone else produced. It cannot create one, and no setting inside it will.

This trips people up because viewers are the most visible tools in the category — they are free, they open in a tab, and they are what you meet first when someone shares a scene. Spark, World Labs’ MIT-licensed renderer for three.js, reads .ply, .spz, .splat, .ksplat and .sog, and it is the runtime behind the free splat viewer on this site — drop a file in and it renders locally, with nothing uploaded. If your file will not open at all, the guide to opening splat files walks through the usual causes.

One naming note: several unrelated products are called Spark, including offerings from other large companies. The one in this pipeline is sparkjsdev/spark.

Stage 4: import

Getting a splat into Unity or Unreal takes two things, and the second is the one people discover late.

A renderer. Neither engine draws splats natively, so you need a plugin or runtime that can. This part is well documented by whichever plugin you choose.

A collision proxy. A splat has no surfaces — it is oriented, coloured blobs that reproduce an appearance. Nothing can collide with it, cast a shadow onto it, or be occluded by it in the usual way. So you add an invisible rough mesh, either exported from your scene tool or built by hand out of boxes and planes, and let the player collide with that while looking at the splat.

Skipping the proxy is why so many splat environments are demos rather than levels. The game development use case covers how this lands in practice, and the object-versus-scene split is in 3D object vs 3D scene generation.

Which tool sits where

ToolCaptureTrainViewImport
Polycam, Luma, ScaniverseYesHosted for youIn-appVia export
PostshotNoYes, desktopPreviewVia export
NerfstudioNoYes, frameworkPreviewVia export
SparkNoNoYes, webIt is the renderer
This site’s splat viewerNoNoYes, webNo
MarbleNot neededNot neededWebSplat and mesh export
AtlasNot neededNot needed—Early access only

Read the table by column, not by row. Nothing here is a competitor to everything else in its row.

Three ways this goes wrong

Expecting a viewer to generate. Loading photos into a viewer does nothing. Viewers take .ply and .spz files, not JPEGs.

Comparing a service to a framework. “Polycam vs Nerfstudio” is a question about how much control you want over stage 2, not about which produces better splats. A managed service and a research framework are answers to different questions.

Capturing for a splat like you would for a photo. Photography rewards one good angle. Splatting rewards many mediocre ones with heavy overlap. The instinct to find the best shot and move on is exactly what produces holes.

Where to go next

Sources

  1. Spark renderer on GitHub
  2. Spark on npm
  3. World Labs: Announcing the World API
  4. Radiance Fields: World API for Marble
  5. The Decoder: reconstructing 3D worlds from a few photos
  6. Dealroom: World Labs unveils Atlas

Frequently asked questions

What is the difference between Polycam, Luma and Nerfstudio?

They sit at different points in the same pipeline. Polycam and Luma are consumer-facing: you capture on a phone and their service handles training, so you get a result without running anything yourself. Nerfstudio is an open-source research framework you run, which gives you control over training at the cost of setup. Comparing them directly is comparing a service to a toolkit.

How many photos do I need for a Gaussian splat?

For classical capture-and-train, dozens to hundreds with generous overlap — every surface should appear in several frames from different angles. Generative world models change this arithmetic: World Labs reports Atlas working from two or three images, though that figure is self-reported.

Can I open a .ply splat without installing anything?

Yes. Splat files render in a browser through a WebGL runtime, which is what the free splat viewer on this site uses. Nothing is uploaded to run it. The step-by-step version is in the guide to opening splat files.

If I use Marble, do I still need to capture and train?

No, that is the point of the generative route. You supply text, an image, several images, a panorama or video, and it returns a finished world with Gaussian splat and mesh exports. There is no capture session and no training run to babysit.

What is Spark?

An MIT-licensed Gaussian splat renderer for three.js, published by World Labs on GitHub as sparkjsdev/spark. It reads .ply, .spz, .splat, .ksplat and .sog. It is a renderer, not a generator — it displays splats that something else produced. Note that several unrelated products are also called Spark.

Can I put a Gaussian splat in Unity or Unreal?

Yes, with a plugin or runtime that can render splats, since neither engine handles them natively. You also need a separate collision proxy — a rough mesh — because a splat has no surfaces to collide with. Skipping that step is why players walk through splat environments.

Which splat format should I export?

Broadly: .ply for compatibility and editing, .spz when file size matters. The trade-offs, including what each format keeps and drops, are covered in the PLY vs SPZ guide on this site.