0.0.5 • Published 3 years ago

slgl v0.0.5

Weekly downloads
-
License
MIT
Repository
-
Last release
3 years ago

SLGL - TypeScript WebGL Utilities

Some typed convenience functions for working directly with shaders and WebGL.

Installation

Install with your favorite NodeJS package manager:

$ npm install slgl

$ yarn add slgl

Usage

Simple Fragment Shaders

Get started with fragment shaders with only a canvas and the fragment source:

import { glsl, createFragmentShaderProgram } from 'slgl'

const fragment_source = glsl`#version 300 es

precision highp float;
uniform vec2 resolution;
out vec4 color;

void main() {
	vec2 uv = gl_FragCoord.xy/resolution;
	color = vec4(uv.x, uv.y, 0.0, 1.0);
}`

const canvas = document.getElementById('canvas')
const { render } = createFragmentShaderCanvas(canvas, fragment_source)
render() // Call render any time you want to re-draw

Use resize observer to re-draw when the canvas size is changed:

const canvas_observer = new ResizeObserver(() => render())
canvas_observer.observe(canvas)

Animated Shaders

Use the LoopEngine class to drive animated shaders:

import { LoopEngine } from 'slgl'

const fragment_source = glsl`#version 300 es

precision highp float;
uniform vec2 resolution;
uniform float time;
out vec4 color;

void main() {
	vec2 uv = gl_FragCoord.xy/resolution;
	color = vec4(
		(sin(uv.x + time) + 1.0) / 2.0,
		(sin(uv.y + time + 5.0) + 1.0) / 2.0,
		0.0,
		1.0
	);
}`

// Get canvas element and device pixel ratio
const canvas = document.getElementById('canvas')
const devicePixelRatio = window.devicePixelRatio || 1

// Create the fragment shader program
const { program, createUniform, setResolution, draw } = createFragmentShaderProgram(gl, fragment_source)

// Create variables for program
let time = 0
const setTime = createUniform('1f', 'time')

// Update shader uniform for `resolution` any time the canvas resizes
const canvas_observer = new ResizeObserver(() => {
	const canvas_rect = canvas.getBoundingClientRect()
	const width = canvas.width = canvas_rect.width * devicePixelRatio
	const height = canvas.height = canvas_rect.height * devicePixelRatio
	setResolution([width, height])
})

// Create the loop engine
const engine = new LoopEngine()

// Create the program to animate the shader
engine.linkProgram({
	init() {
		time = 0 // Reset time each init
		canvas_observer.observe(canvas) // Start observing the canvas
	},
	destroy() {
		canvas_observer.unobserve(canvas) // Clean up observer
	},
	update(dt) {
		time += dt // Advance our time variable by the time delta passed by `LoopEngine`

		setTime(time) // Update the time uniform within the shader
	},
	render() {
		draw()
	}
})

// Start the engine
engine.init()

License

SLGL is MIT licensed.

0.0.5

3 years ago

0.0.4

3 years ago

0.0.3

3 years ago

0.0.2

3 years ago

0.0.1

3 years ago