diff --git a/www/draw-scene.js b/www/draw-scene.js new file mode 100644 index 0000000..f470ae4 --- /dev/null +++ b/www/draw-scene.js @@ -0,0 +1,88 @@ +function drawScene(gl, programInfo, buffers) { + gl.clearColor(0.0, 0.0, 0.0, 1.0); // Clear to black, fully opaque + gl.clearDepth(1.0); // Clear everything + gl.enable(gl.DEPTH_TEST); // Enable depth testing + gl.depthFunc(gl.LEQUAL); // Near things obscure far things + + // Clear the canvas before we start drawing on it. + + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + + // Create a perspective matrix, a special matrix that is + // used to simulate the distortion of perspective in a camera. + // Our field of view is 45 degrees, with a width/height + // ratio that matches the display size of the canvas + // and we only want to see objects between 0.1 units + // and 100 units away from the camera. + + const fieldOfView = (45 * Math.PI) / 180; // in radians + const aspect = gl.canvas.clientWidth / gl.canvas.clientHeight; + const zNear = 0.1; + const zFar = 100.0; + const projectionMatrix = mat4.create(); + + // note: glMatrix always has the first argument + // as the destination to receive the result. + mat4.perspective(projectionMatrix, fieldOfView, aspect, zNear, zFar); + + // Set the drawing position to the "identity" point, which is + // the center of the scene. + const modelViewMatrix = mat4.create(); + + // Now move the drawing position a bit to where we want to + // start drawing the square. + mat4.translate( + modelViewMatrix, // destination matrix + modelViewMatrix, // matrix to translate + [-0.0, 0.0, -6.0], + ); // amount to translate + + // Tell WebGL how to pull out the positions from the position + // buffer into the vertexPosition attribute. + setPositionAttribute(gl, buffers, programInfo); + + // Tell WebGL to use our program when drawing + gl.useProgram(programInfo.program); + + // Set the shader uniforms + gl.uniformMatrix4fv( + programInfo.uniformLocations.projectionMatrix, + false, + projectionMatrix, + ); + gl.uniformMatrix4fv( + programInfo.uniformLocations.modelViewMatrix, + false, + modelViewMatrix, + ); + + { + const offset = 0; + const vertexCount = 4; + gl.drawArrays(gl.TRIANGLE_STRIP, offset, vertexCount); + } +} + +// Tell WebGL how to pull out the positions from the position +// buffer into the vertexPosition attribute. +function setPositionAttribute(gl, buffers, programInfo) { + const numComponents = 2; // pull out 2 values per iteration + const type = gl.FLOAT; // the data in the buffer is 32bit floats + const normalize = false; // don't normalize + const stride = 0; // how many bytes to get from one set of values to the next + // 0 = use type and numComponents above + const offset = 0; // how many bytes inside the buffer to start from + gl.bindBuffer(gl.ARRAY_BUFFER, buffers.position); + gl.vertexAttribPointer( + programInfo.attribLocations.vertexPosition, + numComponents, + type, + normalize, + stride, + offset, + ); + gl.enableVertexAttribArray(programInfo.attribLocations.vertexPosition); +} + +export { drawScene }; + diff --git a/www/init-buffers.js b/www/init-buffers.js new file mode 100644 index 0000000..cb9db0c --- /dev/null +++ b/www/init-buffers.js @@ -0,0 +1,29 @@ +function initBuffers(gl) { + const positionBuffer = initPositionBuffer(gl); + + return { + position: positionBuffer, + }; +} + +function initPositionBuffer(gl) { + // Create a buffer for the square's positions. + const positionBuffer = gl.createBuffer(); + + // Select the positionBuffer as the one to apply buffer + // operations to from here out. + gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); + + // Now create an array of positions for the square. + const positions = [1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, -1.0]; + + // Now pass the list of positions into WebGL to build the + // shape. We do this by creating a Float32Array from the + // JavaScript array, then use it to fill the current buffer. + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW); + + return positionBuffer; +} + +export { initBuffers }; + diff --git a/www/shader.html b/www/shader.html new file mode 100644 index 0000000..26d87f4 --- /dev/null +++ b/www/shader.html @@ -0,0 +1,18 @@ + + + +
+ +