Passes: {Object.keys(passes).join(', ')}
} ``` ## What the Hook Does Automatically When called with a callback: 1. Creates a RenderPipeline for this component. 2. Creates a default scene pass (no MRT by default). 3. Sets a default `outputNode` to the scene pass (passthrough). 4. Recreates the scene pass only when the scene or camera actually changes, or on `rebuild()`. 5. Frees the pipeline and scene pass when the component unmounts, and the canvas goes back to rendering without post-processing. ## Ownership and Cleanup The component that configures the pipeline owns it. Conditionally rendering it turns the effect on and off: ```tsx function Bloom() { useRenderPipeline(({ renderPipeline, passes }) => { renderPipeline.outputNode = bloom(passes.scenePass.getTextureNode()) }) return null } // Unmounting` uses `-readonly`; `ObjectMap` is generic. | Affects code naming these types directly. | alpha.3 |
| `@react-three/test-renderer`'s default entry mocks WebGPU. | Test `/legacy` scenes with `@react-three/test-renderer/legacy`. | alpha.6 |
| `@react-three/eslint-plugin` exports flat configs; `eslint` is a peer. | `configs.recommended` in `eslint.config.js`; eslintrc uses `plugin:@react-three/legacy-recommended`. | alpha.6 |
## Upgrading from an earlier v10 alpha
On top of the above, alpha users also meet these changes to APIs that only existed in the alphas:
- **TSL hooks moved to `@react-three/tsl`** (`useUniforms`, `useUniform`, `useNodes`, `useLocalNodes`, `useBuffers`, `useGPUStorage`, `useRenderPipeline`, `rebuildAll*`); the standalone utilities (`removeUniforms(set, …)`, `clearScope`, `clearRootUniforms`, `removeNodes(set, …)`, `clearNodeScope`, `clearRootNodes`) are removed. _alpha.6_
- **`useRenderPipeline` belongs to the component that configures it.** Unmounting that component frees the pipeline and its scene pass, and the canvas renders without post-processing again. Pass `{ persist: true }` as the third argument to keep it rendering after unmount. A call without callbacks only reads and no longer creates a pipeline. _alpha.6_
- **Unregistered TSL reads are typed `LooseUniformNode` / `LooseNode`**, so they work in TSL without casts. Writing a concrete node straight into `state.uniforms` or `state.nodes` with `setState` (instead of through the hooks) now needs a cast. _alpha.6_
- **`useLocalNodes` with no dependency array re-runs every render**; pass `[]` for the old memoised behaviour. _alpha.6_
- **Multi-canvas is configured on the Canvas.** `renderer={{ primaryCanvas }}` and `renderer={{ scheduler }}` throw: use `