Skip to content

Releases: WilliamLiu-1997/Gaussian-Splat-Lite

v1.4.3

Choose a tag to compare

@github-actions github-actions released this 25 Oct 09:22

Changelog

Added

  • Added --within-dist <x,y,z,radius> to gsl-build-lod to keep splat centers inside or on a sphere in input coordinates before building LOD. See Building RAD files.

Changed

  • Streamed SOG keeps surrounding regions in its detail budget, with less detail behind the camera and corrected distances for oversized regions. Added runtime-adjustable lodBehindPenalty (default 4) and lodDistanceShrink (default 0.75).

Removed

  • Removed raycast hit sourceIndex, Splats.getSourceIndex(), and RadStreamScheduler.getGlobalIndex(). Use hit.object.splats.getSplat(hit.index) to read the current hit; streamed indices can change when the visible detail changes.

Fixed

  • Streamed SOG waits for initial detail selection before rejecting firstRenderable, including when an empty environment finishes last.
  • Streamed SOG rejects firstRenderable when all required loads fail permanently, even while the camera keeps moving.
  • Streamed SOG retains displayed coverage when detail selection fails, stopping further loading while existing fades finish.

v1.4.2

Choose a tag to compare

@github-actions github-actions released this 24 Oct 07:31

Changelog

Changed

  • Stochastic rendering now uses one triangle per Splat instead of a quad, reducing vertex and triangle counts on WebGL, WebGPU, and the WebGL2 fallback.
  • Neural denoising's "quality" mode no longer develops a worm-like pattern on fine detail during slow camera movement; detail there is slightly softer.

v1.4.1

Choose a tag to compare

@github-actions github-actions released this 23 Oct 15:34

Changelog

Added

  • Added experimental NeuralDenoiseXR for per-eye neural denoising in WebXR with WebGLRenderer and WebGPURenderer, including its WebGL2 fallback. See Neural denoising.

Changed

  • Neural denoising reduces noise and flicker on moving objects, including moving Splats. Both modes also use less GPU time while the camera moves. During camera movement, "quality" adds smoothing with slightly softer detail, while "performance" preserves more fine detail at slow speeds.

Removed

  • Removed TAANode, TAAPass, and the viewer's TAA option. Use NeuralDenoiseNode with WebGPURenderer, NeuralDenoisePass with WebGLRenderer, or NeuralDenoiseXR for WebXR. See Neural denoising.

Fixed

  • On WebGPURenderer's WebGL2 backend, the neural denoiser's depthTexture stopped updating after a resize.

v1.4.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 11:51

Changelog

Added

  • Added gsl-build-lod to convert PLY and SPZ models into streamable RAD files with LOD, without compilation. Supports batch conversion, split files, up to SH3, and configurable memory and temporary storage. See Building RAD files.

Changed

  • RAD files and gzip-compressed SPZ files (v1–v3) decode about 10% faster.

Fixed

  • Fixed incorrect orientation and unstable widths of thin Splats on WebGL, WebGPU, and the WebGL2 fallback.

v1.3.2

Choose a tag to compare

@github-actions github-actions released this 18 Oct 01:15

Changelog

Added

  • Added SH4 decoding for PLY and SPZ and rendering on WebGL, WebGPU, and the WebGL2 fallback. Splats.getSplat() and postDecode now expose all 24 view-dependent RGB coefficients.
  • Added a Max SH control to the viewer, from SH0 to SH4. Changes apply immediately to regular and streamed models; the default uses all available coefficients.

Changed

  • Renamed the SplatExtra fields sh1, sh2, sh3a, sh3b, sh4a, and sh4b to shBlock0–shBlock5, respectively. Update direct field access to use the new names.
  • SplatMesh.maxSh now defaults to 4, so SH4 models render their full view-dependent color. Set it to 3 to limit rendering to the previous maximum degree.
  • SH4 SPZ models now use more memory because their full view-dependent color data is retained. SplatMesh.maxSh only limits rendering detail and does not reduce memory use.

v1.3.1

Choose a tag to compare

@github-actions github-actions released this 17 Oct 02:41

Changelog

