Skip to content(if available)orjump to list(if available)

Show HN: Spark, An advanced 3D Gaussian Splatting renderer for Three.js

Show HN: Spark, An advanced 3D Gaussian Splatting renderer for Three.js

88 comments

·June 11, 2025

I'm the co-creator and maintainer of https://aframe.io/ and long time Web 3D graphics dev.

Super excited about new techniques to author / render / represent 3D. Spark is a an open source library to easily integrate Gaussian splats in your THREE.js scene I worked with some friends and I hope you find useful.

Looking forward to hearing what features / rendering techniques you would love to see next.

erulabs

Super impressive looking demo, works well on my older iphone.

As an only-dabbling-hobbiest game developer who lacks a lot of 3d programming knowledge, the only feedback I can offer is you might perhaps define what "Gaussian Splatting" is somewhere on the github or the website. Just the one-liner from wikipedia helps me get more excited about the project and potential uses: Gaussian splatting is a volume rendering technique that deals with the direct rendering of volume data without converting the data into surface or line primitives.

Super high performance clouds and fire and smoke and such? Awesome!

dmarcos

Thanks. We have to definitely add an FAQ

jasonthorsness

The food scans demo ("Interactivity" examples section) is incredible. Especially Mel's Steak Sandwich looking into the holes in the bread.

The performance seems amazingly good for the apparent level of detail, even on my integrated graphics laptop. Where is this technique most commonly used today?

dmarcos

There's a community of people passionate about scanning all short stuff with handheld devices, drones... Tipatat let us generously use his food scans for the demo. I also enjoy kotohibi flower scans: https://superspl.at/user?id=kotohibi

Edit: typos

jasonthorsness

Wow what kind of device do I need to make my own?

dmarcos

The food scans are just photos from a Pixel phone processed with postshot (https://www.jawset.com/) to generate the splats

ChadNauseam

I'm sure it's not cutting edge, but the app "scaniverse" generates some very nice splats just by you waving your phone around an object for a minute or so.

creata

And the transfer size for that level of detail isn't that bad, either - only around 80MB. (Not being sarcastic, it's really neat.)

dmarcos

Yeah. And some of the individual scans like Clams and Caviar or Pad Thai are < 2MB.

ertucetin

This is cool also BabylonJS has nice gaussian splat support as well: https://doc.babylonjs.com/features/featuresDeepDive/mesh/gau...

echelon

BabylonJS and the OP's own Aframe [1] seem to have similar licenses, similar number of Github stars and forks, although Aframe seems newer and more game / VR focused.

How do Babylon, Aframe, Three.js, and PlayCanvas [2] compare from those that have used them?

IIUC, PlayCanvas is the most mature, featureful, and performant, but it's commercial. Babylon is the featureful 3D engine, whereas Three.js is fairly raw. Though it has some nice stuff for animation, textures, etc., you're really building your own kit.

Any good experiences (or bad) with any of these?

OP, your demo is rock solid! What's the pitch for Aframe?

How do you see the "gaussian splat" future panning out? Will these be useful for more than visualizations and "digital twins" (in the industrial setting)? Will we be editing them and animating them at any point in the near future? Or to rephrase, when (or will) they be useful for the creative and gaming fields?

[1] https://github.com/aframevr/aframe

[2] https://playcanvas.com/

dmarcos

A-Frame is an entity component system on top of THREE.js that uses the DOM as a declarative layer for the scene graph. It can be manipulated using the standard APIs and tools that Web developers are used to. Initial target was onboarding Web devs into 3D but found success beyond. The super low barrier of entry (hello world below) without sacrificing functionality made it very popular for people learning programming / 3D (part of the curriculum in many schools / universities) and in advanced scenarios (moonrider.xyz ~100k MAUs (300k MAUs at peak) most popular WebXR content to date is made with A-Frame)

One of the Spark goals is exploring applications of 3D Gaussian Splatting. I don't have all the answers yet but already compelling use cases quickly developing. e.g photogrammetry / scanning where splats represent high frequency detail in an appealing and relatively compact way as you can see in one of the demos (https://sparkjs.dev/examples/interactivity/index.html). There are great examples of video capture already (https://www.4dv.ai/). Looking forward to seeing new applications as we figure out better compression, streaming, relighting, generative models, LOD...

A-Frame hello world

<html> <head> <script src="https://aframe.io/releases/1.7.1/aframe.min.js"></script> </head> <body> <a-scene> <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box> </a-scene> </body> </html>

echelon

Thank you, this is great info!

ovenchips

When you say that PlayCanvas is commercial, that's a little misleading. The PlayCanvas Engine (analogous to Three.js and Babylon.js) is free and open source (MIT). The PlayCanvas Engine is where you'll find all the cool 3DGS tech. There are two further frameworks that wrap the Engine (for those that prefer to use a declarative interface): PlayCanvas Web Components and PlayCanvas React. Again, both of these are free and open source (MIT). Only the PlayCanvas Editor (analogous to a browser-based Unity) has optional payment plans (for those that want to create private projects).

PlayCanvas Engine: https://github.com/playcanvas/engine

PlayCanvas Web Components: https://github.com/playcanvas/web-components

PlayCanvas React: https://github.com/playcanvas/react

Joel_Mckay

Did a test study in BabylonJS, and generally the subset of compatible features is browser specific.

The good:

1. Blender plugin for baked mesh animation export to stream asset is cool

2. the procedural texture tricks combined with displacement maps mean making reasonable looking in game ocean/water possible with some tweaking

3. adding 2D sprite swap out for distant objects is trivial (think Paper Mario style)

The bad:

