Repository navigation
Releases: WilliamLiu-1997/Gaussian-Splat-Lite
Releases · WilliamLiu-1997/Gaussian-Splat-Lite
Release list
v1.4.3
Changelog
Added
- Added
--within-dist <x,y,z,radius>togsl-build-lodto 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(default4) andlodDistanceShrink(default0.75).
Removed
- Removed raycast hit
sourceIndex,Splats.getSourceIndex(), andRadStreamScheduler.getGlobalIndex(). Usehit.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
firstRenderablewhen 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
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
Changelog
Added
- Added experimental
NeuralDenoiseXRfor per-eye neural denoising in WebXR withWebGLRendererandWebGPURenderer, 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. UseNeuralDenoiseNodewithWebGPURenderer,NeuralDenoisePasswithWebGLRenderer, orNeuralDenoiseXRfor WebXR. See Neural denoising.
Fixed
- On
WebGPURenderer's WebGL2 backend, the neural denoiser'sdepthTexturestopped updating after a resize.
v1.4.0
Changelog
Added
- Added
gsl-build-lodto 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
Changelog
Added
- Added SH4 decoding for PLY and SPZ and rendering on WebGL, WebGPU, and the WebGL2 fallback.
Splats.getSplat()andpostDecodenow 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
SplatExtrafieldssh1,sh2,sh3a,sh3b,sh4a, andsh4btoshBlock0–shBlock5, respectively. Update direct field access to use the new names. SplatMesh.maxShnow defaults to4, so SH4 models render their full view-dependent color. Set it to3to limit rendering to the previous maximum degree.- SH4 SPZ models now use more memory because their full view-dependent color data is retained.
SplatMesh.maxShonly limits rendering detail and does not reduce memory use.
v1.3.1
Changelog
Added
- Added runtime-adjustable
splatBudgetTolerancetoRadStreamScheduler. The default0.1allows each selection to exceedsplatBudgetby up to 10%; use0for a strict selection limit. Fades can temporarily show both old and new detail; also setfadeDurationMs: 0to keep transitions within the budget. See RAD streaming. - Added
maxResidentCpuBytes(default 2 GiB) andmaxResidentGpuBytes(default 1 GiB) toRadStreamScheduler. Detail respects both cache budgets, releasing unused detail early when needed. These are streaming cache limits, not total application memory limits. - Added
splatBudgetModetoSogStreamScheduler:"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(default100, for"limit"mode) andlodMultiplier(default2, for both modes). Changes take effect without reloading. See SOG streaming. - Added
residentCpuBytes,residentGpuBytes, andloadProgressto RAD and SOG streaming stats. Memory figures estimate retained streaming data;residentBytesremains 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
maxConcurrentLoadsregardless 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
Changelog
Added
- Added experimental
NeuralDenoiseNodeforWebGPURendererandNeuralDenoisePassforWebGLRenderer. 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.minRaycastOpacityfrom0.15to0.1, allowing picking in more transparent areas. Set it to0.15to 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-nodeorvite-plugin-dts. - Applied Three.js r186 compatibility fixes automatically when using
GaussianSplatRenderer,TAANode, orNeuralDenoiseNode, 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
TAANodeon 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
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
TAAPassandTAANode. Create the Three.js renderer withstencil: trueand the scene's stencil masks apply as they do without TAA, including the stencil settings on your Splat renderer'smaterial; before, they were ignored.WebGPURendereron WebGPU needs Three.js r187 or later for this; on r186, leavestenciloff there when usingTAANode.
Changed
TAANodeavoids redundant screen-texture transforms and repeated depth sampling while retaining its single-pass temporal filter.- The default
minAlphais now0.5 / 255instead of1 / 255, so faint Splats and the outer edge of others reach a little further. SetminAlpha: 1 / 255to keep the previous look. - A Splat that
maxStdDevtrims while it is still more opaque thanminAlphanow fades tominAlphaat its edge instead of ending in a visible step. This includes the wide Splats of LOD data. Splats are not drawn any larger, so lowermaxStdDevvalues keep their speed and look smoother. Edges are slightly more transparent than before, most visibly at lowmaxStdDev; Splats that are not trimmed look the same. minPixelRadiusnow 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
TAANodewithlogarithmicDepthBuffer, where the image blurred and ghosted whenever the camera moved.TAAPasswas not affected.
v1.2.1
Changelog
Added
- Added
encodeLineartoGaussianSplatRendererto choose how model colors are converted before blending:trueconverts them to linear,falsekeeps their sRGB values. Left unset, the conversion is automatic as before. - Added
SplatCapturefor 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 methodsGaussianSplatRendererhad in 1.1.8, under the same names. See SplatCapture.
Changed
- The default
minAlphais now1 / 255instead of0.5 / 255. SetminAlpha: 0.5 / 255to keep the previous look. TAAPassis now used throughEffectComposerwith a final Three.jsOutputPass; callingtaa.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.OutputPassapplies 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 afterTAAPassno longer need it. - Removed the
SplatAccumulatorclass and theSplatMappingtype from the package exports.GaussianSplatRenderermanages 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
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 noOutputPass; setaccumulateInOutputSpace = falsefor linear effects such as Bloom. Scene depth is exposed for depth effects. ExportedTAANode(scene, camera)provides the same camera/depth reprojection in TSL for native WebGPU and WebGL2 fallback, accumulating in linear space forRenderPipeline, without a velocity attachment. - Added
stochasticSampleandautoAdvanceStochasticSampleto 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–float64type names, extra elements before the vertex data, and Gaussian files that store their base color asred/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
onChangeto wake on-demand render loops. Invalid data, out-of-memory errors, and other HTTP errors are reported toonErrorand 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
stochasticto switch modes, and smooth its noise with the library'sTAANodeon WebGPURenderer or the library'sTAAPasson 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
StochasticTAAPasssupplied a temporal sample. SetautoAdvanceStochasticSample = falseto keep it fixed. - Changing
stochastictakes effect at the next update boundary on all backends. WebGL and WebGL fallback also wait for the matching accumulator and sort;stochasticActivereports which mode is drawing. - While stochastic rendering is active, Splats draw in the opaque list with depth testing and writing; otherwise
transparent,depthTest, anddepthWriteapply as set. Stochastic rendering no longer keeps sorted frames in the opaque list or setsrenderOrdertoNumber.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
SplatMeshin the frame it moves instead of after the next sort, withautoUpdateandpreUpdateenabled 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
stochasticSortnow 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. RadStreamSchedulerandSogStreamSchedulerselect detail for cameras registered withsetCamera(), andupdate()takes no arguments; it throws if no camera is registered. Set RAD resolution withsetResolution()orsetResolutionFromRenderer()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,
SogStreamSchedulerreports the error and disposes itself; create a new one to try again. - SDF edit shapes now follow their own
scale.SPHEREand other shapes scale as a whole;BOX,ELLIPSOID, andCAPSULEkeep usingscalefor their size without scalingradius. 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/webgpuandthree/tslfrom your installedthreeinstead 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
TAAPasson WebGLRenderer orTAANodeon WebGPURenderer. The TAA/Resolve and Force Splat depth controls were removed.
Fixed
- Errors from automatic
GaussianSplatRendererupdates 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.
TAAPassnow keeps custom projection matrices andsetViewOffset()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, andonLoadnow follow reinitializedSplats, and disposing a mesh resetsnumSplats.postDecodeattributes now match RAD Splats in their original file order, and attribute data is read when the load starts. Comparisons,dot, andcrossreject mismatched types, anddefine()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
.radheader 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/blueare 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,
RadStreamSchedulerreports 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.enabledoff, such asReflector, 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
ArrayCamerarendering is no longer supported:update()andshrinkResources()throw, and other draws skip Splats and log an error. Use separate cameras for other views. - Removed
autoStochastic,renderDepth,depthMesh, and the exportedStochasticResolvePassandStochasticTAAPass. Usestochasticto switch modes,TAAPassfor WebGLRenderer, andTAANodefor WebGPURenderer. Without the depth companion draw, sorted Splats write depth only withdepthWrite. - Removed offscreen captures and environment maps: the
targetoption, thetarget...