Create GlSl Circle with animated wave
by yiiBoy
HTML
<!--
<script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.8.1/gl-matrix-min.js"></script>
-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.4.0/gl-matrix-min.js"></script>
<canvas id="canvas" width="640" height="480"></canvas>
JavaScript
function createShader(gl, type, source) {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
console.error('Shader compilation error:', gl.getShaderInfoLog(shader));
gl.deleteShader(shader);
return null;
}
return shader;
}
function createProgram(gl, vertexShader, fragmentShader) {
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
console.error('Program linking error:', gl.getProgramInfoLog(program));
gl.deleteProgram(program);
return null;
}
return program;
}
function createCircle(gl, radius, segments) {
const vertices = [];
const indices = [];
vertices.push(0, 0, 0); // Center vertex
for (let i = 0; i <= segments; i++) {
const theta = i * 2 * Math.PI / segments;
const x = radius * Math.cos(theta);
const y = radius * Math.sin(theta);
vertices.push(x, y, 0);
}
for (let i = 1; i <= segments; i++) {
indices.push(0, i, i + 1);
}
return { vertices, indices };
}
function createBuffer(gl, target, data, usage) {
const buffer = gl.createBuffer();
gl.bindBuffer(target, buffer);
gl.bufferData(target, data, usage);
gl.bindBuffer(target, null);
return buffer;
}
function createShaderProgram(gl) {
// Create the vertex shader
const vertexShaderSource = `
attribute vec3 a_position;
uniform mat4 u_modelViewMatrix;
uniform mat4 u_projectionMatrix;
varying vec3 v_position;
void...