rkgk/static/webgl.js

46 lines
1.4 KiB
JavaScript
Raw Permalink Normal View History

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