remotion-dev/remotion · error · Error

Failed to create WebGL shader

Error message

Failed to create WebGL shader

What it means

pixelDissolve() compiles fixed GLSL shaders during WebGL2 setup. gl.createShader() returns null only when the context is lost or the driver refuses allocation. Since the shader source is fixed in the library, this null signals a dead/lost context, not a code bug.

Source

Thrown at packages/effects/src/pixel-dissolve.ts:201

	vec2 gridUv = min(vUv, vec2(1.0) - vec2(0.000001));
	vec2 cell = floor(gridUv * divisions);
	vec4 color = texture(uSource, vUv);

	float noise = hash21(cell + vec2(uSeed, uSeed * 1.618));
	float mask = dissolveMask(noise, uProgress, uFeather);

	fragColor = vec4(color.rgb * mask, color.a * mask);
}
`;

const compileShader = (
	gl: WebGL2RenderingContext,
	type: number,
	source: string,
): WebGLShader => {
	const shader = gl.createShader(type);
	if (!shader) {
		throw new Error('Failed to create WebGL shader');
	}

	gl.shaderSource(shader, source);
	gl.compileShader(shader);
	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
		const log = gl.getShaderInfoLog(shader);
		gl.deleteShader(shader);
		throw new Error(
			`Pixel Dissolve shader compile failed: ${log ?? '(no log)'}`,
		);
	}

	return shader;
};

const linkProgram = (
	gl: WebGL2RenderingContext,
	vs: WebGLShader,

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Ensure a stable WebGL2 context before rendering (real GPU or SwiftShader in CI).
  2. Handle 'webglcontextlost' and re-initialize on 'webglcontextrestored'.
  3. Limit concurrent GPU effects per composition.
  4. Update GPU drivers.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  initPixelDissolve(canvas); // compiles pixelDissolve shaders
} catch (err) {
  if (isContextLost(canvas)) waitForRestore(canvas).then(initPixelDissolve);
  else throw err;
}

Prevention

When it happens

Trigger: Reached in compileShader() during pixelDissolve effect setup before rendering. The WebGL2 context was acquired but createShader now returns null (context lost between acquisition and compile).

Common situations: GPU reset mid-setup; context eviction during long renders; headless rendering without a stable GPU; concurrent renders saturating the driver.

Related errors


AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12). Data as JSON: /api/errors/03f9d7db52150ba6. Report an issue: GitHub.