Bug fixes and adjustments post 2.0.0 release.
- Support plain x/y/z/r/g/b point clouds in ply files (#340) (@mrxz)
- Implement forEachSplat and getBoundingBox for PagedSplats (#324) (@mrxz)
- Specify 0.180.0 or higher as Three.js peer dependency (#309) (@mrxz)
- Rename packed to packedData as Chrome 149 onwards considers it a reserved keyword (#351) (@mrxz)
- Remove spark-internal-rs from biome.json ignore list (#350) (@mrxz)
- Fix issue when premultipliedAlpha cannot longer be changed on the fly (#331) (@mrxz)
- Fix problem when loading CloudCompare-exported binary PLY files (#338) (@mrxz)
- Address memory leak by clearing texture references so can be GCed (#326) (@mrxz)
- Fix examples importmaps (@mrxz, @dmarcos)
- Docs Improvements (@mrxz, @dmarcos, @mikeyzhong)
Spark 2.0 is a major release that adds a Level-of-Detail (LoD) system for 3DGS, enabling huge worlds to be rendered on the web on any device, with progressive streaming, virtual splat paging, and higher precision storage. It remains mostly backward compatible with 0.1 apps.
- New
SparkRendererthat supports rendering multiple LoD splat trees computed according to max splat counts, minimum screen-space size, and camera foveation. Also supports rendering splats from a virtual paging system, extended precision encoding. New options for custom render targets and overriding material properties including custom shaders and uniforms. - Tunable LoD rendering: max splat count tunable with
SparkRenderer.lodSplatCountand.lodSplatScale, minimum detail with.lodRenderScale, foveation parameters using.coneFov0,.coneFov,.coneFoveate, and.behindFoveate. Individual meshes tunable usingSplatMesh.lodScale,.coneFov(0),.coneFoveate, and.behindFoveate. - New splat file format
.RAD(RADiance field) that supports custom field encoding, columnar storage and compression, and chunked random access, enabling progressive loading and streaming of huge 3DGS scenes. - Two 3DGS downsampling algorithms:
tiny-lodfor generating LoD splat trees on-demand in the browser after loading, andbhatt-lodfor higher-quality LoD splat tree generation in an offline setting. Both algorithms can be run in the browser or from thebuild-lodcmdline tool. - On-demand LoD splat creation using
new SplatMesh({ lod: true })andSplatMesh.createLodSplats, and instant toggling between LoD and non-LoD versions of the splats usingSplatMesh.enableLod. - Virtual splat paging system
SplatPagerto preallocate GPU buffers shared across splat objects, loaded across the network in order prioritized by the viewpoint, managed in LRU fashion. - High-precision splat encoding in
ExtSplatsthat mirrorsPackedSplatsand alleviates most precision issues. High precision usage selectable usingSplatMesh.extSplats,SparkRenderer.pagedExtSplats, and.accumExtSplats. - Multiple viewport rendering using multiple
SparkRenderer, generalizing viewport rendering to encompass different scenes, splats, and shader effects between renders.
- Huge file loading support from
ReadableStream, enabling multi-GB splat files from URLs or local drag-and-drop without first allocating a fullUint8Array. - Chainable splat Dyno modifiers using
SplatMesh.objectModifiersand.worldModifiersarrays. - New
SparkXrwrapper for AR / VR experiences
- Apps must now explicitly create a
SparkRendererand add it to the scene. Spark no longer automatically injects one because it would sometimes result in multiple renderers within the scene. - Multiple viewpoints now use multiple
SparkRendererinstances instead ofspark.newViewpoint(), and sorting options are configured directly on each renderer. - Spark 2.0 requires THREE.js r179 or newer, replaces
VRButtonwithSparkXr, and replacesSparkRenderer.getRgba()/.readRgba()workflows with generator-based RGBA rendering. OldSparkRendererand relatedOld*classes are available as temporary fallbacks for code that still depends on the 0.1 renderer model.
- Deprecated the experimental stochastic sort-free rendering mode.
- Deprecated splat texture support for arbitrary per-splat RGBA texture profiles.
SOG v2 support, new examples and bug fixes
- SOGSv2 (SOG) compression format support (#179) (@mrxz)
- Use DecompressionStream for decompressing .spz files for faster loading times (#181) (@mrxz)
- Make WASD default control for viewer (#6d7d801) (@dmarcos)
- Add
minPixelRadiusproperty to discard splats during vertex shader (#184) (@mrxz) - Docs enhancements (@querielo)
- Interactive holes example (#189) (@kali-shade)
- Interactive ripples effect (#194) (@kali-shade)
- Support logarithmic depth buffer (#199) (@Philipp-M)
- Issue preventing the splats from being updated when they should. (#191) (@mrxz)
- Make bash script conform to "standard" (#197) (@Philipp-M)
- Fix issue with splats rendered at incorrect position for a few frames (#200) (fix #192, #193) (@mrxz)
Performance improvements, SPZ v3 support, new splat transition and reveal effects, brush painting / erasing splat example.
- New splat transition effects (#172) (@kali-shade)
- New splat reveal effects (#153, #149) (@kali-shade)
- Add support for SPZ v3 (fix #151) (#171) (@gwegash, @dmarcos)
- Reduce small memory allocations when loading ply files (#147) (@mrxz)
- Improve .ply parsing speed using compiled parser function (#150) (@mrxz)
- Add support for ortographic rendering (#157) (@mrxz)
- Make sure all examples resize when the window is resized (#155) (@mrxz)
- Call gl.flush() to encourage eager execution. SparkRenderer.updateInternal was not immediately executed (#156) (@mrxz)
- Use child mesh in
SplatMeshto auto-injectSparkRendererinstead of monkey-patching (#158) (@mrxz) - Pre-compute lookup tables when parsing SOGS files (#159) (@mrxz)
- Avoid allocating THREE.Quaternion instances in
setPackedSplat(#160) (@mrxz) - Use native
Float16Arrayto encode a number as a float16 if available. (#161) (@mrxz) - Splat brush painting / brush erasing example (#165) (@winnie1994)
Bug fix + SplatMesh bounding box calculation.
- Fix SH encoding scale factors (#142) (@asundqui, @mrxz, @heimeii)
- Calculate a SplatMesh's bounding box!
SplatMesh.getBoundingBox()(#126) (@winnie1994)
Image quality and performance improvements.
- Customizable splat encoding ranges (rgb, sh1, sh2, sh3) for wider range of colors and scales support improving contrast and color reproduction. Expose
premultipliedAlphaflag to use when accumulating splat RGB (#134) (@asundqui) - Experimental Stochastic splat ordering option. Faster rendering since sorting no longer needed but with some visual quality tradeoffs (#8f5596e) (@asundqui)
- Higher precision mode (float32) for splat sorting in addition to the default one (float16). Addresses z-fighting issues between splats (@asundqui, @mrxz) (#129)
- Allow decoding and parsing of SOGS images to happen in parallel (@mrxz) (#122)
- New splat shaders effect example (#141) (@kali-shade)
- Expose
minAlphaandmaxPixelRadiusin the SparkRenderer parameters (#130) (@asundqui) - Tree-shaking on worker code (@mrxz) (#118)
- Add JSDocs to docs (@mrxz) (#123)
- Use THREE.js built-in full screen quad instead of custom setup to cover the entire render target (@mrxz) (#121)
- Redunce bundle size by removing
anyhow::anyhowdependency (#127) (@asundqui)
- Remove
SparkRendererblending parameter. Rely instead onTHREE.jsbuilt-in support forpremultipliedAlphathat sets the right blending mode automatically (#136) (@mrxz)
Visual quality improvements, .zip sogs file support, bug fixes.
- Can load SOGS compressed splats packaged in a .zip file (#100) (@asundqui)
- Rename
SparkRendererrenderScale parameter to focalAdjustment (#113) (fix #99) (@asundqui, @mrxz) - Use OffscreenCanvas and WebGL2 context to decode webp SOGS images instead of 3rd party dependency (#90) (@mrxz)
- Animated transitions between splats example (#69) (@winnie1994)
- Example of loading a SOGS compressed splat (@dmarcos, @vincentwoo, @61cygni)
- Expand value range of internal splat encoding to improve visual quality. Lower zero cut-off to retain and render small splats. (#110) (@asundqui, @mrxz)
- Fix visible property of SplatMesh not having effect. (fix #77) (#100) (@asundqui, @cyango)
- Add missing sh1 and sh2 support to SOGS compressed support (fix #108) (#109) (@lucasoptml)
- Prevent unintentional reuse of ArrayBuffer on concurrent file requests or hits to THREE.Cache. Replace use of THREE.FileLoader with fetch API (#94, #112) (fix #93) (@mrxz, @asundqui)
Visual quality improvements and SOGS support
- Add support for SOGS compression format 3D Gaussian Splatting (#73) (@asundqui)
- Change splat shapes by using any RGBA texture to compute the Gaussian falloff (#79) (@asundqui)
- Use RenderTarget properties to reduce manual render state tracking (#80) (@mrxz)
- Visual quality, Fix .ksplat decoding (fix #66) (@asundqui)
- Visual quality, Fix Spherical Harmonics not included in SPZ transcoding (fix #66) (#83) (@asundqui)
- Visual quality, Fix incorrect calculation of renderer size. Especially improves rendering in high DPI displays (#71) (@mrxz)
- Fix support of compressed .ply files exported from SuperSplat. Newer versions include min/max_r/g/b properties in the header that were not parsed (#82) (@asundqui)
- Ability to render depth and normal values (#58) (@asundqui)
- New parameters to change renderer focal distance and aperture angle (#59) (@asundqui)
- GLSL code injection example (#56)
- WebXR example (#50)
- Option to disable SparkControls camera roll for touch controls (fix #46) (#60) (@asundqui)
- Fix sign in SH2 coefficient signs improving visual quality (#64)
Fix types export in npm package.
It removes unnecessary dependencies from npm package.
- Fix compressed .ply files by gsplat not loading (#34) (@bolopenguin, @asundqui)
- Fix image quality rendering with mostly transparent splats (#36) (@hybridherbst, @@asundqui)
- Fix SplatMesh not rendering when it's a child of an Object3D (#38) (@dmarcos)
First release