docs: function() {
  		var gl = this.gl;
  
  		var fragmentShaderSource = [
  			"precision mediump float;",
  			"uniform sampler2D bgTexture;",
  			"uniform sampler2D spriteTexture;",
  			"uniform sampler2D prioTexture;",
  			"uniform sampler2D paletteTexture;",
  			"uniform vec4 bgColor;",
  			"varying vec2 texCoord;",
  
  			"void main(void) {",
  				"float bgIndex = texture2D(bgTexture, texCoord).r;",
  				"float spriteIndex = texture2D(spriteTexture, texCoord).r;",
  				"float prioIndex = texture2D(prioTexture, texCoord).r;",
  				"float colorIndex = ((spriteIndex > 0.0 && (prioIndex == 0.0 || bgIndex == 0.0)) ? spriteIndex : bgIndex);",
  				"vec4 color = texture2D(paletteTexture, vec2( colorIndex * 4.0 + 0.0078, 0.5));", // 0.0078 == ( 0.5 * 3 / 192 ) === ( 0.5 * [RGB colors] / [palette width] )
  				"if ( colorIndex > 0.0 ) {",
  					"gl_FragColor = color;",
  				"} else {",
  					"gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);",
  					"gl_FragColor = bgColor;",
  				"}",
  			"}"
  		].join("\n");
  
  		var vertexShaderSource = [
  			"attribute vec2 vertCoord;",
  			"varying vec2 texCoord;",
  
  			"void main() {",
  				"gl_Position = vec4(vertCoord, 0, 1);",
  				"texCoord = vec2( 0.5 * ( vertCoord.x + 1.0 ), 0.5 * (1.0 - vertCoord.y));",
  			"}"
  		].join("");
  
  		this.fragmentShader = compileShader( gl.FRAGMENT_SHADER, fragmentShaderSource );
  		this.vertexShader = compileShader( gl.VERTEX_SHADER, vertexShaderSource );
  
  		function compileShader( shaderType, shaderSource ) {
  			var shader = gl.createShader( shaderType );
  			gl.shaderSource( shader, shaderSource );
  			gl.compileShader( shader );
  
  			if ( !gl.getShaderParameter( shader, gl.COMPILE_STATUS ) ) {  
  				throw ( "An error occurred compiling the shaders: " + gl.getShaderInfoLog( shader ) );
  			}
  
  			return shader;
  		}
  	}