Added

  • Added runtime-adjustable splatBudgetTolerance to RadStreamScheduler. The default 0.1 allows each selection to exceed splatBudget by up to 10%; use 0 for a strict selection limit. Fades can temporarily show both old and new detail; also set fadeDurationMs: 0 to keep transitions within the budget. See RAD streaming.
  • Added maxResidentCpuBytes (default 2 GiB) and maxResidentGpuBytes (default 1 GiB) to RadStreamScheduler. Detail respects both cache budgets, releasing unused detail early when needed. These are streaming cache limits, not total application memory limits.
  • Added splatBudgetMode to SogStreamScheduler: "target" (the default) adjusts detail to fill the budget, while "limit" uses the configured distance bands and only reduces detail when they exceed the budget.
  • Added runtime-adjustable lodBaseDistance (default 100, for "limit" mode) and lodMultiplier (default 2, for both modes). Changes take effect without reloading. See SOG streaming.
  • Added residentCpuBytes, residentGpuBytes, and loadProgress to RAD and SOG streaming stats. Memory figures estimate retained streaming data; residentBytes remains their sum. Loading progress tracks the current view and can change as the camera moves.
  • Added SOG budget mode and LOD distance controls to the viewer, along with current-view loading progress and separate CPU/GPU cache estimates for streamed models.

Changed

  • Reduced repeating noise patterns in stochastic rendering across WebGL and WebGPU.
  • Reworked RAD detail selection to reduce selection overhead, including with splatBudgetTolerance: 0. The selected detail may differ from previous versions within the configured budget and tolerance.
  • RAD detail now uses the same threshold when refining and coarsening.
  • RAD streaming can select the next view while preparing a display update, and upload decoded data while its detail information is still being prepared. Loading concurrency follows maxConcurrentLoads regardless of page size.
  • Reduced memory use and upload volume for RAD detail fades, and reduced work when preparing selections and copying indexed Splat centers.
  • Streamed SOG now selects detail directly from distance bands. All populated LOD levels remain available, including levels with equal Splat counts; missing intermediate levels resolve to the next finer available level.

Fixed

  • The viewer now waits for streamed SOG content to become renderable before dismissing the loading screen, and shows RAD and SOG streaming errors as notifications.

Removed

  • Removed the pending-data byte limits from RAD and SOG streaming. Downloads and decoding remain limited by maxConcurrentLoads, but large detail updates may use more temporary memory.

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 11:35

Changelog

Added

  • Added experimental NeuralDenoiseNode for WebGPURenderer and NeuralDenoisePass for WebGLRenderer. They smooth stochastic rendering and help reduce trails behind moving objects. See Neural denoising for setup and requirements.
  • Added "performance" and "quality" neural denoising modes. Quality is the library default; Performance uses less GPU time and memory.
  • Added optional 4× MSAA to TAA and neural denoising for less noise during motion, at higher GPU and memory cost. MSAA is disabled by default.
  • Added denoiser, neural mode, and MSAA controls to the viewer. When stochastic rendering is enabled, the viewer defaults to neural denoising in Performance mode.

Changed

  • Lowered the default SplatMesh.minRaycastOpacity from 0.15 to 0.1, allowing picking in more transparent areas. Set it to 0.15 to retain the previous threshold.
  • Improved memory reclamation with shrinkResources(), including SDF edits.
  • Migrated the library, tests, and Vite configuration from TypeScript to JavaScript, with adjacent TypeScript declarations preserving the public API types.
  • Reworked declaration builds for ESM and CommonJS and added JavaScript syntax checks. Builds no longer depend on ts-node or vite-plugin-dts.
  • Applied Three.js r186 compatibility fixes automatically when using GaussianSplatRenderer, TAANode, or NeuralDenoiseNode, with no changes needed to the installed Three.js source.

Fixed

  • Fixed partly transparent Splats appearing too bright with four-sample neural denoising on WebGLRenderer.
  • Restored private declaration boundaries after the JavaScript migration and added checks comparing module value exports with their declarations.
  • Preserved custom material settings when switching between sorted and stochastic rendering.
  • Fixed depth-stencil texture sampling in TAANode on native WebGPU with Three.js r186.
  • Fixed float depth and depth-stencil attachments on the r186 WebGL2 fallback, including multisampled capture targets, and kept default render-target depth in float format when using reversed depth.
  • Fixed dynamic TSL texture bindings that temporarily share an empty texture, so Splat data, indices, and spherical harmonics keep separate bindings as models load or shaders rebuild.
  • Fixed single-layer array render-target attachments on the r186 WebGL2 fallback, removing the need to allocate an extra accumulator layer. Also fixed draw-buffer state handling for offscreen and XR framebuffers.
  • Released GPU buffers when their buffer attributes are disposed on Three.js r186, including buffers replaced during resizing.
  • Updated native WebGPU capture readback to consume tightly packed rows. The r186 compatibility fix removes GPU row padding before returning pixels and releases the temporary readback buffer even when reading fails.

