diff --git a/_assets/javascript/shaderCanvas.js b/_assets/javascript/shaderCanvas.js
new file mode 100644
index 0000000..2e9d113
--- /dev/null
+++ b/_assets/javascript/shaderCanvas.js
@@ -0,0 +1,50 @@
+// STEP 1: Prepare the canvas and get WebGL context
+var vertShaderSource = document.getElementById("vertex-shader").text;
+var fragShaderSource = document.getElementById("fragment-shader").text;
+var canvas = document.getElementById('shader-canvas');
+var gl = canvas.getContext('webgl', {
+ antialias: false,
+ depth: false
+});
+// STEP 2: define geometry and store it in buffer objects
+var verticies = [-1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0];
+var vertex_buffer = gl.createBuffer();
+gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
+gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verticies), gl.STATIC_DRAW);
+gl.bindBuffer(gl.ARRAY_BUFFER, null)
+// STEP 3: Create and compile shader programs
+// Vert shader:
+//var vertCode =
+// 'attribute vec2 coordinates;' +
+// 'void main(void) {' +
+// ' gl_Position = vec4(coordinates, 0.0, 1.0);' +
+// '}';
+var vertCode = vertShaderSource;
+var vertShader = gl.createShader(gl.VERTEX_SHADER);
+gl.shaderSource(vertShader, vertCode);
+gl.compileShader(vertShader);
+// Frag shader:
+// var fragCode = 'void main(void) {' +
+ // 'gl_FragColor = vec4(0.0, 0.3, 0.5, 1.0);' +
+// '}';
+var fragCode = fragShaderSource;
+var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
+gl.shaderSource(fragShader, fragCode);
+gl.compileShader(fragShader);
+// combine shaders:
+var shaderProgram = gl.createProgram();
+gl.attachShader(shaderProgram, vertShader);
+gl.attachShader(shaderProgram, fragShader);
+gl.linkProgram(shaderProgram);
+gl.useProgram(shaderProgram);
+// STEP 4: Associate the shader program to buffer objects
+gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
+var coord = gl.getAttribLocation(shaderProgram, "coordinates");
+gl.vertexAttribPointer(coord, 2, gl.FLOAT, false, 0, 0);
+gl.enableVertexAttribArray(coord);
+// STEP 5: Draw the object:
+gl.clearColor(0.0, 0.0, 0.0, 1.0);
+gl.enable(gl.DEPTH_TEST);
+gl.clear(gl.COLOR_BUFFER_BIT);
+gl.viewport(0, 0, canvas.width, canvas.height);
+gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);
diff --git a/_assets/javascript/shaderCanvas2.js b/_assets/javascript/shaderCanvas2.js
new file mode 100644
index 0000000..1e3c100
--- /dev/null
+++ b/_assets/javascript/shaderCanvas2.js
@@ -0,0 +1,760 @@
+/*
+ * Copyright 2012, Gregg Tavares.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Gregg Tavares. nor the names of his
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+"use strict";
+
+/** @module webgl-utils */
+// These funcitions are meant solely to help unclutter the tutorials.
+// They are not meant as production type functions.
+
+//(function() {
+
+/**
+ * Wrapped logging function.
+ * @param {string} msg The message to log.
+ */
+var log = function(msg) {
+ if (window.console && window.console.log) {
+ window.console.log(msg);
+ }
+};
+
+/**
+ * Wrapped logging function.
+ * @param {string} msg The message to log.
+ */
+var error = function(msg) {
+ if (window.console) {
+ if (window.console.error) {
+ window.console.error(msg);
+ }
+ else if (window.console.log) {
+ window.console.log(msg);
+ }
+ }
+};
+
+/**
+ * Turn off all logging.
+ */
+var loggingOff = function() {
+ log = function() {};
+ error = function() {};
+};
+
+/**
+ * Check if the page is embedded.
+ * @return {boolean} True of we are in an iframe
+ */
+var isInIFrame = function() {
+ return window != window.top;
+};
+
+/**
+ * Converts a WebGL enum to a string
+ * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.
+ * @param {number} value The enum value.
+ * @return {string} The enum as a string.
+ */
+var glEnumToString = function(gl, value) {
+ for (var p in gl) {
+ if (gl[p] == value) {
+ return p;
+ }
+ }
+ return "0x" + value.toString(16);
+};
+
+/**
+ * Creates the HTLM for a failure message
+ * @param {string} canvasContainerId id of container of th
+ * canvas.
+ * @return {string} The html.
+ */
+var makeFailHTML = function(msg) {
+ return '' +
+ '
' +
+ '' +
+ '' +
+ ' ' + msg + ' ' +
+ ' ' +
+ ' |
';
+};
+
+/**
+ * Mesasge for getting a webgl browser
+ * @type {string}
+ */
+var GET_A_WEBGL_BROWSER = '' +
+ 'This page requires a browser that supports WebGL.
' +
+ 'Click here to upgrade your browser.';
+
+/**
+ * Mesasge for need better hardware
+ * @type {string}
+ */
+var OTHER_PROBLEM = '' +
+ "It doesn't appear your computer can support WebGL.
" +
+ 'Click here for more information.';
+
+/**
+ * Creates a webgl context. If creation fails it will
+ * change the contents of the container of the