const Shader = {} Shader.load = async (vertexPath, fragmentPath) => { let vertexCode = await File.read(vertexPath) if(!vertexCode) { console.log("Invalid shader path:", vertexPath) return } let fragmentCode = await File.read(fragmentPath) if(!fragmentCode) { console.log("Invalid shader path:", fragmentPath) return } var vertexShader = gl.createShader(gl.VERTEX_SHADER) var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER) gl.shaderSource(vertexShader, vertexCode) gl.shaderSource(fragmentShader, fragmentCode) gl.compileShader(vertexShader) if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) { console.error('Failed to compile ' + vertexPath + '!', gl.getShaderInfoLog(vertexShader)) return } gl.compileShader(fragmentShader) if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { console.error('Failed to compile ' + fragmentPath + '!', gl.getShaderInfoLog(fragmentShader)) return } var program = gl.createProgram() gl.attachShader(program, vertexShader) gl.attachShader(program, fragmentShader) gl.linkProgram(program) if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { console.error("Failed to link shader program!", gl.getProgramInfoLog(program)); return } gl.validateProgram(program); if (!gl.getProgramParameter(program, gl.VALIDATE_STATUS)) { console.error("Failed to validate shader program!", gl.getProgramInfoLog(program)); return } return program }