Skip to content

Commit 7f1da1d

Browse files
committed
Add WebGL experiment demonstrating basic 2D square rendering
1 parent e68c5f8 commit 7f1da1d

1 file changed

Lines changed: 101 additions & 0 deletions

File tree

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
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

Comments
 (0)