remotion-dev/remotion · error · Error

Failed to create color correction shader program

Error message

Failed to create color correction shader program

What it means

Thrown by createProgram in the color correction effect when gl.createProgram() returns null after both shaders compiled successfully. The GL context cannot allocate a program object, signaling resource exhaustion or context loss. Effect setup cannot proceed without a linked program.

Source

Thrown at packages/effects/src/color-correction.ts:332

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

	return shader;
};

const createProgram = (gl: WebGL2RenderingContext): WebGLProgram => {
	const vertexShader = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER);
	const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SHADER);
	const program = gl.createProgram();
	if (!program) {
		throw new Error('Failed to create color correction shader program');
	}

	gl.attachShader(program, vertexShader);
	gl.attachShader(program, fragmentShader);
	gl.linkProgram(program);
	gl.deleteShader(vertexShader);
	gl.deleteShader(fragmentShader);

	if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
		const log = gl.getProgramInfoLog(program);
		gl.deleteProgram(program);
		throw new Error(
			`Color correction shader link failed: ${log ?? '(no log)'}`,
		);
	}

	return program;
};

View on GitHub (pinned to 78fe4bb3fd)

Solutions

  1. Lower render concurrency to reduce simultaneous GL program objects.
  2. Use a GPU-accelerated render environment instead of software GL.
  3. Update drivers/Chrome and retry if context loss was transient.
  4. Reduce the count of WebGL2 effects active in one render pass.

Example fix

// before
remotion render main --concurrency=8

// after
remotion render main --concurrency=1
Defensive patterns

Strategy: retry

Validate before calling

function webgl2ProgramAvailable(): boolean {
  try {
    const c = document.createElement('canvas');
    const gl = c.getContext('webgl2');
    if (!gl) return false;
    const p = gl.createProgram();
    const ok = p !== null;
    if (p) gl.deleteProgram(p);
    return ok;
  } catch {
    return false;
  }
}

Try / catch

try {
  await renderMedia({...});
} catch (err) {
  if (/Failed to create color correction shader program/i.test(String(err))) {
    await renderMedia({...opts, concurrency: 1});
  } else {
    throw err;
  }
}

Prevention

When it happens

Trigger: At color-correction.ts:332, after compileShader succeeded for both vertex and fragment shaders, but gl.createProgram() yields null. Caused by GL object-limit exhaustion or a lost context, independent of colorCorrection() parameters.

Common situations: High render concurrency with many live WebGL2 contexts/programs, software GL with low object limits, or a long-running render that hit context loss.

Related errors


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