webgl-plot
Live demo ๐
webgl-plot
multi-line high-performance 2D plotting library using native WebGL. The advantages are:
- Simple and efficient 2D WebGL library
- Using WebGL native line drawing
- High update rate which matches the screen's refresh rate
- Works for both dynamic and static data
- Full control over the color of each line in each frame
- No dependencies
- Works on any browser/platform that supports WebGL
- Compatible with OffScreenCanvas and WebWorkers for offloading cpu time from the main thread
- Ideal for embedded systems with low resources or large datasets
Use cases
Dynamic: When plotting real-time multiple waveforms are required. For example, software-based oscilloscopes, Arduino, microcontrollers, FPGA user interfaces. This framework also can be used in combination with ElectronJS.
Static: Enables rapid pan and zoom capability for inspecting very large datasets. See the static example
Limitations
cannot change the line width due to the OpenGL implementation of a line. The OpenGL specification only guarantees a minimum of a single pixel line width. There are other solutions to increase the line width however they substantially increase the size of the data vector and take a hit on the performance. Top performance (refresh rate, memory, etc) is the top priority for this library.
Getting started
Create an HTML canvas with an appropriate width or height:
Import WebGL-Plot library using ES6 modules:
Prepare the canvas
Initialization:
Add the line to webgl canvas:
Configure the requestAnimationFrame call:
Add the update function:
Demos
See examples based on vanilla JS at webgl-plot-examples
See examples based on React
See SPAD Simulation which use WebGL-Plot as an oscilloscope display
React Examples
For a basic React example see here:
React website is under development...
https://webgl-plot-react.vercel.app/ โ
JS Bundle
To use WebGL-Plot as a JS pre-bundled package first import the following in your HTML file:
See examples on how to use this bundle in Codepen and JSfiddle
For ES6 module and direct browser import use:
and in your-code.js:
Thanks to TimDaub for testing the ES6 module.
Notice that this method is only recommended for test and small codes.
API Documentation
See here ๐
How to use with embedded systems applications?
You can use WebUSB, Web Bluetooth, and Serial API. You can use ComPort for a basic implementation of Serial API
Build
License
MIT