Introduction
What does it look like?
glre simplifies WebGl2 / WebGPU programming via TypeScript, React, Solid and more | ![]() |
- React
- React Native
- Solid.js
- ESM
import { createRoot } from 'react-dom/client'
import { useGL } from 'glre/react'
import { vec4, uv } from 'glre/node'
const Canvas = () => {
const gl = useGL({ frag: vec4(uv, 0, 1) })
return <canvas ref={gl.ref} />
}
createRoot(document.getElementById('root')).render(<Canvas />)
import { GLView } from 'expo-gl'
import { registerRootComponent } from 'expo'
import { useGL } from 'glre/native'
import { vec4, uv } from 'glre/node'
const Canvas = () => {
const gl = useGL({ frag: vec4(uv, 0, 1) })
return <GLView style={{ flex: 1 }} onContextCreate={gl.ref} />
}
registerRootComponent(Canvas)
import { render } from 'solid-js/web'
import { onGL } from 'glre/solid'
import { vec4, uv } from 'glre/node'
const Canvas = () => {
const gl = onGL({ frag: vec4(uv, 0, 1) })
return <canvas ref={gl.ref} />
}
render(() => <Canvas />, document.getElementById('root'))
<canvas id="canvas"></canvas>
<script type="module">
import { createGL } from 'https://esm.sh/glre'
import { vec4, uv } from 'https://esm.sh/glre/node'
const el = document.getElementById('canvas')
createGL({ el, fs: vec4(uv, 0, 1) }).mount()
</script>
Varying
- TSL (TypeScript Shading Language)
- WebGL
- WebGPU
ライブエディター
function Canvas() { const a_position = attribute([0, 0.73, -1, -1, 1, -1]) const a_color = attribute([1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1]) const gl = useGL({ count: 3, width: 256, height: 256, isWebGL: true, vert: vec4(a_position, 0.0, 1.0), frag: vertexStage(a_color), }) return <canvas ref={gl.ref} /> }
結果
Loading...
ライブエディター
function Canvas() { const gl = useGL({ count: 3, width: 256, height: 256, isWebGL: true, vertex: ` #version 300 es in vec4 a_position; in vec4 a_color; out vec4 v_color; void main() { gl_Position = a_position; v_color = a_color; } `, fragment: ` #version 300 es precision mediump float; in vec4 v_color; out vec4 fragColor; void main() { fragColor = v_color; } `, }) gl.attribute('a_position', [0, 0.73, -1, -1, 1, -1]) gl.attribute('a_color', [1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1]) return <canvas ref={gl.ref} /> }
結果
Loading...
ライブエディター
function Canvas() { const gl = useGL({ count: 3, width: 256, height: 256, isWebGL: false, vertex: ` struct In { @location(0) a_position: vec2f, @location(1) a_color: vec4f, } struct Out { @builtin(position) position: vec4f, @location(0) v_color: vec4f, } @vertex fn main(in: In) -> Out { var out: Out; out.position = vec4f(in.a_position, 0.0, 1.0); out.v_color = in.a_color; return out; } `, fragment: ` struct Out { @builtin(position) position: vec4f, @location(0) v_color: vec4f, } @fragment fn main(out: Out) -> @location(0) vec4f { return out.v_color; } `, }) gl.attribute('a_position', [0, 0.73, -1, -1, 1, -1]) gl.attribute('a_color', [1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1]) return <canvas ref={gl.ref} /> }
結果
Loading...
Uniforms
- TSL (TypeScript Shading Language)
- WebGL
- WebGPU
ライブエディター
function Canvas() { const gl = useGL({ width: 256, height: 256, isWebGL: true, frag: vec4(uv.sub(iMouse).fract(), 0, 1), }) return <canvas ref={gl.ref} /> }
結果
Loading...
ライブエディター
function Canvas() { const gl = useGL({ width: 256, height: 256, isWebGL: true, fragment: ` #version 300 es precision mediump float; uniform vec2 iResolution; uniform vec2 iMouse; uniform float iTime; out vec4 fragColor; void main() { vec2 uv = fract(gl_FragCoord.xy / iResolution.xy - iMouse); fragColor = vec4(uv, sin(iTime) * 0.5 + 0.5, 1.0); } `, }) return <canvas ref={gl.ref} /> }
結果
Loading...
ライブエディター
function Canvas() { const gl = useGL({ width: 256, height: 256, isWebGL: false, fragment: ` @group(0) @binding(0) var<uniform> iResolution: vec2f; @group(0) @binding(1) var<uniform> iMouse: vec2f; @group(0) @binding(2) var<uniform> iTime: f32; @fragment fn main(@builtin(position) position: vec4f) -> @location(0) vec4f { let uv = fract(position.xy / iResolution - iMouse); return vec4f(uv, sin(iTime) * 0.5 + 0.5, 1.0); } `, }) return <canvas ref={gl.ref} /> }
結果
Loading...
Attributes
- TSL (TypeScript Shading Language)
- WebGL
- WebGPU
ライブエディター
function Canvas() { const a_position = attribute([0, 0.73, -1, -1, 1, -1]) const gl = useGL({ count: 3, width: 256, height: 256, isWebGL: true, vert: vec4(a_position, 0, 1), }) return <canvas ref={gl.ref} /> }
結果
Loading...
ライブエディター
function Canvas() { const gl = useGL({ count: 3, width: 256, height: 256, isWebGL: true, vertex: ` #version 300 es in vec4 a_position; void main() { gl_Position = a_position; } `, }) gl.attribute('a_position', [0, 0.73, -1, -1, 1, -1]) return <canvas ref={gl.ref} /> }
結果
Loading...
ライブエディター
function Canvas() { const gl = useGL({ count: 3, width: 256, height: 256, isWebGL: false, vertex: ` @vertex fn main(@location(0) position: vec2f) -> @builtin(position) vec4f { return vec4f(position, 0.0, 1.0); } `, }) gl.attribute('a_position', [0, 0.73, -1, -1, 1, -1]) return <canvas ref={gl.ref} /> }
結果
Loading...
Textures
- TSL (TypeScript Shading Language)
- WebGL
- WebGPU
ライブエディター
function Canvas() { const iTexture = uniform('https://avatars.githubusercontent.com/u/40712342') const gl = useGL({ width: 256, height: 256, isWebGL: true, frag: texture(iTexture, uv), }) return <canvas ref={gl.ref} /> }
結果
Loading...
ライブエディター
function Canvas() { const gl = useGL({ width: 256, height: 256, isWebGL: true, fragment: ` #version 300 es precision mediump float; uniform vec2 iResolution; uniform sampler2D iTexture; out vec4 fragColor; void main() { vec2 uv = gl_FragCoord.xy / iResolution.xy; fragColor = texture(iTexture, uv); } `, }) gl.texture('iTexture', 'https://avatars.githubusercontent.com/u/40712342') return <canvas ref={gl.ref} /> }
結果
Loading...
ライブエディター
function Canvas() { const gl = useGL({ width: 256, height: 256, isWebGL: false, fragment: ` @group(0) @binding(0) var<uniform> iResolution: vec2f; @group(1) @binding(0) var iSampler: sampler; @group(1) @binding(1) var iTexture: texture_2d<f32>; @fragment fn main(@builtin(position) position: vec4f) -> @location(0) vec4f { let uv = position.xy / iResolution; return textureSample(iTexture, iSampler, uv); } `, }) gl.texture('iTexture', 'https://avatars.githubusercontent.com/u/40712342') return <canvas ref={gl.ref} /> }
結果
Loading...