|
| 1 | +# WebGL: Rendering a Simple 2D Square |
| 2 | + |
| 3 | +This experiment demonstrates the absolute basics of WebGL: setting up a canvas, |
| 4 | +defining vertex and fragment shaders, and rendering a static 2D square. |
| 5 | +There are no gradients, no animation, and no 3D effects-just a plain colored |
| 6 | +square. |
| 7 | + |
| 8 | +<canvas id="glcanvas" width="400" height="400" style="border:1px solid #ccc;"></canvas> |
| 9 | + |
| 10 | +<!-- Vertex Shader --> |
| 11 | +<script id="vertex-shader" type="x-shader/x-vertex"> |
| 12 | +attribute vec2 a_position; |
| 13 | +void main(void) { |
| 14 | + gl_Position = vec4(a_position, 0.0, 1.0); |
| 15 | +} |
| 16 | +</script> |
| 17 | + |
| 18 | +<!-- Fragment Shader --> |
| 19 | +<script id="fragment-shader" type="x-shader/x-fragment"> |
| 20 | +void main(void) { |
| 21 | + gl_FragColor = vec4(0.2, 0.6, 0.9, 1.0); // Solid blue-ish color |
| 22 | +} |
| 23 | +</script> |
| 24 | + |
| 25 | +<script> |
| 26 | +function getShader(gl, id) { |
| 27 | + const script = document.getElementById(id); |
| 28 | + const shaderString = script.text.trim(); |
| 29 | + let shader; |
| 30 | + if (script.type === "x-shader/x-vertex") { |
| 31 | + shader = gl.createShader(gl.VERTEX_SHADER); |
| 32 | + } else if (script.type === "x-shader/x-fragment") { |
| 33 | + shader = gl.createShader(gl.FRAGMENT_SHADER); |
| 34 | + } else { |
| 35 | + return null; |
| 36 | + } |
| 37 | + gl.shaderSource(shader, shaderString); |
| 38 | + gl.compileShader(shader); |
| 39 | + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { |
| 40 | + alert("Shader compile error: " + gl.getShaderInfoLog(shader)); |
| 41 | + return null; |
| 42 | + } |
| 43 | + return shader; |
| 44 | +} |
| 45 | + |
| 46 | +window.onload = function() { |
| 47 | + const canvas = document.getElementById("glcanvas"); |
| 48 | + const gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl"); |
| 49 | + if (!gl) { |
| 50 | + alert("WebGL not supported"); |
| 51 | + return; |
| 52 | + } |
| 53 | + |
| 54 | + // Compile shaders |
| 55 | + const vertexShader = getShader(gl, "vertex-shader"); |
| 56 | + const fragmentShader = getShader(gl, "fragment-shader"); |
| 57 | + |
| 58 | + // Create program |
| 59 | + const program = gl.createProgram(); |
| 60 | + gl.attachShader(program, vertexShader); |
| 61 | + gl.attachShader(program, fragmentShader); |
| 62 | + gl.linkProgram(program); |
| 63 | + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { |
| 64 | + alert("Could not initialize shaders"); |
| 65 | + return; |
| 66 | + } |
| 67 | + gl.useProgram(program); |
| 68 | + |
| 69 | + // Square vertices (two triangles) |
| 70 | + const vertices = new Float32Array([ |
| 71 | + -0.5, -0.5, |
| 72 | + 0.5, -0.5, |
| 73 | + 0.5, 0.5, |
| 74 | + -0.5, -0.5, |
| 75 | + 0.5, 0.5, |
| 76 | + -0.5, 0.5 |
| 77 | + ]); |
| 78 | + |
| 79 | + // Create buffer |
| 80 | + const buffer = gl.createBuffer(); |
| 81 | + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); |
| 82 | + gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); |
| 83 | + |
| 84 | + // Bind attribute |
| 85 | + const aPosition = gl.getAttribLocation(program, "a_position"); |
| 86 | + gl.enableVertexAttribArray(aPosition); |
| 87 | + gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0); |
| 88 | + |
| 89 | + // Draw |
| 90 | + gl.clearColor(1, 1, 1, 1); // White background |
| 91 | + gl.clear(gl.COLOR_BUFFER_BIT); |
| 92 | + gl.drawArrays(gl.TRIANGLES, 0, 6); |
| 93 | +}; |
| 94 | +</script> |
| 95 | + |
| 96 | + |
| 97 | +--- |
| 98 | + |
| 99 | +- **Author**: Dwij Bavisi <<dwij.bavisi@crabwire.net>> |
| 100 | +- **Published**: April 02, 2026, Project bloatware |
| 101 | +- **Conceived**: April 02, 2026, Thursday was boring so wanted to have fun... |
0 commit comments