開発環境 メモ帳
実行環境 Microsoft Edge


triangle1.html
<!doctype html>
<head>
<title>triangle1</title>
<script src="minMatrix.js"></script>
</head>
 
<body>
<canvas id="canvas"></canvas>
<script id="vs" type="text/x-vertex">
 
// 頂点シェイダー
attribute vec3 position;
attribute vec4 color;
uniform mat4 mvpMatrix;
varying vec4 vColor;
 
void main(void) {
	vColor = color;
	gl_Position = mvpMatrix * vec4(position, 1);
}
 
</script>
<script id="fs" type="text/x-fragment">
 
// 断片シェイダー
precision mediump float;
 
varying vec4 vColor;
 
void main(void) {
	gl_FragColor = vColor;
}
 
</script>
<script>
 
var gl;	// webgl context
var uniLocation;	// uniform mvpMatrix
var m = new matIV();
var mMatrix = m.identity(m.create());	// model
var pMatrix = m.identity(m.create());	// perspective
 
onload = function() {
	canvas.width = 640;
	canvas.height = 480;
 
	gl = canvas.getContext("experimental-webgl");
 
	var vPosition = [	// x, y, z
		0, 0, 0,
		0, 1, 0,
		1, 0, 0,
	];
	var vColor = [		// r, g, b, a
		1, 0, 0, 1,
		0, 1, 0, 1,
		0, 0, 1, 1,
	];
	var vIndex = [
		0, 1, 2,
	];
 
	var vShader = createShader("vs");
	var fShader = createShader("fs");
	var program = createProgram(vShader, fShader);
 
	setAttribute(program, "position", vPosition, 3);
	setAttribute(program, "color", vColor, 4);
	uniLocation = gl.getUniformLocation(program, "mvpMatrix");
 
	var ibo = gl.createBuffer();
	gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
	gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Int16Array(vIndex), gl.STATIC_DRAW);
 
	m.perspective(90, canvas.width / canvas.height, 0.1, 10, pMatrix);
 
	draw();
};
 
function draw() {
	gl.clearColor(0x64 / 0xff, 0x95 / 0xff, 0xed / 0xff, 1);
	gl.clearDepth(1);
	gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
 
	var vMatrix = m.identity(m.create());
	var mvpMatrix = m.identity(m.create());
 
	m.lookAt([0, 0, 2], [0, 0, 0], [0, 1, 0], vMatrix);
	m.multiply(pMatrix, vMatrix, mvpMatrix);
	m.multiply(mvpMatrix, mMatrix, mvpMatrix);
 
	gl.uniformMatrix4fv(uniLocation, false, mvpMatrix);
	gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0);
	gl.flush();
}
 
function createShader(id) {
	var element = document.getElementById(id);
	if (! element) return;
 
	const types = {
		"text/x-vertex": gl.VERTEX_SHADER,
		"text/x-fragment": gl.FRAGMENT_SHADER,
	};
	var shader = gl.createShader(types[element.type]);
	gl.shaderSource(shader, element.text);
	gl.compileShader(shader);
 
	if (! gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
		alert(gl.getShaderInfoLog(shader));
		return;
	}
	return shader;
}
 
function createProgram(vs, fs) {
	var program = gl.createProgram();
	gl.attachShader(program, vs);
	gl.attachShader(program, fs);
	gl.linkProgram(program);
 
	if (! gl.getProgramParameter(program, gl.LINK_STATUS)) {
		alert(gl.getProgramInfoLog(program));
		return;
	}
	gl.useProgram(program);
	return program;
}
 
function setAttribute(program, name, data, stride) {
	var location = gl.getAttribLocation(program, name);
	var vbo = gl.createBuffer();
 
	gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
	gl.enableVertexAttribArray(location);
	gl.vertexAttribPointer(location, stride, gl.FLOAT, false, 0, 0);
	gl.bindBuffer(gl.ARRAY_BUFFER, null);
}
 
</script>
</body>
 
最終更新:2016年02月13日 20:45