minimal inline reactive glsl auto-binding signals no boilerplate tag template literals
- Premise
- Bindings
- Install
- Use it
- API
signal-gllow level abstraction around webglsignal-gl/worldgame engine built on top ofsignal-gl
- Syntax Highlighting
- Prior Art
Minimalabstraction- Minimizing gap between
jsandglsl - Composition of
glslsnippets - Lessen boilerplate with
auto-bindinguniforms and attributes andsensibledefaults 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-glHello 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-gllow level abstraction around webglsignal-gl/worldgame 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