{"record":{"id":"59821fe9c21e76cd","repo":"mrdoob/three.js","slug":"three-renderer-initrendertarget-called-before","errorCode":null,"errorMessage":"THREE.Renderer: .initRenderTarget() called before the backend is initialized. Use \"await renderer.init();\" before using this method.","messagePattern":"THREE\\.Renderer: \\.initRenderTarget\\(\\) called before the backend is initialized\\. Use \"await renderer\\.init\\(\\);\" before using this method\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/renderers/common/Renderer.js","lineNumber":3108,"sourceCode":"\n\t\t\tthrow new Error( 'THREE.Renderer: .initTexture() called before the backend is initialized. Use \"await renderer.init();\" before using this method.' );\n\n\t\t}\n\n\t\tthis._textures.updateTexture( texture );\n\n\t}\n\n\t/**\n\t * Initializes the given render target.\n\t *\n\t * @param {RenderTarget} renderTarget - The render target to intialize.\n\t */\n\tinitRenderTarget( renderTarget ) {\n\n\t\tif ( this._initialized === false ) {\n\n\t\t\tthrow new Error( 'THREE.Renderer: .initRenderTarget() called before the backend is initialized. Use \"await renderer.init();\" before using this method.' );\n\n\t\t}\n\n\t\tthis._textures.updateRenderTarget( renderTarget );\n\n\t\tconst renderTargetData = this._textures.get( renderTarget );\n\n\t\tconst renderContext = this._renderContexts.get( renderTarget );\n\n\t\trenderContext.textures = renderTargetData.textures;\n\t\trenderContext.depthTexture = renderTargetData.depthTexture;\n\t\trenderContext.width = renderTargetData.width;\n\t\trenderContext.height = renderTargetData.height;\n\t\trenderContext.renderTarget = renderTarget;\n\t\trenderContext.depth = renderTarget.depthBuffer;\n\t\trenderContext.stencil = renderTarget.stencilBuffer;\n\n\t\tthis.backend.initRenderTarget( renderContext );","sourceCodeStart":3090,"sourceCodeEnd":3126,"githubUrl":"https://github.com/mrdoob/three.js/blob/da05705fa31f02710c19772a2aa70c7454807f0c/src/renderers/common/Renderer.js#L3090-L3126","documentation":"Thrown by Renderer.initRenderTarget() when the backend is not yet initialized. Preloading a render target (allocating its GPU textures and render context) requires the texture subsystem to exist, which only happens after renderer.init() resolves.","triggerScenarios":"Calling renderer.initRenderTarget(renderTarget) on a newly built WebGPURenderer/Renderer without first awaiting renderer.init(), usually to warm up a render target (shadow map, G-buffer, post-processing buffer) before the first frame.","commonSituations":"Post-processing setups that preallocate render targets at app start. Shadow map configurations created before the first render. Code migrated from older versions where the constructor did synchronous init.","solutions":["Call `await renderer.init();` before `renderer.initRenderTarget(rt);`.","Defer render-target initialization until the first render pass, which initializes the backend as a side effect.","Move render-target construction into an async setup phase that runs after init resolves."],"exampleFix":"// before\nconst renderer = new WebGPURenderer();\nrenderer.initRenderTarget(shadowTarget); // throws\n\n// after\nconst renderer = new WebGPURenderer();\nawait renderer.init();\nrenderer.initRenderTarget(shadowTarget);","handlingStrategy":"validation","validationCode":"async function preloadRenderTarget(renderer, rt) {\n  if (!renderer.hasInitialized()) await renderer.init();\n  renderer.initRenderTarget(rt);\n}","typeGuard":"function rendererReady(renderer) {\n  return typeof renderer.hasInitialized === 'function' && renderer.hasInitialized();\n}","tryCatchPattern":"try {\n  renderer.initRenderTarget(rt);\n} catch (e) {\n  if (/initRenderTarget\\(\\) called before/.test(e.message)) { await renderer.init(); renderer.initRenderTarget(rt); }\n  else throw e;\n}","preventionTips":["Preallocate render targets inside an async setup that runs after init.","Don't init render targets from synchronous bootstrap code.","Use renderer.hasInitialized() as a gate before any preloading."],"tags":["webgpu","lifecycle","async-init","render-target","renderer"],"backgroundTag":null,"analyzedSha":"da05705fa31f02710c19772a2aa70c7454807f0c","analyzedAt":"2026-08-12T22:51:37.160Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}