Build WebGL Liquid Glass
Create a real refractive material while keeping text and controls crisp above the lens.
Workflow
- Inspect the existing framework, styling conventions, target background, and browser support.
- Install
liquid-glwith the repository's package manager. - Adapt
assets/react/WebGLLiquidGlass.tsx,webgl-liquid-glass.css, andliquid-gl.d.tsfor React projects. Preserve the same DOM layering in other frameworks. - Keep the WebGL target empty. Put readable content in a sibling overlay; never place text inside the rasterized lens target.
- Point
snapshotSelectorat the real visual background, not the glass card or the whole app when avoidable. - Initialize after the target and background assets exist. Register animated or replaceable backgrounds with
liquidGL.registerDynamic(). - Preserve a CSS
backdrop-filterfallback and legible foreground colors when WebGL is unavailable. - Verify the result over light, dark, and high-frequency backgrounds. Drag or scroll the surface and confirm refraction stays aligned.
Default Tuning
Start with the asset defaults:
resolution: 1.5refraction: 0.007aberration: 0.03bevelDepth: 0.075bevelWidth: 0.18frost: 2.2magnify: 1.006shadow: false,specular: true,tilt: false
Read references/tuning.md before changing these values or adding several lenses.
Quality Gates
- Keep content as DOM text above the lens. Reject duplicated, blurred, or chromatically split text.
- Avoid hard clipping, detached refraction, stale snapshots, black canvases, and visible shader seams.
- Keep the surface dimensions stable during loading and interaction.
- Reduce resolution and disable expensive options before replacing the WebGL approach.
- Respect
prefers-reduced-motion; do not add tilt or elastic motion by default. - Test Chromium desktop and a mobile viewport. Check the console and confirm the fallback remains usable.
Fallback Choice
Use $build-sdf-liquid-glass only when the user explicitly selects D/SDF, WebGL is unavailable, or many simultaneous glass surfaces make the shared GPU renderer inappropriate.