v1.2.2

Choose a tag to compare

@github-actions github-actions released this 07 Oct 06:27

Changelog

Added

  • Added a Blend buffer option to the viewer, set to Half float by default. It removes the overlapping rings that 8-bit blending leaves in faint gradients. Very bright Splats behind others can look slightly brighter than before; choose 8-bit to return to the previous image.
  • Added stencil masking to TAAPass and TAANode. Create the Three.js renderer with stencil: true and the scene's stencil masks apply as they do without TAA, including the stencil settings on your Splat renderer's material; before, they were ignored. WebGPURenderer on WebGPU needs Three.js r187 or later for this; on r186, leave stencil off there when using TAANode.

Changed

  • TAANode avoids redundant screen-texture transforms and repeated depth sampling while retaining its single-pass temporal filter.
  • The default minAlpha is now 0.5 / 255 instead of 1 / 255, so faint Splats and the outer edge of others reach a little further. Set minAlpha: 1 / 255 to keep the previous look.
  • A Splat that maxStdDev trims while it is still more opaque than minAlpha now fades to minAlpha at its edge instead of ending in a visible step. This includes the wide Splats of LOD data. Splats are not drawn any larger, so lower maxStdDev values keep their speed and look smoother. Edges are slightly more transparent than before, most visibly at low maxStdDev; Splats that are not trimmed look the same.
  • minPixelRadius now measures the wide Splats of LOD data by their visible size, as it already did for other Splats, so the smallest ones are skipped slightly earlier.

Fixed

  • Fixed TAANode with logarithmicDepthBuffer, where the image blurred and ghosted whenever the camera moved. TAAPass was not affected.

v1.2.1

Choose a tag to compare

@github-actions github-actions released this 05 Oct 13:36

Changelog

Added

  • Added encodeLinear to GaussianSplatRenderer to choose how model colors are converted before blending: true converts them to linear, false keeps their sRGB values. Left unset, the conversion is automatic as before.
  • Added SplatCapture for rendering Splat scenes offscreen: render targets with optional supersampling and double buffering, RGBA pixel readback, cube maps, and environment maps for reflections. It works on WebGLRenderer and on WebGPURenderer with WebGPU or its WebGL2 fallback. Your render loop can keep running while a capture is in progress, and captures use your Splat renderer's quality settings. This brings back the capture methods GaussianSplatRenderer had in 1.1.8, under the same names. See SplatCapture.

Changed

  • The default minAlpha is now 1 / 255 instead of 0.5 / 255. Set minAlpha: 0.5 / 255 to keep the previous look.
  • TAAPass is now used through EffectComposer with a final Three.js OutputPass; calling taa.render(renderer) on its own is no longer supported. Bloom and other effects go between the two passes without extra settings. Splat colors still match direct canvas rendering. OutputPass applies the renderer's tone mapping to the whole image, Splats included. See TAAPass and TAANode.

Removed

  • Removed maxPixelRadius. A Splat's radius on screen is now limited automatically to the short side of the viewport.
  • Removed TAAPass.accumulateInOutputSpace. Delete it from your code; effects after TAAPass no longer need it.
  • Removed the SplatAccumulator class and the SplatMapping type from the package exports. GaussianSplatRenderer manages the combined scene data itself. To read a model's Splats, use Splats.

Fixed

  • Fixed incorrect Splat colors that could appear on WebGPURenderer as models loaded into a previously empty scene.

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 16:32

Changelog

