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

  1. await renderer.init() before the first resetState() call.
  2. Defer context-sharing/reset logic until after init resolves.
  3. For WebGPU backends, resetState is a no-op — confirm you actually need it; if not, remove the call.
  4. 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

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


AI-assisted analysis of mrdoob/three.js@da05705fa3 (2026-08-12). Data as JSON: /api/errors/1b43a2ae1b7cd570. Report an issue: GitHub.