square.html 4.93 KB
<html>
	<head>
		<title>First very simple WebGL example...</title>

		<script src="./gl-matrix-min.js" type="text/javascript"></script>

		<script type="text/javascript">
			var projectionMatrix, modelViewMatrix;
			var shaderProgram, shaderVertexPositionAttribute;
			var shaderProjectionMatrixUniform, shaderModelViewMatrixUniform;

			function initWebGL(canvas) {
				var gl = null;
				var msg = "Your browser does not support WebGL, " +
					"or it is not enabled by default.";
				try {
					gl = canvas.getContext("experimental-webgl");
				}
				catch (e) {
					msg = "Error creating WebGL Context!: " + e.toString();
				}
				if (!gl) {
					alert(msg);
					throw new Error(msg);
				}

				return gl;
			}

			function initViewport(gl, canvas) {
				gl.viewport(0, 0, canvas.width, canvas.height);
			}

			// Create the vertex data for a square to be drawn
			function createSquare(gl) {
				var vertexBuffer;
				vertexBuffer = gl.createBuffer();
				gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
				var verts = [
					.5,  .5,  0.0,
					-.5, .5,  0.0,
					.5,  -.5, 0.0,
					-.5, -.5, 0.0
				];
				gl.bufferData(
						gl.ARRAY_BUFFER,
						new Float32Array(verts),
						gl.STATIC_DRAW);
				var square = {
					buffer:vertexBuffer,
					vertSize:3,
					nVerts:4,
					primtype:gl.TRIANGLE_STRIP};
				return square;
			}

			function initMatrices(canvas) {
				// Create a model view matrix with camera at 0, 0, −3.333
				modelViewMatrix = mat4.create();
				mat4.translate(
						modelViewMatrix, modelViewMatrix, [0, 0, -3.333]);

				// Create a project matrix with 45 degree field of view
				projectionMatrix = mat4.create();
				mat4.perspective(projectionMatrix, Math.PI / 4,
						canvas.width / canvas.height, 1, 10000);
			}

			function createShader(gl, id, type) {
				var shader;
				var str = document.getElementById(id).text;
				if (type == "fragment") {
					shader = gl.createShader(gl.FRAGMENT_SHADER);
				} else if (type == "vertex") {
					shader = gl.createShader(gl.VERTEX_SHADER);
				} else {
					return null;
				}

				gl.shaderSource(shader, str);
				gl.compileShader(shader);

				if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
					alert(gl.getShaderInfoLog(shader));
					return null;
				}

				return shader;
			}

			function initShader(gl, vertex, fragment) {
				// load and compile the fragment and vertex shader
				var fragmentShader = createShader(gl, fragment, "fragment");
				var vertexShader = createShader(gl, vertex, "vertex");

				// link them together into a new program
				shaderProgram = gl.createProgram();
				gl.attachShader(shaderProgram, vertexShader);
				gl.attachShader(shaderProgram, fragmentShader);
				gl.linkProgram(shaderProgram);

				// get pointers to the shader params
				shaderVertexPositionAttribute = gl.getAttribLocation(
						shaderProgram, "vertexPos");
				gl.enableVertexAttribArray(shaderVertexPositionAttribute);

				shaderProjectionMatrixUniform = gl.getUniformLocation(
						shaderProgram, "projectionMatrix");
				shaderModelViewMatrixUniform = gl.getUniformLocation(
						shaderProgram, "modelViewMatrix");

				if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
					alert("Could not initialise shaders");
				}
			}

			function draw(gl, obj) {
				// clear the background (with black)
				gl.clearColor(0.0, 0.0, 0.0, 1.0);
				gl.clear(gl.COLOR_BUFFER_BIT);

				// set the vertex buffer to be drawn
				gl.bindBuffer(gl.ARRAY_BUFFER, obj.buffer);

				// set the shader to use
				gl.useProgram(shaderProgram);

				// connect up the shader parameters: vertex position and
				// projection/model matrices
				gl.vertexAttribPointer(
						shaderVertexPositionAttribute,
						obj.vertSize,
						gl.FLOAT, false, 0, 0);
				gl.uniformMatrix4fv(
						shaderProjectionMatrixUniform,
						false, projectionMatrix);
				gl.uniformMatrix4fv(
						shaderModelViewMatrixUniform, false, modelViewMatrix);

				// draw the object
				gl.drawArrays(obj.primtype, 0, obj.nVerts);
			}

			function startGl() {
				// Get A WebGL context
				var canvas = document.getElementById("square");
				var gl = initWebGL(canvas);
				var obj = createSquare(gl);

				initViewport(gl, canvas);
				initMatrices(canvas);
				initShader(
						gl,
						"square-vertex-shader",
						"square-fragment-shader");
				draw(gl, obj);
			}
		</script>

		<script id="square-vertex-shader" type="x-shader/x-vertex">
			attribute vec3 vertexPos;
			uniform mat4 modelViewMatrix;
			uniform mat4 projectionMatrix;
			void main(void) {
				// Return the transformed and projected vertex value
				gl_Position =
					projectionMatrix * modelViewMatrix * vec4(vertexPos, 1.0);
			}
		</script>

		<script id="square-fragment-shader" type="x-shader/x-fragment">
			void main(void) {
				// Return the pixel color: always output white
				gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
			}
		</script>
	</head>

	<body onLoad="startGl()">
		<canvas id="square" width="200" height="200"></canvas>
	</body>
</html>
<!-- vim: set ts=4 sw=4: -->