WebGL is funny – programming in very low level style in JavaScript. This sample plots 86T points using this technology. .
The code is very straightforward, the only thing is to how points are initially loaded and scaled (instead of reloading each time when map moves).
All points are initially transformed to tile size of 256 x 256 pixels at zoom level 0 and then re-scaled/re-shifted based on the current position of the map. drawingOnCanvas is called from L.CanvasOverlay each time map needs to be drawn (move, zoom)
function drawingOnCanvas(canvasOverlay, params) { gl.clear(gl.COLOR_BUFFER_BIT); // -- set base matrix to translate canvas pixel coordinates -> webgl coordinates mapMatrix.set(pixelsToWebGLMatrix); var bounds = leafletMap.getBounds(); var topLeft = new L.LatLng(bounds.getNorth(), bounds.getWest()); var offset = LatLongToPixelXY(topLeft.lat, topLeft.lng); // -- Scale to current zoom var scale = Math.pow(2, leafletMap.getZoom()); scaleMatrix(mapMatrix, scale, scale); translateMatrix(mapMatrix, -offset.x, -offset.y); // -- attach matrix value to 'mapMatrix' uniform in shader gl.uniformMatrix4fv(u_matLoc, false, mapMatrix); gl.drawArrays(gl.POINTS, 0, numPoints); }
More information and insipiration I took from this site
demo here: http://bl.ocks.org/sumbera/c6fed35c377a46ff74c3
For polygons rendering check here and for polyline rendering here
Some good intros to WebGL that might help you to understand the code: http://aerotwist.com/presentations/custom-filters/#/6
There is a nice intro book to WebGL WebGL Programming Guide by Kouchi Matsuda and Rodger Lea
To illustrate how variables are passed from JavaScript to shaders used in above example, here are two figures from the book- figure 5.7 on p. 149, and figure 5.3 on p.144.

Stride and Offset
This figure shows single buffer (interleaved)that is used fro both coordinates and size. In similar way single buffer is constructed in the example here:
var vertBuffer = gl.createBuffer(); var vertArray = new Float32Array(verts); var fsize = vertArray.BYTES_PER_ELEMENT; gl.bindBuffer(gl.ARRAY_BUFFER, vertBuffer); gl.bufferData(gl.ARRAY_BUFFER, vertArray, gl.STATIC_DRAW); gl.vertexAttribPointer(vertLoc, 2, gl.FLOAT, false,fsize*5,0); gl.enableVertexAttribArray(vertLoc); // -- offset for color buffer gl.vertexAttribPointer(colorLoc, 3, gl.FLOAT, false, fsize*5, fsize*2); gl.enableVertexAttribArray(colorLoc);

behavior of a varying variable