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
- Call `await renderer.init();` before `pmrem.fromCubemap(cube)`.
- Use the deprecated `await pmrem.fromCubemapAsync(cube)` (inits internally).
- 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
- Await renderer.init() before PMREM.fromCubemap.
- Ensure the source cube texture is loaded and the renderer initialized before conversion.
- Centralize environment-map generation behind an async helper.
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
- THREE.PMREMGenerator: .fromScene() called before the backend
- THREE.PMREMGenerator: .fromEquirectangular() called before t
- 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/028c58bfbebd3b2c.
Report an issue: GitHub.