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, ]; }