Added

  • Exported TAAPass(scene, camera), temporal anti-aliasing for WebGLRenderer that renders the scene itself and needs no velocity texture. Its result matches direct canvas colors and needs no OutputPass; set accumulateInOutputSpace = false for linear effects such as Bloom. Scene depth is exposed for depth effects. Exported TAANode(scene, camera) provides the same camera/depth reprojection in TSL for native WebGPU and WebGL2 fallback, accumulating in linear space for RenderPipeline, without a velocity attachment.
  • Added stochasticSample and autoAdvanceStochasticSample to control the stochastic noise pattern, for example in a custom temporal anti-aliasing integration.
  • Added SplatLoader.abort(), which cancels every load the loader has in progress.
  • PLY loading now accepts headers with Windows line endings, int8–float64 type names, extra elements before the vertex data, and Gaussian files that store their base color as red/green/blue.
  • RAD and SOG streaming retry temporary download failures and lost decoder workers automatically, waiting up to 30 seconds between attempts. Retryable HTTP errors are 408, 425, 429, and 5xx. Each retry calls onChange to wake on-demand render loops. Invalid data, out-of-memory errors, and other HTTP errors are reported to onError and not retried.

Changed

  • SPZ v4 decoding now accepts ZSTD windows up to 128 MiB instead of 100 MiB. Building the Rust/WASM decoder now requires Rust 1.87 or newer.
  • Stochastic coverage now uses a 32-frame spatiotemporal blue-noise sequence optimized for exponential history accumulation, with stable per-Splat offsets on WebGL, WebGPU, and WebGL fallback. This reduces temporal sampling error without changing the TAA integration or its frame budget.
  • Stochastic rendering is now manual: set stochastic to switch modes, and smooth its noise with the library's TAANode on WebGPURenderer or the library's TAAPass on WebGLRenderer. See Stochastic rendering.
  • The stochastic noise pattern now changes on every render so temporal anti-aliasing keeps converging while the view is still. Previously it stayed fixed unless StochasticTAAPass supplied a temporal sample. Set autoAdvanceStochasticSample = false to keep it fixed.
  • Changing stochastic takes effect at the next update boundary on all backends. WebGL and WebGL fallback also wait for the matching accumulator and sort; stochasticActive reports which mode is drawing.
  • While stochastic rendering is active, Splats draw in the opaque list with depth testing and writing; otherwise transparent, depthTest, and depthWrite apply as set. Stochastic rendering no longer keeps sorted frames in the opaque list or sets renderOrder to Number.MAX_SAFE_INTEGER.
  • Sorted rendering no longer stores stochastic seeds: WebGL accumulators omit the seed layer, and native WebGPU allocates its seed buffer only for stochastic draws. Sorted and stochastic draws compile separate shaders without mode branches on all backends.
  • With unsorted stochastic rendering, shrinkResources() releases the sort worker and ordering instead of sorting. Enabling sorting again rebuilds them.
  • WebGL and WebGL fallback show a moved SplatMesh in the frame it moves instead of after the next sort, with autoUpdate and preUpdate enabled outside WebXR.
  • Native WebGPU reuses projection and sorting results while only TAA's sub-pixel jitter changes.
  • Native WebGPU sorts 8 bits per GPU radix pass instead of 4: three passes for fastSort (the default), four without it, and two for stochastic front-to-back ordering. Sorting takes about a third less GPU time and produces the same order.
  • WebXR eyes now share generation, culling, and one sort order from the head's mean pose, each with its exact projection. Native WebGPU projects both eyes in one compute pass instead of projecting and sorting each eye, so stochasticSort now also applies in WebXR; its two-eye kernels compile when a session starts, and Splats stay hidden until they are ready. Splats on either eye's layers are visible in both eyes.
  • RadStreamScheduler and SogStreamScheduler select detail for cameras registered with setCamera(), and update() takes no arguments; it throws if no camera is registered. Set RAD resolution with setResolution() or setResolutionFromRenderer() in CSS pixels, without the device pixel ratio, so high-DPI displays no longer load extra detail. RAD no longer defaults to 1024 × 1024 and throws for a non-XR camera without a resolution. Several cameras share one selection at the greatest detail any of them needs.
  • RAD and SOG streaming select WebXR detail for each eye of a registered renderer.xr.getCamera(). Until the headset reports its first eye poses, the current detail and downloads are kept.
  • If SOG detail selection fails, SogStreamScheduler reports the error and disposes itself; create a new one to try again.
  • SDF edit shapes now follow their own scale. SPHERE and other shapes scale as a whole; BOX, ELLIPSOID, and CAPSULE keep using scale for their size without scaling radius. A shape scaled to zero on any axis now has no effect instead of affecting the whole model.
  • Models with more than about 4 million Splats allocate much less unused texture memory.
  • Memory used for native WebGPU two-eye rendering is released when a WebXR session ends.
  • Turning the camera without moving it no longer regenerates Splat data.
  • The CommonJS build now uses three/webgpu and three/tsl from your installed three instead of bundling its own copy. Node.js 20.19+ or 22.12+ is now required.
  • The published worker no longer includes source maps, reducing package size.
  • The viewer's Stochastic control is now On/Off and smooths noise with TAAPass on WebGLRenderer or TAANode on WebGPURenderer. The TAA/Resolve and Force Splat depth controls were removed.

