v2.15.0

playcanvas/enginev2.15.0Jan 12, 2026by mvaligursky

AI Summary

This major release focuses on WebGPU advancements, including GPU-based sorting for Gaussian Splatting and support for omni/spot shadows via the Lightmapper. It also standardizes many KHR material extensions and introduces new texture formats.

Key Highlights

  • GPU-based radix sort implementation for unified GSplat
  • WebGPU support for omni/spot shadows baking using Lightmapper
  • Extensive KHR material standard support (emissive strength, specular, unlit, IOR, etc.)
  • New texture formats: RG32F, RGB9E5, RG8S, RGBA8S, RGB10A2, RGB10A2U
  • Texture.read() now exposed as a public API

New Features

  • GPU-based sorting for unified GSplat (optional on WebGPU)
  • WebGPU compute shader radix sort
  • Texture.read() public API
  • KHR_materials_* extensions export support
  • New texture formats support
  • RenderPassShaderQuad viewport/scissor support

Full Release Notes

## New Features
* Unified GSplat support for rendering to shadow map + Example by @mvaligursky in https://github.com/playcanvas/engine/pull/8228
* Updated `GsplatShaderEffect` script to use simpler material API by @mvaligursky in https://github.com/playcanvas/engine/pull/8229
* Improved `splatBudget` behavior to allow both increase and decrease LOD by @mvaligursky in https://github.com/playcanvas/engine/pull/8230
* Moved the `splatBudget` API to gsplat component by @mvaligursky in https://github.com/playcanvas/engine/pull/8231
* Updated `Ministats` with additional timings by @mvaligursky in https://github.com/playcanvas/engine/pull/8241
* Workbuffer for gsplat uniform no longer stores covariance, but directly the components by @mvaligursky in https://github.com/playcanvas/engine/pull/8244
* Removed workaround related to workbuffer storing covariants on android by @mvaligursky in https://github.com/playcanvas/engine/pull/8245
* Add `gsplatModifyVS` shader customization chunk for gaussian splats by @mvaligursky in https://github.com/playcanvas/engine/pull/8246
* Update GitHub Artifact Actions (major) by @renovate[bot] in https://github.com/playcanvas/engine/pull/8247
* Add simple render pipeline cache for mipmap renderer (WebGPU) by @mvaligursky in https://github.com/playcanvas/engine/pull/8253
* Add viewport / scissor support to `RenderPassShaderQuad` by @mvaligursky in https://github.com/playcanvas/engine/pull/8254
* Adds a GPU-based radix sort implementation using fragment shaders with mipmap-based prefix sums by @mvaligursky in https://github.com/playcanvas/engine/pull/8255
* Adds support for specifying a custom entry point function name when creating compute shaders by @mvaligursky in https://github.com/playcanvas/engine/pull/8258
* Increase quad buffer size for ministats to allow more stats to render by @mvaligursky in https://github.com/playcanvas/engine/pull/8259
* NPM Publish by @kpal81xd in https://github.com/playcanvas/engine/pull/8261
* Add `KHR_materials_emissive_strength` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8268
* Add `KHR_materials_specular` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8269
* Add `KHR_materials_unlit` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8270
* Add `KHR_materials_ior` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8272
* Add `KHR_materials_dispersion` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8274
* Defines map can be specified when creating compute shader by @mvaligursky in https://github.com/playcanvas/engine/pull/8273
* Add `KHR_materials_clearcoat` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8275
* Add `KHR_materials_transmission` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8277
* Add `KHR_materials_volume` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8278
* Add WebGPU compute shader radix sort + changes / fixes to render pass based radix sort by @mvaligursky in https://github.com/playcanvas/engine/pull/8276
* Add `KHR_materials_sheen` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8279
* Add compute pipeline creation caching for WebGPU by @mvaligursky in https://github.com/playcanvas/engine/pull/8281
* Use Set instead of array for buffer tracking by @mvaligursky in https://github.com/playcanvas/engine/pull/8283
* Add `KHR_materials_iridescence` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8280
* Add `KHR_materials_anisotropy` export support by @willeastcott in https://github.com/playcanvas/engine/pull/8284
* Improve docs for `get/setFromEulerAngles` by @willeastcott in https://github.com/playcanvas/engine/pull/8289
* Clustered lighting integer arithmetic optimization by @mvaligursky in https://github.com/playcanvas/engine/pull/8303
* Make `Texture.read()` a public API by @mvaligursky in https://github.com/playcanvas/engine/pull/8306
* GPU-based sorting using compute shaders for unified gsplat (optional) on WebGPU by @mvaligursky in https://github.com/playcanvas/engine/pull/8310
* Clean up camera shader parameter setup by @mvaligursky in https://github.com/playcanvas/engine/pull/8314
* Add WebGPU texture-format-tier1, texture-format-tier2, and primitive-index features by @mvaligursky in https://github.com/playcanvas/engine/pull/8316
* Add `TextureView` for mip level and array layer access in compute shaders by @mvaligursky in https://github.com/playcanvas/engine/pull/8308
* Optimize texture tracking with Set-based dirty texture management by @mvaligursky in https://github.com/playcanvas/engine/pull/8309
* Adds a configurable color property to the vignette post-effect by @mvaligursky in https://github.com/playcanvas/engine/pull/8318
* Add new texture formats: `RG32F`, `RGB9E5`, `RG8S`, `RGBA8S`, `RGB10A2`, `RGB10A2U`  by @mvaligursky in https://github.com/playcanvas/engine/pull/8319
* Added node name to batch insertion/removal assert message by @yaustar in https://github.com/playcanvas/engine/pull/8322
* Refactor Annotation System with AnnotationManager by @willeastcott in https://github.com/playcanvas/engine/pull/8323
* Updates the `LICENSE` copyright year to 2026 by @mvaligursky in https://github.com/playcanvas/engine/pull/8333
* Allow changing unified property without disabling component by @mvaligursky in https://github.com/playcanvas/engine/pull/8334
* Add indirect compute dispatch support for WebGPU by @mvaligursky in https://github.com/playcanvas/engine/pull/8332
* WebGPU now supports omni/spot shadows baking using Lightmapper by @mvaligursky in https://github.com/playcanvas/engine/pull/8335
* Improve JSDoc for the core layer by @willeastcott in https://github.com/playcanvas/engine/pull/8358
* Add 'worker' to reserved script names by @mvaligursky in https://github.com/playcanvas/engine/pull/8368

