miccull's shader library for simple React shaders.
Includes a WebGL manager, core utilities, and two React components for single‑pass and ping‑pong shaders.
npm install micugl
# or
bun add micuglimport React from "react";
import { BaseShaderComponent, createShaderConfig } from "micugl";
import vertexShader from "./shaders.vert";
import fragmentShader from "./shaders.frag";
const shaderConfig = createShaderConfig({
vertexShader,
fragmentShader,
uniformNames: {
u_myColor: "vec3",
},
});
export default function App() {
return (
<BaseShaderComponent
programId="my-shader"
shaderConfig={shaderConfig}
uniforms={{
time: { type: "float", value: (t) => t * 0.001 },
resolution: {
type: "vec2",
value: () => [window.innerWidth, window.innerHeight],
},
myColor: { type: "vec3", value: [1, 0, 0] },
}}
style={{ width: "100vw", height: "100vh" }}
/>
);
}-
WebGLManager
Low‑level wrapper around WebGLRenderingContext.new WebGLManager(canvas, options?)createProgram(id, config)→ compile/link shaderscreateBuffer(programId, attribute, data)setUniform(programId, name, value, type)prepareRender(programId, { clear?, clearColor? })drawArrays(...),drawElements(...)fbo: FBOManagerfor ping‑pong framebuffers
-
createShaderConfig- Builds a ShaderProgramConfig with defaults (
u_time,u_resolution). createShaderConfig({ vertexShader, fragmentShader, uniformNames?, attributeConfigs? })
- Builds a ShaderProgramConfig with defaults (
-
Utilities
FBOManagerfor multi‑render targetsPasses/Postprocessingto sequence render passes
| Prop | Type | Notes |
|---|---|---|
| programId | string | identifier for the shader |
| shaderConfig | ShaderProgramConfig | from createShaderConfig |
| uniforms | { [name]: { type: UniformType; value } } | static value or updater fn |
| renderOptions | { clear?: boolean; clearColor?: [r,g,b,a] } | default clears to black |
| useFastPath | boolean | skip callback for simple draw |
| useDevicePixelRatio | boolean | adapt canvas to DPR |
| Prop | Type | Notes |
|---|---|---|
| programId | string | first‑pass shader |
| secondaryShaderConfig | ShaderProgramConfig | ping‑pong second pass |
| iterations | number (default 1) | update/display cycles |
| uniforms | { [name]: { type; value } } | for primary pass |
| secondaryUniforms | { [name]: { type; value } } | for secondary pass |
| framebufferOptions | { width; height; textureCount; textureOptions } | default full‑canvas two‑texture FBO |
- useUniformUpdaters(programId, uniforms) → React memoized uniform updaters
- usePingPongPasses(options) → { passes, framebuffers } for engine
- useDarkMode() → boolean dark‑mode flag