Using gaussian splats and classic meshes in one web realtime scene. This allows me to use the benefits of each technique. Complicated materials like fuzzy fur can be visualized perfectly with a gaussian splat, while I use meshes for everything else.

#threejs #sparkjs #realtime

Loading images is one of the most fundamental things a browser does. It turns out that doing it efficiently from JavaScript is an open problem. There are multiple APIs available and the right choice depends on the browser you are targeting.

https://www.ludicon.com/castano/blog/2026/05/image-loading-on-the-web/

#webgpu #webgl #sparkjs

Image Loading on the Web

You would think that loading images in the browser is a solved problem. After all, websites are basically composed of text and images. Turns out that loading images from JavaScript to use in WebGL/WebGPU applications is not nearly as simple or well supported as it should be. There are several API

Ignacio Castaño

I fixed the shader imports in spark.js to work with static analysis, so you can estimate bundle sizes for WebGL and WebGPU.

In practice, though, shaders are imported dynamically. You only pay for what you use, so the actual overhead is tiny.

#webgl #webgpu #sparkjs

I'm excited to announce the release of spark.js 0.1 now with support for WebGL!

https://www.ludicon.com/castano/blog/2026/03/announcing-spark-js-0-1/

#webgl #webgpu #sparkjs

Announcing spark.js 0.1

I'm excited to announce spark.js 0.1, now with WebGL support!

Ignacio Castaño
Live dev test! SparkJS + A-Frame loading a Marble .spz with JXR-Core — in-browser demo of 3D asset loading (warning: low perf). Fun peek into WebXR/WebGL + JS tooling and model pipelines. Check it out and tell us what breaks! #SparkJS #AFrame #Marble #JXR #WebXR #WebGL #JavaScript #OpenSource #Dev #PeerTube #LiveTest #English
https://video.benetou.fr/videos/watch/ce87b094-3a17-458a-99af-0c3364a7e690
SparkJS AFrame component loading Marble .spz with JXR-Core note test

PeerTube

I've put together an updated version of the Sponza scene with uncompressed PNG and compressed AVIF textures. I wrote about the process and compared the results against KTX.

https://www.ludicon.com/castano/blog/2026/02/an-updated-sponza-gltf/

#webgpu #sparkjs

An Updated Sponza glTF – Ignacio Castaño

While working on spark.js, I realized that normal map compression formats weren’t supported in popular frameworks like three.js. I addressed that gap by adding the necessary support to three.js and wrote an article to shed some light on the topic, drawing from my experience in real-time 3D graphics.

https://www.ludicon.com/castano/blog/2026/02/normal-map-compression-revisited/

#webgpu #webgl #threejs #sparkjs

Normal Map Compression Revisited – Ignacio Castaño

Ian Curtis (@XRarchitect)

웹상에서 지속되는(persistent) 월드 모델을 구현했다는 발표. 60초 제한이 없으며 World Labs가 SparkJS, Three.js, Rapier를 조합해 브라우저 기반의 지속적 3D/물리 월드를 제공하는 시도임을 시사.

https://x.com/XRarchitect/status/2018369477495406965

#worldlabs #sparkjs #threejs #rapier #webgl

Ian Curtis (@XRarchitect) on X

Persistent world models on the web. No 60-second time limit. World Labs × SparkJS × Three.js × Rapier 🌎

X (formerly Twitter)