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