export enum ShaderType { VERTEX, FRAGMENT, } export const createShader = ( gl: WebGLRenderingContext, type: ShaderType, source: string ): WebGLShader | null => { const SHADER_TYPE_TO_GL_TYPE = { [ShaderType.VERTEX]: gl.VERTEX_SHADER, [ShaderType.FRAGMENT]: gl.FRAGMENT_SHADER, }; const shader = gl.createShader(SHADER_TYPE_TO_GL_TYPE[type]); gl.shaderSource(shader, source); gl.compileShader(shader); const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS); if (!success) { console.error(gl.getShaderInfoLog(shader)); gl.deleteShader(shader); return null; } return shader; }; export const createProgram = ( gl: WebGLRenderingContext, vertexShader: WebGLShader, fragmentShader: WebGLShader ): WebGLProgram | null => { const program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); const success = gl.getProgramParameter(program, gl.LINK_STATUS); if (!success) { console.error(gl.getProgramInfoLog(program)); gl.deleteProgram(program); return null; } return program; };