v10.0.0-alpha4
Pre-releaseWe have been hard at work on the pmndrs org and all the while alpha updates have been streaming in for R3F v10 as we march toward first class WebGPU and TSL support. Let's catch you up on the big news:
Improved TSL workflow
The original v10 alpha introduced useUniforms, useNodes, and useLocalNodes. We have experimented with more hooks since then.
- New experimental
useBuffersanduseGPUStoragehooks manage compute buffers and storage textures. useTexturesprovides a reactive, ref-counted texture registry without passing refs throughout the component tree.- TSL nodes, uniforms, buffers, and storage now rebuild atomically during fast refresh instead of requiring a full reload.
useRenderPipelinereplacesusePostProcessingand provides declarative render-pipeline and MRT setup.- Imports from
@react-three/fiber/webgpunow typeuseThreeanduseFrameagainstWebGPURendererstate without manual casts.
The scheduler gets its own repo
What started as a revamp of the internal R3F scheduler has split out into its own project that is intended to stand on its own legs: https://github.com/pmndrs/scheduler
- useFrame can run outside , making the scheduler useful for external UI and application systems.
- Named phases, explicit before/after ordering, FPS limits, and render takeover make complex frame loops easier to compose.
- Every Canvas now owns its frameloop, invalidation, and manual stepping. A demand-driven Canvas can no longer interfere with an always-running sibling for real multi-canvas support.
Multiple canvases
WebGPU canvases can now share a single renderer and GPU context. This unlocks HUDs, picture-in-picture views, multi-viewport rendering, and 3D layers separated by regular HTML.
<Canvas id="main" renderer>
<MainScene />
</Canvas>
<Canvas
renderer={{
primaryCanvas: 'main',
scheduler: { after: 'main', fps: 30 },
}}>
<Hud />
</Canvas>Each Canvas keeps its own scene, camera, events, and state while sharing the renderer and GPU resources. The scheduler handles target switching, render order, and independent frame rates.
More stuff!
There are also several smaller features that remove common imperative work:
- Canvas accepts declarative background colors, environment files, and presets.
- Explicit
widthandheightprops make fixed-resolution rendering and video export straightforward. - The default camera is part of the scene graph, so camera-attached lights, meshes, and HUD elements render naturally.
fromRef()connects props to sibling refs without a mount effect.once()supports mount-only geometry and object methods.userData.interactivePrioritylets overlays and controls take precedence over distance-based hit testing.
And then the usual hardening and bug fixes. There are a lot of ideas being tried out here so as always we would appreciate feedback on what is working and what is not working.
Try it out with:
npm install @react-three/fiber@alphaCheers!
What's Changed
- V10-hmr-bug by @DennisSmolek in #3670
- V10-fix-types by @DennisSmolek in #3675
- Bug Fixes and Life Improvement Features by @DennisSmolek in #3678
- chore: Automated canary releases by @krispya in #3680
- chore: Canary releases are only on v10 by @krispya in #3682
- Chore/remove changesets by @krispya in #3683
- V10 fixes cleanup by @DennisSmolek in #3684
- fix: various fixes by @DennisSmolek in #3688
- docs: replace deprecated miniplex with koota in AwesomeR3F by @travisbreaks in #3691
- feat: reactive Texture registry via useTextures (experimental, A5) by @DennisSmolek in #3776
- fix: v10 alpha.3 functional bugs (#1, #2, #3, #4, #6) by @DennisSmolek in #3777
- refactor: extract frame scheduler into @pmndrs/scheduler by @DennisSmolek in #3774
- docs: consolidate v10 docs into one canonical home + fix stale v9 API by @DennisSmolek in #3775
- test: unify testing strategy, CI parity, high-value coverage + gl-deprecation hardening by @DennisSmolek in #3779
- fix(v10): alpha hardening — portal leaks, WebGPU race, canvas fallback, events, uniforms, useLoader cacheKey by @DennisSmolek in #3784
- fix: complete the v10 alpha.3 pass (A5, C1/C2/C5/C8, blocks A+B, changelog, alpha.3 bump) by @DennisSmolek in #3785
- chore: require three >= 0.185, and use its WebGPU APIs properly by @DennisSmolek in #3786
- docs: scrub scattered specs — delete the stale ones, author what they knew by @DennisSmolek in #3789
- fix: close out the alpha.3 remainder (A1 test, C3, C4, C7, D4) by @DennisSmolek in #3788
- test: port scheduler ordering regression into the @pmndrs/scheduler idiom by @DennisSmolek in #3790
- fix(webgpu): atomic, generation-aware TSL resource registration (C16 HMR blocker) by @DennisSmolek in #3803
- docs(changelog): correct three alpha.3 entries before the release cut by @DennisSmolek in #3791
- ci(docs): unblock the link check — repoint cc0textures, stop timeouts counting as rot by @DennisSmolek in #3806
- fix: port v9 reconciler hardening by @krispya in #3818
- feat: remove act by @krispya in #3817
- fix(test-renderer): return real object handles from the mock GL create* calls by @DennisSmolek in #3822
- fix: keep interaction state continuous across instance reconstruction by @DennisSmolek in #3824
- chore(ci): close workflow drift with master, and fix the canary publish set by @DennisSmolek in #3825
- docs(changelog): make the alpha.3 record accurate, and give every package one by @DennisSmolek in #3829
- fix(build): stop the entries importing the package by name, and gate it by @DennisSmolek in #3830
- test: stop shadowing React's act with a frame-wait helper by @DennisSmolek in #3823
- fix(events): recover two fixes lost when #3823/#3824 merged at a stale head by @DennisSmolek in #3833
- chore(packaging): fix the exports map, drop dead files, align peers by @DennisSmolek in #3841
- docs: record the breaking changes alpha.3 actually ships by @DennisSmolek in #3842
- docs(tests): point the Tier-2 markers at where the tiers are defined by @DennisSmolek in #3832
- chore(ci): verify v10 after merge, and verify canaries before publishing by @DennisSmolek in #3834
- chore(release): derive the dist-tag from the version instead of defaulting to latest by @DennisSmolek in #3843
- fix(webgpu): make the three Inspector a lazy import to break the Turbopack cycle by @DennisSmolek in #3855
- fix(webgpu): narrow useThree/useFrame to WebGPURootState on the /webgpu entry by @DennisSmolek in #3860
- fix(webgpu): give scoped TSL resources valid WGSL identifiers by @DennisSmolek in #3857
- fix(webgpu): correct multi-canvas resize targeting by @DennisSmolek in #3859
- fix(core): stop useTexture's array/record forms looping forever by @DennisSmolek in #3858
- fix(webgpu): make useRenderPipeline rebuilds recompile and stop leaking the old scenePass by @DennisSmolek in #3856
- fix(core): keep the renderer root alive when a child suspends by @DennisSmolek in #3861
- fix(core): make Canvas frameloop root-scoped by @DennisSmolek in #3865
- chore-minor-cleanup by @DennisSmolek in #3878
- fix(core): route Canvas ordering through scheduler roots by @DennisSmolek in #3879
- chore(release): prepare v10.0.0-alpha.4 by @DennisSmolek in #3880
New Contributors
- @travisbreaks made their first contribution in #3691
Full Changelog: v10.0.0-alpha.1...v10.0.0-alpha.4