webgl-util.js (1599B)
1 WebGLUtil = (function() { 2 // --------------------------------------------------------------------------- 3 // WebGL helpers 4 5 // Returns a valid shader, or null on errors. 6 function createShaderById(gl, id) { 7 var elem = document.getElementById(id); 8 if (!elem) { 9 throw new Error( 10 "Failed to create shader from non-existent id '" + id + "'." 11 ); 12 } 13 14 var src = elem.innerHTML.trim(); 15 16 var shader; 17 if (elem.type == "x-shader/x-fragment") { 18 shader = gl.createShader(gl.FRAGMENT_SHADER); 19 } else if (elem.type == "x-shader/x-vertex") { 20 shader = gl.createShader(gl.VERTEX_SHADER); 21 } else { 22 throw new Error( 23 "Bad MIME type for shader '" + id + "': " + elem.type + "." 24 ); 25 } 26 27 gl.shaderSource(shader, src); 28 gl.compileShader(shader); 29 30 return shader; 31 } 32 33 function createProgramByIds(gl, vsId, fsId) { 34 var vs = createShaderById(gl, vsId); 35 var fs = createShaderById(gl, fsId); 36 if (!vs || !fs) { 37 return null; 38 } 39 40 var prog = gl.createProgram(); 41 gl.attachShader(prog, vs); 42 gl.attachShader(prog, fs); 43 gl.linkProgram(prog); 44 45 if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) { 46 var str = "Shader program linking failed:"; 47 str += "\nShader program info log:\n" + gl.getProgramInfoLog(prog); 48 str += "\n\nVert shader log:\n" + gl.getShaderInfoLog(vs); 49 str += "\n\nFrag shader log:\n" + gl.getShaderInfoLog(fs); 50 console.error(str); 51 return null; 52 } 53 54 return prog; 55 } 56 57 return { 58 createShaderById, 59 createProgramByIds, 60 }; 61 })();