Skip to main content

Introduction

What does it look like?

glre simplifies WebGL2 / WebGPU programming via TypeScript, React, Solid and more

4
import { createRoot } from 'react-dom/client'
import { useGL } from 'glre/react'
import { vec4, uv } from 'glre/node'
const Canvas = () => {
const gl = useGL({ fragment: vec4(uv, 0, 1) })
return <canvas ref={gl.ref} />
}

createRoot(document.getElementById('root')).render(<Canvas />)

Varying

Live Editor

function Canvas() {
      const tri = attribute([0, 0.73, -1, -1, 1, -1])
      const col = attribute([1, 0, 0, 0, 1, 0, 0, 0, 1])
      const gl = useGL({
              isWebGL: true,
              triangleCount: 1,
              vertex: vec4(tri, 0, 1),
              fragment: vec4(varying(col), 1),
      })
      return <canvas ref={gl.ref} />
}
Result
Loading...
Or as follows:
Live Editor

function Canvas() {
      const vCol = varying(vec3())
      const tri = attribute([0, 0.73, -1, -1, 1, -1])
      const col = attribute([1, 0, 0, 0, 1, 0, 0, 0, 1])
      const gl = useGL({
              isWebGL: true,
              triangleCount: 1,
              vertex: Scope(() => {
                      vCol.assign(col)
                      return vec4(tri, 0, 1)
              }),
              fragment: vec4(vCol, 1),
      })
      return <canvas ref={gl.ref} />
}
Result
Loading...

Uniforms

Live Editor

function Canvas() {
      const gl = useGL({
              isWebGL: true,
              fragment: vec4(uv.sub(iMouse).fract(), iTime.sin().mul(0.5).add(0.5), 1),
      })
      return <canvas ref={gl.ref} />
}
Result
Loading...

Attributes

Live Editor

function Canvas() {
      const tri = attribute([0, 0.73, -1, -1, 1, -1])
      const gl = useGL({
              isWebGL: true,
              triangleCount: 1,
              vertex: vec4(tri, 0, 1),
      })
      return <canvas ref={gl.ref} />
}
Result
Loading...

Multiples

Live Editor

function Canvas() {
      const tri = attribute([0, 0.37, -0.5, -0.5, 0.5, -0.5])
      const gl = useGL(
              {
                      isWebGL: true,
                      triangleCount: 1,
                      vertex: vec4(vec2(-0.5, 0).add(tri), 0, 1),
              },
              {
                      triangleCount: 1,
                      vertex: vec4(vec2(0.5, 0).add(tri), 0, 1),
              }
      )
      return <canvas ref={gl.ref} />
}
Result
Loading...

Textures

Live Editor

function Canvas() {
      const iTexture = uniform('https://avatars.githubusercontent.com/u/40712342')
      const gl = useGL({
              isWebGL: true,
              fragment: texture(iTexture, uv)
      })
      return <canvas ref={gl.ref} />
}
Result
Loading...

Instancing

Live Editor

function Canvas() {
      const tri = attribute([0, 0.73, -1, -1, 1, -1])
      const pos = instance(Array(1000 * 2).fill(0).map(Math.random))
      const gl = useGL({
              isWebGL: true,
              instanceCount: 1000,
              triangleCount: 1,
              vertex: vec4(tri.mul(0.05).sub(1).add(pos.mul(2)), 0, 1),
      })
      return <canvas ref={gl.ref} />
}
Result
Loading...

Computing

Live Editor

function Canvas() {
      const wave = storage(float(Array(1024)), 'wave')
      const gl = useGL({
              isWebGL: true,
              compute: Scope(() => {
                      If(uint(0).equal(id.x), () => {
                              wave.element(id.x).assign(iMouse.x)
                      }).Else(() => {
                              wave.element(id.x).assign(wave.element(id.x.sub(uint(1))))
                      })
              }),
              fragment: Scope(() => {
                      const x = wave.element(uint(uv.y.mul(1024))).sub(uv.x).abs()
                      return vec4(vec3(uv.step(vec2(smoothstep(0.01, 0, x))), 0), 1)
              }),
      })
      return <canvas ref={gl.ref} />
}
Result
Loading...