Fixed

  • Errors from automatic GaussianSplatRenderer updates are logged once instead of becoming unhandled promise rejections, and a draw whose preparation fails is skipped instead of interrupting rendering.
  • Mirrored models (negative scale) now show the correct Splat orientation and view-dependent color.
  • Splats drawn into a viewport smaller than the canvas or render target, for example with setViewport(), now have the correct size.
  • On WebGLRenderer, orthographic cameras no longer drop Splats behind the camera's position.
  • TAAPass now keeps custom projection matrices and setViewOffset() views, reprojects correctly with scaled camera rigs, and renders its first frame correctly with a reversed depth buffer.
  • Splats.getSplat() returns new objects on each call; previously, successive calls overwrote the same objects.
  • SplatMesh.initialized, isInitialized, and onLoad now follow reinitialized Splats, and disposing a mesh resets numSplats.
  • postDecode attributes now match RAD Splats in their original file order, and attribute data is read when the load starts. Comparisons, dot, and cross reject mismatched types, and define() reports invalid expressions immediately.
  • Splats with an invalid (NaN) opacity now load as fully transparent.
  • In browsers without native float16 support, half-precision values are now rounded to the nearest value instead of truncated.
  • Picking no longer misses very thin Splats.
  • Split RAD datasets now load when their .rad header is served with HTTP compression.
  • PLY files are rejected early when they are shorter than their header declares or contain duplicate elements or properties. Gaussian PLY files that also have red/green/blue are no longer loaded as point clouds.
  • SPZ files with legacy extensions load without keeping the extensions in memory, and their integrity is still checked.
  • Decode workers that crash or run out of memory are discarded so later loads can use fresh workers, and worker errors now name the file that failed.
  • Importing the library no longer reports an unhandled promise rejection when WebAssembly fails to initialize.
  • If RAD LOD selection or preparation fails, or its LOD worker is lost during page loading, RadStreamScheduler reports the error and keeps its current detail but stops refining.
  • A failed SOG refinement keeps already visible regions. Permanent failures before any region is ready reject firstRenderable.
  • Updated TSL texture bindings before sampling state so both Three.js r186 and r187 preserve render-target Y orientation without calling removed texture update methods.
  • Preserved WebXR camera rig transforms when reading eye poses for rendering and RAD/SOG detail selection.
  • SOG detail selection now includes a scaled camera rig's scale, like rendering and RAD. It previously measured view distances and culled without it.
  • Draws during a WebXR session that do not use the WebXR camera now use their own camera and viewport instead of the headset's. Examples are render targets drawn with renderer.xr.enabled off, such as Reflector, and WebGPURenderer render targets other than its output.
  • On native WebGPU, Splats with equal sort keys now keep their source order instead of an order set by GPU scheduling. Projecting the same view again draws an identical frame, and tied Splats no longer swap places from frame to frame while the camera moves. This applies to sorted rendering and stochastic front-to-back ordering.

Removed

  • Non-XR ArrayCamera rendering is no longer supported: update() and shrinkResources() throw, and other draws skip Splats and log an error. Use separate cameras for other views.
  • Removed autoStochastic, renderDepth, depthMesh, and the exported StochasticResolvePass and StochasticTAAPass. Use stochastic to switch modes, TAAPass for WebGLRenderer, and TAANode for WebGPURenderer. Without the depth companion draw, sorted Splats write depth only with depthWrite.
  • Removed offscreen captures and environment maps: the target option, the target...
Read more