## Fixes
* [FIX] Specify anonymous cross origin for gsplat assets to avoid security issues on iOS by @mvaligursky in https://github.com/playcanvas/engine/pull/8235
* Fix uninitialized `SplatCenter` members in GLSL gsplat shader by @mvaligursky in https://github.com/playcanvas/engine/pull/8237
* Internal cursor file is ignored by git by @mvaligursky in https://github.com/playcanvas/engine/pull/8242
* [FIX] Fix metalness and roughness handling in `UsdzExporter` by @willeastcott in https://github.com/playcanvas/engine/pull/8248
* [FIX] Return correct typed array from texture.read() on WebGPU platform by @mvaligursky in https://github.com/playcanvas/engine/pull/8251
* [FIX] Notify existing element descendants when a screen is added by @willeastcott in https://github.com/playcanvas/engine/pull/8252
* [FIX] Fix particle emission rate when looping by @willeastcott in https://github.com/playcanvas/engine/pull/8263
* [FIX] Convert sRGB colors to linear when writing glTF by @willeastcott in https://github.com/playcanvas/engine/pull/8267
* Fix SOG SH decompression by @slimbuck in https://github.com/playcanvas/engine/pull/8271
* ScopeSpace.removeValue not clearing destroyed textures from scope by @mvaligursky in https://github.com/playcanvas/engine/pull/8282
* [FIX] Fix glTF export for `KHR_materials_pbrSpecularGlossiness` materials by @willeastcott in https://github.com/playcanvas/engine/pull/8285
* [FIX] Fix black specular map still showing reflections by @willeastcott in https://github.com/playcanvas/engine/pull/8287
* [FIX] Fix `ElementComponent` `mousemove` event firing outside element by @willeastcott in https://github.com/playcanvas/engine/pull/8288
* [FIX] Fix `ElementComponent` not rendering when entity already in hierarchy by @willeastcott in https://github.com/playcanvas/engine/pull/8290
* Tighten up typing for `RigidBodyComponent#type` by @willeastcott in https://github.com/playcanvas/engine/pull/8292
* [FIX] Fix `KHR_materials_specular` incorrectly affecting metals and diffuse by @willeastcott in https://github.com/playcanvas/engine/pull/8293
* [FIX] Add Dedicated Isotropic GGX Specular Implementation by @willeastcott in https://github.com/playcanvas/engine/pull/8299
* [FIX] Enforce WGSL syntax highlighting in all WGSL chunks by @willeastcott in https://github.com/playcanvas/engine/pull/8300
* [FIX] Fix clustered lighting artifacts caused by UV precision by @willeastcott in https://github.com/playcanvas/engine/pull/8302
* [FIX] Fix screen space particles when CPU simulation is used by @willeastcott in https://github.com/playcanvas/engine/pull/8301
* [FIX] Add setter for `Script.scriptName` for TypeScript compatibility by @willeastcott in https://github.com/playcanvas/engine/pull/8291
* [FIX] Fix orthographic camera loading from glTF by @willeastcott in https://github.com/playcanvas/engine/pull/8304
* [FIX] Fix glTF spot light default cone angle by @willeastcott in https://github.com/playcanvas/engine/pull/8305
* [FIX] Fix glTF spot light luminance calculation by @willeastcott in https://github.com/playcanvas/engine/pull/8307
* Fix IOR/refractionIndex being ignored in materials by @mvaligursky in https://github.com/playcanvas/engine/pull/8311
* Rename `GSplatComponentSystem#getGSplatMaterial` to getMaterial by @mvaligursky in https://github.com/playcanvas/engine/pull/8339
* Better support blended pickers by @slimbuck in https://github.com/playcanvas/engine/pull/8340
* WebGPU lightmapper support for shadow casting local lights and omni shadow shader cleanup by @mvaligursky in https://github.com/playcanvas/engine/pull/8338
* Lazy mesh creation for GSplat resources by @mvaligursky in https://github.com/playcanvas/engine/pull/8343
* Remove unnecessary polyfills by @willeastcott in https://github.com/playcanvas/engine/pull/8347
* Modernize build target to ES2020 by @willeastcott in https://github.com/playcanvas/engine/pull/8348
* annotation.mjs to annotations.mjs by @willeastcott in https://github.com/playcanvas/engine/pull/8349
* Move treeshake-ignore plugin to examples by @willeastcott in https://github.com/playcanvas/engine/pull/8351
* Small updates to the `BlurredPlanarReflection` script by @mvaligursky in https://github.com/playcanvas/engine/pull/8353
* [FIX] Add mip level for WebGPU device `copyRenderTarget` by @AlexAPPi in https://github.com/playcanvas/engine/pull/8320
* [FIX] Fixed incorrect uv1 (unwrapped uvs for lightmapping) for box and cone geometry by @mvaligursky in https://github.com/playcanvas/engine/pull/8336
* [FIX] Fix `EventHandle` cleanup in annotation script by @willeastcott in https://github.com/playcanvas/engine/pull/8337
* [FIX] Fix glTF node matrix decomposition with negative scale by @willeastcott in https://github.com/playcanvas/engine/pull/8329
* Replace `Debug.assert` with `errorOnce` and early return in GSplatComponent by @mvaligursky in https://github.com/playcanvas/engine/pull/8355
* [FIX] Hide `__initializeAttributes` from the API reference by @willeastcott in https://github.com/playcanvas/engine/pull/8359
* [FIX] Restore annotations for misc/annotations example by @willeastcott in https://github.com/playcanvas/engine/pull/8369
* Fix WebGL array texture crash when created without levels data by @mvaligursky in https://github.com/playcanvas/engine/pull/8371
* Fix memory leak in WebGPU multi-draw allocation by @mvaligursky in https://github.com/playcanvas/engine/pull/8367

