eπi +1 = 0
i² = j² = k² = ijk = -1
WebGL is 3D*
*pretty much
3D is models
Models are triangles
JavaScriptCreate Context/Canvas Compile shaders Data control Draw commands GLSLShader program Vertex shader transform vertices Fragment (pixel) shader transform pixels |
Your html page will look something this...
<html>
<head>
<!-- place holders for glsl code -- coming soon -->
<script id="vertex" type="x-shader/x-vertex">
</script>
<script id="fragment" type="x-shader/x-fragment">
</script>
<script type="text/javascript">
</script>
</head>
<body>
<canvas id="glCanvas"></canvas>
</body>
</html>
Obvs, JavaScript can go in separate .js file
Shaders can be loaded with XHR
attribute vec2 aVertex;
attribute vec3 aColour;
varying vec3 vColour;
void main() {
vColour = aColour;
gl_Position = vec4(aVertex, 0.0, 1.0);
}
Simple fragment shader
precision mediump float;
varying vec3 vColour;
void main() {
gl_FragColor = vec4(vColour, 1.0);
}
var names = ["webgl", "experimental-webgl", "webkit-3d", "moz-webgl"];
for (var i = 0; i < names.length; ++i) {
try {
gl = canvas.getContext(names[i]);
}
catch (e) { }
if (gl) break;
}
Compile, attach and link shader programs
var v = document.getElementById("vertex").firstChild.nodeValue;
var f = document.getElementById("fragment").firstChild.nodeValue;
var vs = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vs, v);
gl.compileShader(vs);
var fs = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fs, f);
gl.compileShader(fs);
programInfo.id = gl.createProgram();
gl.attachShader(programInfo.id, vs);
gl.attachShader(programInfo.id, fs);
gl.linkProgram(programInfo.id);
if (!gl.getShaderParameter(vs, gl.COMPILE_STATUS))
console.log(gl.getShaderInfoLog(vs));
if (!gl.getShaderParameter(fs, gl.COMPILE_STATUS))
console.log(gl.getShaderInfoLog(fs));
if (!gl.getProgramParameter(program, gl.LINK_STATUS))
console.log(gl.getProgramInfoLog(program));
gl.useProgram(shaderProgram);
Get data location
programInfo.aVertex = gl.getAttribLocation(programInfo.id, "aVertex");
programInfo.aColour = gl.getAttribLocation(programInfo.id, "aColour");
Define shape data
var vertices = new Float32Array([ 0.5, 0.5,
-0.5, 0.5,
-0.5, -0.5]);
var colours = new Float32Array([0, 0, 1,
1, 0, 0,
0, 1, 0]);
bufferInfo.id = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.id);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
gl.vertexAttribPointer(programInfo.aVertex, bufferInfo.itemSize, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(programInfo.aVertex);
Send "clear" and "draw" instructions
gl.clearColor(0.8, 0.8, 1.0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, bufferInfo.numItems);