mrdoob/three.js · error · Error
THREE.Renderer: .resetState() called before the backend is i
Error message
THREE.Renderer: .resetState() called before the backend is initialized. Use "await renderer.init();" before using this method.
What it means
Thrown by Renderer.resetState() when the backend has not been initialized. resetState rebuilds the backend's cached GL state, so it requires a live backend; calling it before init has no state cache to reset.
Source
Thrown at src/renderers/common/Renderer.js:2313
setScissorTest( boolean ) {
this._canvasTarget.setScissorTest( boolean );
// TODO: Move it to CanvasTarget event listener.
this.backend.setScissorTest( boolean );
}
/**
* Resets the backend's internal state cache. Useful when the rendering context is shared with
* other libraries that change the state. A no-op for the WebGPU backend.
*/
resetState() {
if ( this._initialized === false ) {
throw new Error( 'THREE.Renderer: .resetState() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
}
this.backend.resetState();
}
/**
* Returns the viewport definition.
*
* @param {Vector4} target - The method writes the result in this target object.
* @return {Vector4} The viewport definition.
*/
getViewport( target ) {
return this._canvasTarget.getViewport( target );
}View on GitHub (pinned to da05705fa3)
Solutions
- await renderer.init() before the first resetState() call.
- Defer context-sharing/reset logic until after init resolves.
- For WebGPU backends, resetState is a no-op — confirm you actually need it; if not, remove the call.
- Gate resetState behind an initialized flag in your integration code.
Example fix
// before const renderer = new THREE.WebGPURenderer(); renderer.resetState(); // throws // after const renderer = new THREE.WebGPURenderer(); await renderer.init(); renderer.resetState();
Defensive patterns
Strategy: validation
Validate before calling
await renderer.init(); renderer.resetState(); // safe now
Prevention
- Await init before calling resetState.
- Defer context-sharing reset logic until after init resolves.
- Remember resetState is a no-op on WebGPU — confirm you need it.
- Gate resetState behind an initialized flag in integrations.
When it happens
Trigger: Calling renderer.resetState() synchronously after constructing an async Renderer/WebGPURenderer without awaiting init; sharing the context with another library and resetting state during early setup.
Common situations: Integrating three.js with another WebGL library (e.g. map/Chart libs) and calling resetState in an early lifecycle hook; porting from WebGLRenderer where resetState was safe immediately.
Related errors
- THREE.Renderer: .render() called before the backend is initi
- THREE.Renderer: .clear() called before the backend is initia
- THREE.Renderer: .hasFeature() called before the backend is i
- THREE.Renderer: .initTexture() called before the backend is
- THREE.Renderer: .initRenderTarget() called before the backen
AI-assisted analysis of mrdoob/three.js@da05705fa3 (2026-08-12).
Data as JSON: /api/errors/1b43a2ae1b7cd570.
Report an issue: GitHub.