Source: ui/webgl/Utils.js

/**
 * A collection of useful functions.
 * 
 * @author rhess <robin.hess@awi.de>
 */


/**
 * Create a WebGL Program with fragmentShader, vertexShader and
 * store attributes and uniforms in an object for easy access
 * 
 * @memberof vef.ui.webgl
 * 
 * @param {WebGL} gl WebGL Context
 * @param {string} vShader Source Code of the Vertex Shader
 * @param {string} fShader Source COde of the Fragment Shader
 * @param {string[]} attributes Array of attribute names
 * @param {string[]} uniforms Array of uniforms names
 * 
 * @return program data
 */
export function createProgram(gl, vShader, fShader, attributes, uniforms) {

    // store relevant data in an object (will be returned)
    const data = {
        program: gl.createProgram(),
        vShader: null,
        fShader: null,
        uniforms: {},
        attributes: {},
        gl: gl
    };

    // compile vertex shader
    if (vShader) {
        data.vShader = gl.createShader(gl.VERTEX_SHADER);
        gl.shaderSource(data.vShader, vShader);
        gl.compileShader(data.vShader);
        gl.attachShader(data.program, data.vShader);
    }

    // compile fragment shader
    if (fShader) {
        data.fShader = gl.createShader(gl.FRAGMENT_SHADER);
        gl.shaderSource(data.fShader, fShader);
        gl.compileShader(data.fShader);
        gl.attachShader(data.program, data.fShader);
    }

    gl.linkProgram(data.program);

    // get attributes
    if (Array.isArray(attributes)) {
        for (let i = 0; i < attributes.length; ++i) {
            const attr = attributes[i];
            data.attributes[attr] = gl.getAttribLocation(data.program, attr);
        }
    }

    // get uniforms
    if (Array.isArray(uniforms)) {
        for (let i = 0; i < uniforms.length; ++i) {
            const uni = uniforms[i];
            data.uniforms[uni] = gl.getUniformLocation(data.program, uni);
        }
    }

    return data;
}

/**
 * Create webgl texture from an image object
 * 
 * @memberof vef.ui.webgl
 * 
 * @param {WebGL} gl 
 * @param {Image} image 
 * @returns texture
 */
export function createTexture(gl, image) {
    const texture = gl.createTexture();

    gl.bindTexture(gl.TEXTURE_2D, texture);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);

    return texture;
}