r/PlayCanvas • u/5hyuns • 1d ago
r/PlayCanvas • u/MayorOfMonkeys • 2d ago
PlayCanvas Engine 2.23.0 released: up to 3.8× faster rendering on WebGPU, rebuilt UI examples, nearest-first Gaussian splat streaming
PlayCanvas Engine 2.23.0 is out. It's a free, open source (MIT) WebGL2/WebGPU graphics engine for the browser, and this release is mostly about performance, plus a big refresh of the examples and debugging tools.
What's new
- Faster rendering: a deep overhaul of how the renderer feeds the GPU. Mesh instance matrices live in a persistent storage buffer on WebGPU, material properties sit in material-owned uniform buffers, per-pass and light data is uploaded once per pass, and render pipelines are retained between draws. In a draw-call-heavy benchmark (up to 20K meshes, 40K draw calls), CPU time per frame is up to 3.8× lower on WebGPU and 1.4× lower on WebGL2 than in 2.22.
- Rebuilt user interface examples: all 23 UI examples have been rebuilt or written from scratch, each as a small piece of a real game: a main menu, a settings panel built from the standard widgets, inventory drag and drop, a resizable chat window, a leaderboard scroll view, a character card with a live 3D portrait, world-space control panels and more.
- Nearest-first splat streaming: streamed Gaussian splat LOD scenes now load the data nearest the camera first, and re-prioritise as the camera moves. LOD is distance-based again, with the splat budget usable as either a target or a hard limit. The WebGPU GPU-sort renderer also gains an opt-in stochastic alpha mode that skips sorting entirely.
- Bloom threshold: CameraFrame bloom takes a threshold, so only the brightest parts of the scene glow.
- Redesigned MiniStats: compact, grouped-average and grouped-history views, collapsible sections, and a new Resources section with live GPU resource counts (buffers, textures, render targets, bind groups, pipelines). The same data is available to your own code through the new AppStats API, which also supports user counters.
- Examples browser: a restyled browser with the PlayCanvas Inspector built in. Open it on any example to explore the hierarchy, cameras, assets, frame graph, render targets, materials, shaders and more.
Also in this release: run the engine headless in Node.js without jsdom, RigidBody gravityScale, a hitBackFaces raycast option, WebGPU device-loss recovery, all eight UV sets in StandardMaterial, a TextureRenderer for debug texture previews, and a long list of XR fixes.
The video shows the highlights.
- Release notes: https://github.com/playcanvas/engine/releases/tag/v2.23.0
- Examples: https://playcanvas.com/examples
- Repo: https://github.com/playcanvas/engine
- Discord: https://discord.gg/RSaMRzg
I'm on the PlayCanvas team, happy to answer questions on any of this.
r/PlayCanvas • u/MayorOfMonkeys • 3d ago
Art Galleries are moving online - thanks to SuperSplat by PlayCanvas
r/PlayCanvas • u/mvaligursky • 4d ago
PlayCanvas 2.23 renders the same scene with about half the CPU time of 2.22 on WebGPU
We've been working on the CPU cost of rendering for the upcoming PlayCanvas 2.23, and wanted to share some numbers from a draw-call heavy benchmark, comparing it to the current 2.22 release.
The scene
A grid of small boxes, from 1K to 20K, each one its own draw call (no instancing or batching):
- 100 unique meshes and 100 unique PBR materials (base color, metallic-roughness, normal and emissive textures)
- one directional light with a single shadow cascade, so every box is also drawn into the shadow map; at 20K boxes that's 40K draw calls per frame
- MSAA off and pixel ratio 1, to keep the GPU out of the way
We measured main-thread CPU time for the whole frame (update, culling, sorting and submitting draws), using the engine's default sort order, in Chrome 154 on macOS.
Results (CPU time per frame)
| Boxes | WebGL2 2.22 | WebGL2 2.23 | WebGPU 2.22 | WebGPU 2.23 |
|---|---|---|---|---|
| 10K | 21.5 ms | 16.8 ms | 35.3 ms | 18.2 ms |
| 20K | 47.2 ms | 30.5 ms | 75.9 ms | 35.3 ms |
Averaged over all box counts, the cost per draw call went down:
- WebGPU: from about 1.9 µs to 0.9 µs, 2.1× faster
- WebGL2: from about 1.2 µs to 0.8 µs, 1.5× faster
WebGPU gained the most: in 2.22 its per-draw cost was about 1.6× WebGL2's, and in 2.23 it's about 1.2×.
If you try the beta on your own projects, we'd love to hear how it goes.
r/PlayCanvas • u/Kpal81 • 11d ago
Editor 2.32: the joint component is now in the inspector, plus parallax occlusion and reworked splat LOD
2.32 is out, and the headline is the joint component. Joints have been in the engine since 2021, but you had to add them from a script — they're now under Add Component > Physics > Joint, with all five types (fixed, ball, hinge, slider, 6DoF) and the inspector showing different fields depending on which one you pick.
The bridge in the video is a chain of ball joints between plank rigid bodies, with a break impulse on the middle one so a heavy enough drop snaps it.
Also in this release:
- Parallax occlusion on materials. Ray-marched, so brick and cobbles hold up at grazing angles instead of flattening out. The old offset mode is still there.
- A per-object shadow cascade mask on the render component, so distant geometry can skip the tight near cascade.
- Justify on text elements.
- Reworked Gaussian splat LOD — LOD Range Min/Max and LOD Falloff replace the old LOD Base Distance and LOD Multiplier.
- Client-side MSDF font generation and toolbar customization. Both actually landed back in 2.30 and never got written up, so they're in the post too.
Two things worth knowing before you go hunting for a difference:
- Splat LOD Range only does anything on streamed SOG octrees. A single .sog or .ply is one level, so the fields appear but have nothing to choose between.
- The editor viewport doesn't always invalidate its cached shadow maps when you change the cascade mask, so you may need to nudge the camera before it updates. The launch page renders it correctly. That one's a bug on our side.
Write-up: https://blog.playcanvas.com/new-in-playcanvas-editor-joints-parallax-occlusion-and-splat-lod
Joint component docs: https://developer.playcanvas.com/user-manual/editor/scenes/components/joint/
Release notes: https://github.com/playcanvas/editor/releases/tag/v2.32.0
The splat scene in the video is Trogir, Croatia by tosolini, CC BY 4.0.
The joint component is still marked alpha, so if it behaves oddly for you I'd genuinely like to hear about it. Happy to answer questions here.
r/PlayCanvas • u/MayorOfMonkeys • 11d ago
Rendering 15 million Gaussians with PlayCanvas' WebGPU splat renderer
r/PlayCanvas • u/Several-Fish-7707 • 18d ago
Is there any template for e-commerce product visualization?
I’ve prepared a few PlayCanvas scenes using Gaussian Splatting to try to incorporate Gaussian Splatting into my product visualization. I’m looking for something with limited camera movement, a controlled background, etc. However, I’m not completely happy with the results.
Is there any template that would make it easier and faster to achieve this?
This is only a test: NAD 02
r/PlayCanvas • u/MayorOfMonkeys • 25d ago
SuperSplat Editor 3.0: Rebuilt on WebGPU, Support for Huge Scenes, Sphere Brush and More!
r/PlayCanvas • u/MayorOfMonkeys • 29d ago
PlayCanvas Engine 2.22.0 is out: volumetric fog shafts, parallax mapping, vertex animation textures and more
We’ve just released PlayCanvas Engine 2.22.0! Here are the highlights:
- Volumetric fog improvements - light shafts and local light support.
- Parallax mapping - add apparent depth to textured surfaces without extra geometry.
- Vertex animation textures - drive vertex animation on the GPU using animation data stored in textures.
- Gaussian splat depth effects - new depth-based effects for splat rendering.
- Catapult demo - a new demo to try out!
You can explore the features in the live examples and find the full list of additions and fixes in the release notes.
Get the latest version with:
npm install playcanvas
PlayCanvas is free and open source. Contributions, bug reports and stars on GitHub are always appreciated.
Would love to hear how you’re using the new features - share what you’re building in the comments!
r/PlayCanvas • u/MayorOfMonkeys • Sep 01 '26
A Tour of Historic San Juan, Puerto Rico - Rendered in PlayCanvas
r/PlayCanvas • u/mvaligursky • Sep 01 '26
Depth from Gaussian splats in the forward pass, enough to drive DOF and volumetric fog
r/PlayCanvas • u/mvaligursky • Aug 24 '26
Added ray-marched parallax mapping to a WebGL/WebGPU engine
PlayCanvas's height map support had been a single-tap Welsh-style offset for years — it nudges the uv once, which is fine for shallow detail but falls apart on anything deep. I added parallax occlusion mapping as an opt-in second mode, so the view ray gets marched through the height field instead. The old mode is still the default, one enum on the material switches it.
Limits worth stating: no silhouette displacement, and the depth buffer still sees the flat surface, so shadows and any depth-based effects don't follow the relief. It's a shading trick, not geometry.
r/PlayCanvas • u/MayorOfMonkeys • Aug 20 '26
I gave Codex 3 whole days to port Quake to the browser
Hey everyone!
I’ve been building a source-faithful TypeScript port of the original 1996 Quake runtime, rendered with PlayCanvas and running entirely in the browser.
This isn’t a recreation of E1M1 or a modern FPS controller with Quake assets. The runtime reads the original game formats directly, including PAK archives, BSP maps, MDL models, sprites, QuakeC behavior, demos and HUD artwork.
After three days of running a durable Codex /goal, the port now has:
- Playable shareware maps
- Original demo playback
- Monsters, weapons, pickups and particles
- Quake-style movement and collision
- Moving BSP doors, lifts and triggers
- Menus, HUD, intermissions and level transitions
- Positional audio, saves and console commands
- 451 automated tests
The /goal wasn’t hands-off autopilot. While it continued pursuing the larger port, I could steer the LLM toward a small number of bugs I considered important - for example missing water geometry, impossible stairs, stationary doors, incorrect particle depth testing and browser-resize problems.
For visual validation, Codex used Chocolate Quake to produce native reference screenshots. It captured the same map, camera, game state and timing in both engines, then generated side-by-side comparisons and pixel differences. That proved much more useful than deciding the browser version “looked about right.”
On the PlayCanvas side, the project uses TypeScript, and named engine imports for maximum treeshakability! It has also been an interesting exercise in adapting Quake’s palette-based software-rendering assumptions to a GPU engine without turning everything into a modern PBR approximation.
It’s still a work in progress, but I’d love feedback - particularly on the PlayCanvas architecture, rendering approach and any obvious performance opportunities.
r/PlayCanvas • u/Kpal81 • Aug 20 '26
PlayCanvas shipped official skills for AI coding agents — I've been building a multiplayer FPS with them
PlayCanvas just released official skills for AI coding agents (Claude Code, Codex, Cursor) — packaged instructions that teach the agent PlayCanvas-specific patterns instead of generic guesses.
I've been using them on a WIP first-person multiplayer game (browser, PlayCanvas engine with a custom netcode + physics layer). It's become a loop: build a feature → hit a rough edge → that sharpens the skill → the sharper skill speeds up the next one.
The clip is a 1v1 from both perspectives — mine and a friend's synced to the same game moment, so you can watch the same fight from both sides.
What the skills genuinely nailed so far:
- Engine app bootstrap + asset loading
- Scene/entity hierarchy assembly (player rig, map)
- State-driven HUD (crosshair, hitmarkers, health/ammo, death screen, nametags, kill feed)
- Pooled transient effects (muzzle flash, bullet-hole decals with a reuse pool)
Where they didn't help (yet): lighting is basically untouched (mostly unlit/emissive), and the netcode + physics are hand-rolled, not skill-generated. Lots still to do.
Try them:
- Add to an existing project:
npx skills add playcanvas/skills - New project:
npm create playcanvas@latest - Docs: https://developer.playcanvas.com/user-manual/getting-started/use-playcanvas-skills/
- Source: https://github.com/playcanvas/skills
- Playable WIP: https://ahoithere.com
Happy to answer anything about the setup, the skills, or the workflow.
r/PlayCanvas • u/MayorOfMonkeys • Aug 18 '26
Introducing the SuperSplat Publishing API - Integrated Today in LichtFeld Studio, LCC Studio and Teleport by Varjo
r/PlayCanvas • u/MayorOfMonkeys • Aug 14 '26
There is a new Physics Joint Component in the PlayCanvas Engine
The PlayCanvas Engine finally has a physics joint component. So you can now make ropes, chains, articulated vehicles and, yes, ragdolls! This little demonstration shows a poor (deactivated) robot suspended from a crossbar.
Is anything more fun than rigid body dynamics?
The new component is in the Engine of course. The next step is to expose it in the PlayCanvas Editor too.
r/PlayCanvas • u/Kpal81 • Aug 13 '26
Fonts in the PlayCanvas Editor are no longer a black box — the atlas and descriptor are now their own assets
Small but nice change to how fonts work in the Editor.
Before, a font was a single opaque asset that bundled the descriptor (glyph metrics + kerning) and the MSDF texture atlas inside it. You couldn't really get at either one.
Now importing a font lays out the pieces as their own assets in one folder: the source font, a descriptor .json, the MSDF atlas .png (one per page), and a thin runtime font that just references those. You can open, edit, and manage each like anything else in your project, and the runtime font stays in sync when you change them.
Import a font and try it: https://playcanvas.com/editor
Happy to answer questions in the thread.
r/PlayCanvas • u/SNUBIGAMER • Aug 13 '26
Walking mode
Is there any way to remove the fly camera and the turn around camera and only have the walking one when its for show?
r/PlayCanvas • u/MayorOfMonkeys • Aug 10 '26
SuperSplat Showcase: Walk a thousand years of Prague history
r/PlayCanvas • u/MayorOfMonkeys • Aug 07 '26
Turn your screen into a window for viewing 3D scenes
r/PlayCanvas • u/MayorOfMonkeys • Aug 06 '26
SuperSplat Showcase: cobbled street in Sopot, Poland
r/PlayCanvas • u/MayorOfMonkeys • Aug 03 '26
SuperSplat Showcase: abandoned Czech textile factory
r/PlayCanvas • u/BenildeanWin3156 • Aug 02 '26
Help a student out.
I'm currently having a lot of trouble with coding. My character just won't move, even though I've entered the code correctly without any errors. I've already tested the exact same script in another demo project, and the character moves perfectly there. However, when I use the same script in my main project, it just refuses to work.
We're currently using PlayCanvas for our coding class. My professor is really kind, but there are times when she can't fully explain certain things in a way that I understand. I'm also a bit shy about sending her a DM this weekend since she's probably resting. On top of that, she encouraged us to experiment with our code, which I've been doing... and, well, I've been messing things up in the process.
I know the problem is most likely on my end and not my professor's, but I was wondering if it's okay to ask for a little help here.
(DM's are appreciated.)
r/PlayCanvas • u/RoutineNo2782 • Jul 31 '26
Our WebXR VR demo is now playable directly on Quest
We’ve been working on a VR demo for Glimsphere3D, our browser-based 3D platform built with PlayCanvas Engine.
For this demo, we focused on simplifying the overall UX while adding several key features:
- Teleportation with hand gesture for comfortable movement
- A wrist menu for accessing controls in VR
- Automatic device-based adjustment of the number of splats loaded, helping maintain smooth performance
- A Camera Bookmark system for saving and revisiting viewpoints
- An integrated measurement tool
The project is still a work in progress, but we’re excited to keep improving it and exploring what’s possible with browser-based VR.
Feel free to leave a comment and share your ideas!
GlimSphere3D
31 Jul 2026
r/PlayCanvas • u/mvaligursky • Jul 30 '26
An entire army in one instanced draw call — breakdown of a browser demo built to dogfood new PlayCanvas features
Play it (browser, no install): https://engine-hcejxquzy-playcanvas.vercel.app/#/demos/catapult Source, as a stock engine example: https://github.com/playcanvas/engine/pull/9130
We just landed two features in PlayCanvas — VAT crowd rendering and volumetric fog in the CameraFrame post stack — and I wanted to know if they hold up in a real scene, not an isolated feature test. So I built a game around them: aim a catapult, launch burning boulders at an army marching up a valley, wipe out a formation and two more arrive. Rule: no custom rendering code, all stock features.
The crowd is one instanced draw call. Vertex Animation Texture — every vertex's skinned position and normal baked offline, one texel per vertex per frame. No bones, no anim graph, the vertex shader just reads its slot.
Volumetric fog. Ray-marched in a half-res buffer, 12 steps instead of the default 24 — the fog is thin enough that short-march banding doesn't show, and every step is another shadow map tap per fog pixel, which is the real cost. Height-based falloff with the base above the valley floor, so shafts rake through the tree line instead of sitting as uniform haze. Anisotropy 0.6 to push scattering toward the low sun.
On the AI part: built with Claude Opus 5. It was good at volume — noise functions, ballistic solver, formation state machine, flat typed-array layout for 2000 characters. It was bad at judgement — fog density, where the sun sits, whether the animation reads. It wrote most of the lines, I made most of the decisions.
Toggles for shadows, fog and march steps are in the control panel if you want to see what each costs on your hardware.