{
const canvas = DOM.canvas(256, 256);
const gl = canvas.getContext('webgl');
const vertexShaderSrc = `
attribute vec4 position;
uniform float uAngle;
mat2 rotate2d(float _angle){
return mat2(cos(_angle),-sin(_angle),
sin(_angle),cos(_angle));
}
void main() {
vec2 rotatedPosition = rotate2d(uAngle) * position.xy;
gl_Position = vec4(rotatedPosition.xy, position.zw); // define vertex position
}
`
const fragmentShaderSrc = `
precision mediump float;
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // fill the triangle with red color
}
`
let program = gl.createProgram();
let vShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vShader, vertexShaderSrc);
gl.compileShader(vShader);
let fShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fShader, fragmentShaderSrc);
gl.compileShader(fShader);
gl.attachShader(program, vShader);
gl.attachShader(program, fShader);
gl.linkProgram(program);
var vertices = vertices = new Float32Array([
Math.cos(0), Math.sin(0),
Math.cos(2 * Math.PI/3), Math.sin(2 * Math.PI/3),
Math.cos(2 * Math.PI/3 * 2), Math.sin(2 * Math.PI/3 * 2)]);
var vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
var vertexLocation = gl.getAttribLocation(program, 'position');
var uAngleUniformLocation = gl.getUniformLocation(program, 'uAngle');
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
let startTime = +new Date;
while (true) {
var curDuration = +new Date - startTime;
gl.clear(gl.COLOR_BUFFER_BIT);
gl.useProgram(program);
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.vertexAttribPointer( vertexLocation, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(vertexLocation);
gl.uniform1f(uAngleUniformLocation, curDuration/1000);
gl.drawArrays(gl.TRIANGLES, 0, 3);
yield canvas;
}
}