remotion-dev/remotion · error · Error

Failed to create WebGL program

Error message

Failed to create WebGL program

What it means

Thrown by vignette's linkProgram when gl.createProgram() returns null. A null program object means WebGL refused the allocation on context loss or object-limit exhaustion. Vignette links its compiled shaders into this program, so it cannot continue without one.

Source

Thrown at packages/effects/src/vignette.ts:290

	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(`Vignette shader compile failed: ${log ?? '(no log)'}`);
	}

	return shader;
};

const linkProgram = (
	gl: WebGL2RenderingContext,
	vs: WebGLShader,
	fs: WebGLShader,
): WebGLProgram => {
	const program = gl.createProgram();
	if (!program) {
		throw new Error('Failed to create WebGL program');
	}

	gl.attachShader(program, vs);
	gl.attachShader(program, fs);
	gl.linkProgram(program);
	if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
		const log = gl.getProgramInfoLog(program);
		gl.deleteProgram(program);
		throw new Error(`Vignette program link failed: ${log ?? '(no log)'}`);
	}

	return program;
};

const createProgram = (
	gl: WebGL2RenderingContext,
	vertexSource: string,
	fragmentSource: string,

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Reload to reset the WebGL2 context.
  2. Lower concurrent WebGL effect count.
  3. Confirm hardware-accelerated WebGL2 and update drivers.
  4. Free effects on offscreen/unmounted sequences.

Example fix

// before
const effect = vignette({amount: 0.6});

// after
const effect = (() => {
  try { return vignette({amount: 0.6}); } catch { return null; }
})();
Defensive patterns

Strategy: try-catch

Try / catch

let effect = null;
try {
  effect = vignette({amount: 0.6});
} catch (err) {
  console.warn('vignette program alloc failed, skipping effect', err);
}

Prevention

When it happens

Trigger: createProgram calls linkProgram after both shaders compile; gl.createProgram() returns null because the context is lost or the program-object budget is reached.

Common situations: Context loss with many concurrent effects; driver/GPU object caps; headless Chrome under memory pressure.

Related errors


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