remotion-dev/remotion · error · Error
Exposure shader compile failed: ${log ?? '(no log)'}
Error message
Exposure shader compile failed: ${log ?? '(no log)'} What it means
Thrown inside compileShader() in exposure.ts when gl.getShaderParameter(shader, gl.COMPILE_STATUS) is false (exposure.ts:120-124). The driver's shader translator rejected the GLSL ES 3.00 source (VERTEX_SHADER or FRAGMENT_SHADER); the InfoLog is captured, the failed shader is deleted, and the error includes the log. Unlike the null-handle case, this is a real compile rejection.
Source
Thrown at packages/effects/src/exposure.ts:123
}
`;
const compileShader = (
gl: WebGL2RenderingContext,
type: number,
source: string,
): WebGLShader => {
const shader = gl.createShader(type);
if (!shader) {
throw new Error('Failed to create exposure 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(`Exposure 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 exposure shader program');
}
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.deleteShader(vertexShader);
gl.deleteShader(fragmentShader);View on GitHub (pinned to 78fe4bb3fd)
Solutions
- Render with --gl=angle (CLI) / chromiumOptions.gl='angle' (SSR) / Angle (Studio) so a consistent, well-tested translator is used.
- Read the InfoLog in the message — it names the offending line/uniform; verify packages/effects/src/exposure.ts and color-correction-shader-utils.ts were not locally modified.
- Update GPU drivers on the render host, or force a software GL path known to compile the shaders.
- If the InfoLog references the injected COLOR_SPACE_GLSL helpers, check for a version drift between @remotion/effects and remotion/core.
- Report a driver/translator bug upstream if the GLSL is valid ES 3.00 yet rejected.
Example fix
// before
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
// translator rejected FRAGMENT_SHADER -> render fails
}
// after (ensure a consistent translator)
// CLI: remotion render <comp> --gl=angle
// SSR: renderMedia({ chromiumOptions: { gl: 'angle' } }) Defensive patterns
Strategy: try-catch
Validate before calling
// There is no user-facing input to validate: VERTEX_SHADER/FRAGMENT_SHADER are
// fixed package strings. The only pre-check is context health and GLSL version.
const supportsGlslEs300 = (gl: WebGL2RenderingContext): boolean =>
!gl.isContextLost() &&
(gl.getParameter(gl.SHADING_LANGUAGE_VERSION) ?? '').includes('3.00'); Try / catch
try {
// apply exposure(); for a custom canvas: const state = setupExposure(canvas);
} catch (err) {
if (err instanceof Error && /Exposure shader compile failed/.test(err.message)) {
// err.message contains the InfoLog; render on Angle (--gl=angle) and retry.
console.error('exposure compile failure:', err.message);
throw err;
}
throw err;
} Prevention
- Render with the Angle backend everywhere for a consistent, well-tested translator.
- Do not locally edit VERTEX_SHADER/FRAGMENT_SHADER or color-correction-shader-utils.ts.
- Keep @remotion/effects and remotion/core versions in sync so injected GLSL matches.
- Pin a stable software GL path in CI; update GPU drivers on render hosts.
When it happens
Trigger: setupExposure() compiles VERTEX_SHADER or FRAGMENT_SHADER and the Angle/driver translator reports a compile error. Because the GLSL is a fixed package string, this points at a buggy/incompatible driver translator (not user input). The InfoLog in the message identifies which stage and why.
Common situations: Headless Chromium with software GL whose translator mishandles the sRGB helpers injected via COLOR_SPACE_GLSL; outdated mobile/Intel drivers; a context that is partially degraded after a GPU reset; a local edit to FRAGMENT_SHADER that introduced a syntax error.
Related errors
- Exposure shader link failed: ${log ?? '(no log)'}
- Shader compile failed: ${log ?? '(no log)'}
- Evolve program link failed: ${log ?? '(no log)'}
- Failed to create exposure shader
- Program link failed: ${log ?? '(no log)'}
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/32390d78c6396e13.
Report an issue: GitHub.