minimal
inline
reactive
glsl
auto-binding
signals
no boilerplate
tag template literals
- Premise
- Bindings
- Install
- Use it
- API
signal-gl
low level abstraction around webglsignal-gl/world
game engine built on top ofsignal-gl
- Syntax Highlighting
- Prior Art
Minimal
abstraction- Minimizing gap between
js
andglsl
- Composition of
glsl
snippets - Lessen boilerplate with
auto-binding
uniforms and attributes andsensible
defaults Purely runtime
: no additional build tools- Small footprint:
<5kb minified + gzip
Currently there are only solid
bindings, but the dependency on solid
is minimal. If this idea has any merit it would be trivial to make bindings for other signal implementations.
npm i @bigmistqke/signal-gl
# or
pnpm i @bigmistqke/signal-gl
# or
yarn add @bigmistqke/signal-gl
Hello World [playground]
hello_world.mov
const [opacity, setOpacity] = createSignal(0.5)
const vertices = new Float32Array([
-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0,
])
const fragment = glsl`#version 300 es
precision mediump float;
in vec2 v_coord;
out vec4 outColor;
void main() {
float opacity = ${uniform.float(opacity)};
outColor = vec4(v_coord[0], v_coord[1], v_coord[0], opacity);
}`
const vertex = glsl`#version 300 es
out vec2 v_coord;
out vec3 v_color;
void main() {
vec2 a_coord = ${attribute.vec2(vertices)};
v_coord = a_coord;
gl_Position = vec4(a_coord, 0, 1) ;
}`
return (
<Stack onMouseMove={(e) => setOpacity(e.clientY / e.currentTarget.offsetHeight)}>
<Program fragment={fragment} vertex={vertex} mode="TRIANGLES" />
</Stack>
)
signal-gl
low level abstraction around webglsignal-gl/world
game engine built on top ofsignal-gl
use in combination with tag template literal syntax highlighting: see glsl-literal syntax higlighting for vs-code
these libraries could be of interest if you are looking for stable and well-tested webgl libraries