(gl, vertexSource, fragmentSource)
| 13 | } |
| 14 | |
| 15 | function createProgram(gl, vertexSource, fragmentSource) { |
| 16 | var program = gl.createProgram(); |
| 17 | |
| 18 | var vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource); |
| 19 | var fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource); |
| 20 | |
| 21 | gl.attachShader(program, vertexShader); |
| 22 | gl.attachShader(program, fragmentShader); |
| 23 | |
| 24 | gl.linkProgram(program); |
| 25 | if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { |
| 26 | throw new Error(gl.getProgramInfoLog(program)); |
| 27 | } |
| 28 | |
| 29 | var wrapper = { |
| 30 | program: program |
| 31 | }; |
| 32 | |
| 33 | var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); |
| 34 | for (var i = 0; i < numAttributes; i++) { |
| 35 | var attribute = gl.getActiveAttrib(program, i); |
| 36 | wrapper[attribute.name] = gl.getAttribLocation(program, attribute.name); |
| 37 | } |
| 38 | var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); |
| 39 | for (var i$1 = 0; i$1 < numUniforms; i$1++) { |
| 40 | var uniform = gl.getActiveUniform(program, i$1); |
| 41 | wrapper[uniform.name] = gl.getUniformLocation(program, uniform.name); |
| 42 | } |
| 43 | |
| 44 | return wrapper; |
| 45 | } |
| 46 | |
| 47 | function createTexture(gl, filter, data, width, height) { |
| 48 | var texture = gl.createTexture(); |
no test coverage detected