{"record":{"id":"e71c40b72421bb09","repo":"remotion-dev/remotion","slug":"failed-to-create-webgl-shader-e71c40","errorCode":null,"errorMessage":"Failed to create WebGL shader","messagePattern":"Failed to create WebGL shader","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/effects/src/light-leak.ts","lineNumber":191,"sourceCode":"\tvbo: WebGLBuffer;\n\ttexture: WebGLTexture;\n\tuSource: WebGLUniformLocation | null;\n\tuEvolveProgress: WebGLUniformLocation | null;\n\tuRetractProgress: WebGLUniformLocation | null;\n\tuSeed: WebGLUniformLocation | null;\n\tuRetractSeed: WebGLUniformLocation | null;\n\tuHueShift: WebGLUniformLocation | null;\n\tuResolution: WebGLUniformLocation | null;\n};\n\nconst compileShader = (\n\tgl: WebGL2RenderingContext,\n\ttype: number,\n\tsource: string,\n): WebGLShader => {\n\tconst shader = gl.createShader(type);\n\tif (!shader) {\n\t\tthrow new Error('Failed to create WebGL shader');\n\t}\n\n\tgl.shaderSource(shader, source);\n\tgl.compileShader(shader);\n\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\tconst log = gl.getShaderInfoLog(shader);\n\t\tgl.deleteShader(shader);\n\t\tthrow new Error(`Light leak shader compile failed: ${log ?? '(no log)'}`);\n\t}\n\n\treturn shader;\n};\n\nconst linkProgram = (\n\tgl: WebGL2RenderingContext,\n\tvs: WebGLShader,\n\tfs: WebGLShader,\n): WebGLProgram => {","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/light-leak.ts#L173-L209","documentation":"Thrown by `compileShader()` inside the light-leak effect when `gl.createShader()` returns `null`. The WebGL2 context could not allocate a shader object — context loss, an invalid shader-type enum, or GPU/resource exhaustion. The effect cannot proceed without its shaders.","triggerScenarios":"Context lost before/at shader creation; too many simultaneous WebGL2 contexts (browser cap ~16); GPU unavailable in headless/CI; VRAM/object exhaustion.","commonSituations":"Many concurrent light-leak/effects previews; headless Chrome with `--disable-gpu`; long-running Studio tabs losing context on suspend; Lambda/CI without a real GPU.","solutions":["Reduce the count of live WebGL2 contexts (fewer Studio tabs, lower `--concurrency`).","Run headless Chrome with GPU access or a WebGL2-capable software renderer.","Handle `webglcontextlost` and recreate the effect after restore.","Restart the GPU/Chrome process to reclaim leaked objects."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"function glReady(gl: WebGL2RenderingContext | null): boolean {\n  if (!gl || gl.isContextLost()) return false;\n  const probe = gl.createShader(gl.VERTEX_SHADER);\n  if (!probe) return false;\n  gl.deleteShader(probe);\n  return true;\n}","typeGuard":"const hasWebGL2 = (): boolean =>\n  !!document.createElement('canvas').getContext('webgl2');","tryCatchPattern":"try {\n  lightLeak({...})(...);\n} catch (err) {\n  if (/Failed to create WebGL shader/.test(String(err))) {\n    console.warn('lightLeak() shader unavailable', err);\n  } else {\n    throw err;\n  }\n}","preventionTips":["Keep live WebGL2 contexts under the browser's ~16 cap.","Avoid --disable-gpu in headless rendering; use a GPU or WebGL2-capable software renderer.","Listen for `webglcontextlost` and rebuild effects on restore."],"tags":["light-leak","webgl2","gpu","context-loss","resource-exhaustion","render-env"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}