45 lines
1.4 KiB
JavaScript
45 lines
1.4 KiB
JavaScript
function compileShader(gl, kind, source) {
|
|
let shader = gl.createShader(kind);
|
|
|
|
gl.shaderSource(shader, source);
|
|
gl.compileShader(shader);
|
|
|
|
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
let error = new Error(`failed to compile shader: ${gl.getShaderInfoLog(shader)}`);
|
|
gl.deleteShader(shader);
|
|
throw error;
|
|
} else {
|
|
return shader;
|
|
}
|
|
}
|
|
|
|
export function compileProgram(gl, vertexSource, fragmentSource) {
|
|
let vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
|
|
let fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
|
|
let program = gl.createProgram();
|
|
gl.attachShader(program, vertexShader);
|
|
gl.attachShader(program, fragmentShader);
|
|
gl.linkProgram(program);
|
|
|
|
gl.deleteShader(vertexShader);
|
|
gl.deleteShader(fragmentShader);
|
|
|
|
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
let error = new Error(`failed to link program: ${gl.getProgramInfoLog(program)}`);
|
|
gl.deleteProgram(program);
|
|
throw error;
|
|
} else {
|
|
return program;
|
|
}
|
|
}
|
|
|
|
export function orthographicProjection(left, right, top, bottom, near, far) {
|
|
// prettier-ignore
|
|
return [
|
|
2 / (right - left), 0, 0, -((right + left) / (right - left)),
|
|
0, 2 / (top - bottom), 0, -((top + bottom) / (top - bottom)),
|
|
0, 0, -2 / (far - near), -((far + near) / (far - near)),
|
|
0, 0, 0, 1,
|
|
];
|
|
}
|