mrdoob/three.js · error · Error

THREE.PMREMGenerator: .fromCubemap() called before the backe

Error message

THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Use "await renderer.init();" before using this method.

What it means

Thrown by PMREMGenerator.fromCubemap() when the renderer is not yet initialized. Like the other from* methods, generating a PMREM from a cubemap texture requires the live GPU backend, and _hasInitialized delegates to renderer.hasInitialized().

Source

Thrown at src/renderers/common/extras/PMREMGenerator.js:261

	}

	/**
	 * Generates a PMREM from an cubemap texture, which can be either LDR
	 * or HDR. The ideal input cube size is 256 x 256, as this matches best
	 * with the 256 x 256 cubemap output. The minimum supported input cube
	 * size is 16 x 16 per face.
	 *
	 * @param {Texture} cubemap - The cubemap texture to be converted.
	 * @param {?RenderTarget} [renderTarget=null] - The render target to use.
	 * @return {RenderTarget} The resulting PMREM.
	 * @see {@link PMREMGenerator#fromCubemapAsync}
	 */
	fromCubemap( cubemap, renderTarget = null ) {

		if ( this._hasInitialized === false ) {

			throw new Error( 'THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Use "await renderer.init();" before using this method.' );

		}

		return this._fromTexture( cubemap, renderTarget );

	}

	/**
	 * Generates a PMREM from an cubemap texture, which can be either LDR
	 * or HDR. The ideal input cube size is 256 x 256,
	 * with the 256 x 256 cubemap output.
	 *
	 * @deprecated
	 * @param {Texture} cubemap - The cubemap texture to be converted.
	 * @param {?RenderTarget} [renderTarget=null] - The render target to use.
	 * @return {Promise<RenderTarget>} The resulting PMREM.
	 * @see {@link PMREMGenerator#fromCubemap}
	 */

View on GitHub (pinned to da05705fa3)

Solutions

  1. Call `await renderer.init();` before `pmrem.fromCubemap(cube)`.
  2. Use the deprecated `await pmrem.fromCubemapAsync(cube)` (inits internally).
  3. Defer the conversion until after the first frame has rendered.

Example fix

// before
const renderer = new WebGPURenderer();
const pmrem = new PMREMGenerator(renderer);
const envMap = pmrem.fromCubemap(cubeMap); // throws

// after
const renderer = new WebGPURenderer();
await renderer.init();
const pmrem = new PMREMGenerator(renderer);
const envMap = pmrem.fromCubemap(cubeMap);
Defensive patterns

Strategy: validation

Validate before calling

async function safeFromCubemap(pmrem, cube) {
  if (!pmrem._renderer.hasInitialized()) await pmrem._renderer.init();
  return pmrem.fromCubemap(cube);
}

Type guard

function pmremReady(pmrem) {
  return pmrem._renderer && typeof pmrem._renderer.hasInitialized === 'function' && pmrem._renderer.hasInitialized();
}

Try / catch

try {
  return pmrem.fromCubemap(cube);
} catch (e) {
  if (/fromCubemap\(\) called before/.test(e.message)) { await pmrem._renderer.init(); return pmrem.fromCubemap(cube); }
  else throw e;
}

Prevention

When it happens

Trigger: Calling `pmrem.fromCubemap(cubeTexture)` on a PMREMGenerator whose renderer has not yet had `await renderer.init()` resolve. Typical when converting a preloaded cube environment to PMREM.

Common situations: Cube-environment baking at startup. Migrating from the deprecated fromCubemapAsync without the explicit init await. Pre-converting a cube map before the first render.

Related errors


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