1. burns gpu vram far faster than normal engines (dynamic paint bloats up fast when duplicating aliases etc. )

2. JS burns CPU cycles, but the wasm support is reasonable for physics/collision

3. all resources are exposed to end users (expect unsophisticated cheaters/cloners)

The ugly:

1. mobile gpu support on 90% of devices is patchwork

2. baked lighting ymmv (we tinted the gpu smoke VFX to cheat volumetric scattering)

3. in browser games essentially combine the worst aspects of browser memory waste, and security sandbox issues (audio sync is always bad in browser games)

Anecdotally, I would only recommend the engine for server hosted transactional games (i.e. cards or board games could be a good fit.)

Otherwise, if people want something that is performant, and doesn't look awful.... Than just use the Unreal engine, and hire someone that mastered efficient shader tricks. =3

tmilard

Personaly I have been using babylonJs for five years. And I just love it. For me it's so easy to program ( cleanest API I have ever seen) and my 3D runtime is so light, my demos work fine even on my android phone.

echelon

Thanks!

moshegramovsky

Cool work, but I have to say the performance is pretty bad in Firefox on my laptop with an Nvidia RTX A3000 GPU. There are enough shader cores here to cause first degree burns.

dmarcos

With any demo / example in particular?

VikingCoder

Can I run around with my phone, and capture some Gaussian Splats of... grass... bushes... dirt...

And then select one-meter square patches of land... and one-meter cubes of spots with bushes...

And then make a "Minecraft-looking" world, repeating the grass block all over the place, with occasional dirt and bushes?

I'm guessing I'd need some pretty beefy hardware to render thousands of blocks...

dmarcos

You definitely could prototype something like that. Would be really cool to see.

fidotron

Very very cool.

Do you have any insights into the current performance bottlenecks? Especially around dynamic scenes. That particle simulation one seems to struggle but then improves dramatically when the camera is rotated, implying the static background is much heavier than it appears.

And as a counterpoint to the bottlenecks, that Sierpinski pyramid, procedurally, is brilliant.

dmarcos

Number of splats in the scene and distribution have an impact on performance. Probably in your case you turned the camera in a direction with less splats. There's definitely work to do to deliver consistent performance. We'll probably look into an LOD system next.

pvg

Slightly more obvious repo link https://github.com/sparkjsdev/spark

null

[deleted]

socalgal2

I'm still highly skeptical of gaussian splatting as anything more than a demo. The files are too large. The steak sandwich is 12meg (as just one example)

There was a guassain splat based Matterport port clone at least year's siggraph. To view a 2 bedroom apartment required streaming 1.5gig

Cool demo

dmarcos

Thanks! Notice 12MB steak sandwich is the biggest of them all. Rest are < 10MB and several of those very compelling in the 1-3MB range (e.g: Iberico Sandwich 1MB, Clams and Caviar 1.8MB).

Fancier compression methods are coming (e.g SOGS). This is 30MB!

https://vincentwoo.com/3d/sutro_tower/

oofbey

How much of the huge file size is because you need tons of splats to simulate a hard surface? Conceptually the splats seems flawed because gaussians don't have hard edges - they literally go to infinity in all directions, just at vanishingly small densities. So practically everybody cuts them off at 3 sigma or something, which covers 99.7% of the volume. But real-world objects have hard edges, and splats don't.

Would the format work better if you made that cut-off at something like 1 sigma instead? Then instead of these blurry blobs you'd effectively be rendering ovals with hard edges. I speculate out loud that maybe you could get a better render with fewer hard-edged ovals than tons of blurry blobs.

pixelsynth

It's an interesting idea, and with spark you could test this by adjusting the parameter maxStdDev to control how far out it draws the splat.

I agree with you though that in general 3DGS is a worse representation for hard, flat, synthetic things with hard edges. But in the flip side, I would argue it's a better representation for many organic, real-world things, like imagine fur or hair or leaves on a tree... These are things that can render beautifully photo realistically in a way that would require much, much more complex polygon geometry and texturing and careful sorting and blending of semi-transparent texels. This is one reason why 3DGS has become so popular in scanning and 3D reconstruction.. you just get much better results with smaller file sizes. When 3DGS first appeared, everyone was shocked by how photorealistic you could render things in real time on a mobile device!

But one final thought I want to add: with Spark it's not an either/or. You can have BOTH in the same Three.js scene and they will blend together perfectly via the Z-buffer. So you can scan the world around you and render it with 3DGS, and then insert your hard-edged robot character polygon meshes right into that world, and get the best of both!

semi-extrinsic

There was an interesting preprint (and code release) recently on triangle splatting, you may find this interesting:

https://trianglesplatting.github.io/

athriren

thanks for that link, i found it really cool.

ovenchips

The SOGS compression technique works well. You can get 1M Gaussians with full spherical harmonics in about 14MB. There's a good article about it on the PlayCanvas blog:

https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3...

hellohello2

Large file sizes are mostly to store spherical harmonics coefficients which is a fixable problem.

Epa095

Slightly overloaded name. There is already Apache Spark, SPARK (Ada), sparklines, and SPARQL.

bryzaguy

Wish I could see this! My iPhone 16 blocked viewing because of, I think, expired certificate. At least, that’s the error I think I got initially and now it just says the page belongs to a category that is blocked. :(

dmarcos

Strange. I also have an iPhone I haven’t seen any issues. Are you using a different browser than Safari or any particular configuration?

mbo

Amazing stuff!

Do you foresee this project getting a Web Components API like A-Frame and Google's <model-viewer> component (https://modelviewer.dev/)?

dmarcos

A-Frame integration coming soon!