const canvas = document.getElementById('webglCanvas');
const gl = canvas.getContext('webgl');
const canvasWidth = 600;
const canvasHeight = 400;
canvas.width = canvasWidth;
canvas.height = canvasHeight;
const vsSource = `
attribute vec4 a_position;
uniform vec2 u_translation;
void main() {
gl_Position = a_position + vec4(u_translation, 0.0, 0.0);
}
`;
const fsSource = `
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;
const vs = gl.createShader(gl.VERTEX_SHADER);
const fs = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(vs, vsSource);
gl.shaderSource(fs, fsSource);
gl.compileShader(vs);
gl.compileShader(fs);
const program = gl.createProgram();
gl.attachShader(program, vs);
gl.attachShader(program, fs);
gl.linkProgram(program);
gl.useProgram(program);
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
const positions = new Float32Array([
-0.5, -0.5,
0.5, -0.5,
-0.5, 0.5,
0.5, 0.5
]);
gl.bufferData(gl.ARRAY_BUFFER, positions,
gl.STATIC_DRAW);
const positionLocation = gl.getAttribLocation(program,
'a_position');
const translationLocation = gl.getUniformLocation(program,
'u_translation');
gl.enableVertexAttribArray(positionLocation);
gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
let translation = [0, 0];
let speed = 0.01;
function render() {
gl.clear(gl.COLOR_BUFFER_BIT);
translation[0] += speed;
if (translation[0] > 1 || translation[0] < -1) {
speed = -speed;
}
gl.uniform2fv(translationLocation, translation);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
requestAnimationFrame(render);
}
gl.viewport(0, 0, canvasWidth, canvasHeight);
gl.clearColor(0.0, 0.0, 0.0, 1.0);
render();