Lightweight, type-safe WebGL wrapper with a clean, modern API.
Simple, intuitive interface for WebGL operations
Pure TypeScript with no external dependencies
Full TypeScript support with comprehensive types
Built for ES modules and modern browsers
Low-level control when you need it
~10KB compiled, small bundle size
npm install gl-lite
import { GLRenderer } from 'gl-lite';
// Create a renderer
const renderer = new GLRenderer({
canvas: document.querySelector('canvas'),
});
// Create a shader program
const program = renderer.program({
vert: `...`,
frag: `...`,
});
// Render
renderer.clear([0, 0, 0, 1]);
program.draw();
Main entry point for creating a WebGL context and managing resources.
new GLRenderer(params)
renderer.resize(width, height)
renderer.clear([r, g, b, a])
renderer.program(definition)
renderer.texture(params)
renderer.buffer(params)
renderer.framebuffer(texture)
Manages shaders, uniforms, and attributes.
program.draw(props)
program.use(() => { ... })
program.dispose()
Handles texture creation and management.
renderer.texture(params)
texture.bind(unit)
texture.update(params)
texture.resize(width, height)
texture.dispose()
Manages vertex and index buffers.
renderer.buffer(params)
buffer.update(data)
buffer.use(() => { ... })
buffer.dispose()
Render-to-texture functionality.
renderer.framebuffer(texture)
fbo.use(() => { ... })
fbo.dispose()
const program = renderer.program({
frag: `
uniform float time;
uniform vec2 resolution;
// ... shader code
`,
uniforms: {
time: (props) => props.time,
resolution: (props) => [props.width, props.height],
},
});
program.draw({ time, width, height });
const image = new Image();
image.onload = () => {
const texture = renderer.texture({
data: image,
flipY: true,
});
program.draw({ tex: texture });
};
image.src = 'image.png';
const positions = new Float32Array([
-0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5,
]);
const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);
const program = renderer.program({
attributes: {
position: {
buffer: renderer.buffer({ data: positions }),
size: 2,
},
},
elements: renderer.buffer({
target: 'element',
data: indices,
}),
count: indices.length,
});
program.draw();