## Examples
* Simple gsplat viewer engine example with HDR controls by @mvaligursky in https://github.com/playcanvas/engine/pull/8232
* Added bloom and other tweeks to Gsplat viewer example by @mvaligursky in https://github.com/playcanvas/engine/pull/8234
* Add Gaussian Splat AABB Crop Example with Edge Clipping by @mvaligursky in https://github.com/playcanvas/engine/pull/8236
* Examples that create custom ministats hide the default one by @mvaligursky in https://github.com/playcanvas/engine/pull/8239
* Update examples/src/examples/gaussian-splatting/crop.example.mjs by @JaclynCodes in https://github.com/playcanvas/engine/pull/8266
* [Example] Added basic glb loading support to the Viewer example for HDR testing by @mvaligursky in https://github.com/playcanvas/engine/pull/8312
* Add gaussian splatting annotations example with opacity controls by @mvaligursky in https://github.com/playcanvas/engine/pull/8313
* Add `BlurredPlanarReflection` script with distance-based blur effect by @mvaligursky in https://github.com/playcanvas/engine/pull/8342
* Improve examples sidebar category panel styling by @mvaligursky in https://github.com/playcanvas/engine/pull/8356
* [Example] Update camera positions in the anotations example to see all annotations on start by @mvaligursky in https://github.com/playcanvas/engine/pull/8372

## New Contributors
* @JaclynCodes made their first contribution in https://github.com/playcanvas/engine/pull/8266

**Full Changelog**: https://github.com/playcanvas/engine/compare/v2.14.4...v2.15.0