const vs = `
attribute vec2 aPosition;
attribute vec3 aColor;
varying vec3 vColor;
void main() {
gl_Position = vec4( aPosition, 1.0, 1.0 );
vColor = aColor;
gl_PointSize = 4.0;
}
`;
const fs = `
precision mediump float;
varying vec3 vColor;
void main() {
gl_FragColor = vec4( vColor, 1.0 );
}
`;
const gl = document.querySelector("#glcanvas").getContext("webgl");
// Compile program
// ===================
var program = gl.createProgram();
var vShader = gl.createShader( gl.VERTEX_SHADER );
var fShader = gl.createShader( gl.FRAGMENT_SHADER );
gl.attachShader( program, vShader );
gl.attachShader( program, fShader );
gl.shaderSource( vShader, vs );
gl.compileShader( vShader );
gl.shaderSource( fShader, fs );
gl.compileShader( fShader );
gl.linkProgram( program );
gl.useProgram( program );
// Create points datas
// ===================
const NUM_POINTS = 0xFF;
var data = new Float32Array( NUM_POINTS * 5);
for (var i = 0; i < NUM_POINTS; i++) {
var j = i*5;
data[j+0] = Math.random()*2.0 - 1.0; // x
data[j+1] = Math.random()*2.0 - 1.0; // y
data[j+2] = Math.random(); // r
data[j+3] = Math.random(); // g
data[j+4] = Math.random(); // b
};
// Setup ArrayBuffer
// ===================
var buffer = gl.createBuffer();
gl.bindBuffer( gl.ARRAY_BUFFER, this.buffer );
gl.bufferData( gl.ARRAY_BUFFER, data, gl.STATIC_DRAW );
var aPos = gl.getAttribLocation( program, 'aPosition' );
gl.enableVertexAttribArray( aPos );
gl.vertexAttribPointer( aPos, 2, gl.FLOAT, false, 5*4, 0 );
var aCol = gl.getAttribLocation( program, 'aColor' );
gl.enableVertexAttribArray( aCol );
gl.vertexAttribPointer( aCol, 3, gl.FLOAT, false, 5*4, 2*4 );
// Draw
// ===================
gl.drawArrays( gl.POINTS, 0, NUM_POINTS );
canvas { border: 1px solid black; margin: 2px; }
<canvas id="glcanvas"></canvas>