Source: dependencies/pixi-gl-core/shader/compileProgram.js

dependencies/pixi-gl-core/shader/compileProgram.js

  1. /**
  2. * @class
  3. * @memberof PIXI.glCore.shader
  4. * @param gl {WebGLRenderingContext} The current WebGL context {WebGLProgram}
  5. * @param vertexSrc {string|string[]} The vertex shader source as an array of strings.
  6. * @param fragmentSrc {string|string[]} The fragment shader source as an array of strings.
  7. * @param attributeLocations {Object} An attribute location map that lets you manually set the attribute locations
  8. * @return {WebGLProgram} the shader program
  9. */
  10. var compileProgram = function(gl, vertexSrc, fragmentSrc, attributeLocations)
  11. {
  12. var glVertShader = compileShader(gl, gl.VERTEX_SHADER, vertexSrc);
  13. var glFragShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSrc);
  14. var program = gl.createProgram();
  15. gl.attachShader(program, glVertShader);
  16. gl.attachShader(program, glFragShader);
  17. // optionally, set the attributes manually for the program rather than letting WebGL decide..
  18. if(attributeLocations)
  19. {
  20. for(var i in attributeLocations)
  21. {
  22. gl.bindAttribLocation(program, attributeLocations[i], i);
  23. }
  24. }
  25. gl.linkProgram(program);
  26. // if linking fails, then log and cleanup
  27. if (!gl.getProgramParameter(program, gl.LINK_STATUS))
  28. {
  29. console.error('Pixi.js Error: Could not initialize shader.');
  30. console.error('gl.VALIDATE_STATUS', gl.getProgramParameter(program, gl.VALIDATE_STATUS));
  31. console.error('gl.getError()', gl.getError());
  32. // if there is a program info log, log it
  33. if (gl.getProgramInfoLog(program) !== '')
  34. {
  35. console.warn('Pixi.js Warning: gl.getProgramInfoLog()', gl.getProgramInfoLog(program));
  36. }
  37. gl.deleteProgram(program);
  38. program = null;
  39. }
  40. // clean up some shaders
  41. gl.deleteShader(glVertShader);
  42. gl.deleteShader(glFragShader);
  43. return program;
  44. };
  45. /**
  46. * @private
  47. * @param gl {WebGLRenderingContext} The current WebGL context {WebGLProgram}
  48. * @param type {Number} the type, can be either VERTEX_SHADER or FRAGMENT_SHADER
  49. * @param vertexSrc {string|string[]} The vertex shader source as an array of strings.
  50. * @return {WebGLShader} the shader
  51. */
  52. var compileShader = function (gl, type, src)
  53. {
  54. var shader = gl.createShader(type);
  55. gl.shaderSource(shader, src);
  56. gl.compileShader(shader);
  57. if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
  58. {
  59. console.log(gl.getShaderInfoLog(shader));
  60. return null;
  61. }
  62. return shader;
  63. };
  64. module.exports = compileProgram;