Interactive_Computer_Graphi.../Uebung_21122023/Quad/main.js

90 lines
2.2 KiB
JavaScript
Raw Normal View History

2023-12-19 20:04:36 +00:00
let gl;
let program;
let positions, colors;
let posVBO, colorVBO;
let lastTimestamp;
async function main() {
// 1. Get canvas and setup WebGL context
const canvas = document.getElementById("gl-canvas");
gl = canvas.getContext("webgl2");
// 2. Configure viewport
gl.viewport(0, 0, canvas.width, canvas.height);
gl.clearColor(1.0, 1.0, 1.0, 1.0);
// 4. Init shader program via additional function and bind it
program = await initShaders(gl, "shaders/simple.vert.glsl", "shaders/simple.frag.glsl");
gl.useProgram(program);
initTriangle();
window.requestAnimationFrame(render);
}
function initTriangle() {
//prettier-ignore
// 3. Specify geometry
positions = [ -1.0, -1.0,
-1.0, 1.0,
1.0, -1.0,
1.0, 1.0,
-1.0, 1.0,
1.0, -1.0];
//prettier-ignore
colors = [ 0, 1, 0, 1,
0, 0, 1, 1,
1, 1, 0, 1,
1, 0, 0, 1,
0, 0, 1, 1,
1, 1, 0, 1];
initTriangleBuffers();
}
function initTriangleBuffers() {
// 5.1 Create VBO for positions and activate it
posVBO = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, posVBO);
// 6.1 Fill VBO with positions
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
// 5.2 Create VBO for colors and activate it
colorVBO = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, colorVBO);
// 6.2 Fill VBO with colors
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
}
function renderTriangle() {
// 7.1 Link data in VBO to shader variables
gl.bindBuffer(gl.ARRAY_BUFFER, posVBO);
const posLoc = gl.getAttribLocation(program, "vPosition");
gl.enableVertexAttribArray(posLoc);
gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0);
// 7.2 Link data in VBO to shader variables
gl.bindBuffer(gl.ARRAY_BUFFER, colorVBO);
const colorLoc = gl.getAttribLocation(program, "vColor");
gl.enableVertexAttribArray(colorLoc);
gl.vertexAttribPointer(colorLoc, 4, gl.FLOAT, false, 0, 0);
// 8. Render
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, 6);
}
function render(timestamp) {
const elapsed = timestamp - lastTimestamp;
renderTriangle();
lastTimestamp = timestamp;
window.requestAnimationFrame(render);
}
window.onload = async function () {
main();
};