Source: gfx/core/renderers/webgl/shaders/TextureShader.js

var Shader = require('./Shader');

/**
 * @class
 * @extends Shader
 * @param shaderManager {ShaderManager} The webgl shader manager this shader works for.
 * @param [vertexSrc] {string} The source of the vertex shader.
 * @param [fragmentSrc] {string} The source of the fragment shader.
 * @param [customUniforms] {object} Custom uniforms to use to augment the built-in ones.
 * @param [fragmentSrc] {string} The source of the fragment shader.
 */
function TextureShader(shaderManager, vertexSrc, fragmentSrc, customUniforms, customAttributes) {
  var uniforms = {

    uSampler: { type: 'sampler2D', value: 0 },
    projectionMatrix: { type: 'mat3', value: new Float32Array([1, 0, 0,
      0, 1, 0,
      0, 0, 1]) },
  };

  if (customUniforms) {
    for (var u in customUniforms) {
      uniforms[u] = customUniforms[u];
    }
  }


  var attributes = {
    aVertexPosition: 0,
    aTextureCoord: 0,
    aColor: 0,
  };

  if (customAttributes) {
    for (var a in customAttributes) {
      attributes[a] = customAttributes[a];
    }
  }

    /**
     * The vertex shader.
     *
     * @member {string}
     */
  vertexSrc = vertexSrc || TextureShader.defaultVertexSrc;

    /**
     * The fragment shader.
     *
     * @member {string}
     */
  fragmentSrc = fragmentSrc || TextureShader.defaultFragmentSrc;

  Shader.call(this, shaderManager, vertexSrc, fragmentSrc, uniforms, attributes);
}

// constructor
TextureShader.prototype = Object.create(Shader.prototype);
TextureShader.prototype.constructor = TextureShader;
module.exports = TextureShader;

/**
 * The default vertex shader source
 *
 * @static
 * @constant
 */
TextureShader.defaultVertexSrc = [
  'precision lowp float;',
  'attribute vec2 aVertexPosition;',
  'attribute vec2 aTextureCoord;',
  'attribute vec4 aColor;',

  'uniform mat3 projectionMatrix;',

  'varying vec2 vTextureCoord;',
  'varying vec4 vColor;',

  'void main(void){',
  '   gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);',
  '   vTextureCoord = aTextureCoord;',
  '   vColor = vec4(aColor.rgb * aColor.a, aColor.a);',
  '}',
].join('\n');

/**
 * The default fragment shader source
 *
 * @static
 * @constant
 */
TextureShader.defaultFragmentSrc = [
  'precision lowp float;',

  'varying vec2 vTextureCoord;',
  'varying vec4 vColor;',

  'uniform sampler2D uSampler;',

  'void main(void){',
  '   gl_FragColor = texture2D(uSampler, vTextureCoord) * vColor ;',
  '}',
].join('\n');