/** Get shader source by HTML-Element */ export function getShader(gl: WebGL2RenderingContext, id: string): WebGLShader | null { const script: any = document.getElementById(id); if (!script) { console.error(`Couldn't get shader source from HTML for id: ${id}`); return null; } let shader: WebGLShader | null; if (script.type == "x-shader/x-fragment") { shader = gl.createShader(gl.FRAGMENT_SHADER); } else if (script.type == "x-shader/x-vertex") { shader = gl.createShader(gl.VERTEX_SHADER); } else { console.error(`Script type is wrong for id: ${id}`); return null; } if (shader == null) { console.error("Cannot create Shaders!"); return null; } gl.shaderSource(shader, script.text); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { console.error(`Shader compilation failed for ${id}:`, gl.getShaderInfoLog(shader)); return null; } return shader; } export function createProgram( gl: WebGL2RenderingContext, vertexShaderId: string, fragmentShaderId: string, programName: string ): WebGLProgram | null { const vertexShader = getShader(gl, vertexShaderId); const fragmentShader = getShader(gl, fragmentShaderId); if (vertexShader == null || fragmentShader == null) { console.error(`Didn't find ${programName} shader sources!`); return null; } const program = gl.createProgram(); if (program == null) { console.error(`${programName} program not created!`); return null; } gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { console.error(`Could not initialize ${programName} shaders:`, gl.getProgramInfoLog(program)); return null; } return program; }