// Compile a WebGL program from a vertex shader and a fragment shader compile = (gl, vshader, fshader) => { var vs = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vs, vshader); gl.compileShader(vs); var fs = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fs, fshader); gl.compileShader(fs); var program = gl.createProgram(); gl.attachShader(program, vs); gl.attachShader(program, fs); gl.linkProgram(program); gl.useProgram(program); console.log('vertex shader:', gl.getShaderInfoLog(vs) || 'OK'); console.log('fragment shader:', gl.getShaderInfoLog(fs) || 'OK'); console.log('program:', gl.getProgramInfoLog(program) || 'OK'); return program; } // Bind a data buffer to an attribute, fill it with data and enable it buffer = (gl, data, program, attribute, size, type) => { gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer()); gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW); var a = gl.getAttribLocation(program, attribute); gl.vertexAttribPointer(a, size, type, false, 0, 0); gl.enableVertexAttribArray(a); } // Draw a box drawBox = (gl, n, viewProjMatrix, u_MvpMatrix, u_NormalMatrix) => { // Compute mvp matrix g_mvpMatrix.set(viewProjMatrix); g_mvpMatrix.multiply(g_modelMatrix); gl.uniformMatrix4fv(u_MvpMatrix, false, g_mvpMatrix.elements); // Compute inverse transform g_normalMatrix.setInverseOf(g_modelMatrix); g_normalMatrix.transpose(); gl.uniformMatrix4fv(u_NormalMatrix, false, g_normalMatrix.elements); // Draw gl.drawElements(gl.TRIANGLES, n, gl.UNSIGNED_BYTE, 0); }