Atelier webgl
Atelier suite — 3D, WebGL & shader craft (the flagship layer). Build award-grade 3D and generative graphics: React Three Fiber + Drei scenes, hand-written GLSL/TSL shaders (fresnel, fbm noise, mesh gradients, distortion, dithering), WebGPU via WebGPURenderer, Spline integration, Gaussian splatting, faux-3D, and WebGL image hover/scroll distortion — always with lazy-loading, static fallbacks, and accessibility. Use whenever building 3D scenes, WebGL/Three.js/R3F, shaders/GLSL, a 3D or generative hero, product viewers, shader gradients/grain/distortion, Spline scenes, Gaussian-splat / radiance-field scenes, or interactive 3D graphics. Default stack: React Three Fiber + Drei; vanilla Three.js / OGL for non-React or shader-only work. Gate everything with atelier-perf-a11y. Part of the Atelier suite.From its SKILL.md
npx -y skills add luminary19/atelier --skill atelier-webglAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
10.3 KB, ~2.5k tokens by cl100k_base, as published. Nobody here has run it
Atelier — 3D, WebGL & Shaders
The highest-ceiling, highest-cost layer. A WebGL hero can be the thing people remember — or a multi-MB, inaccessible LCP disaster. The discipline: the 3D is a single earned moment, engineered with fallbacks, never the substrate of the page.
Project memory: if
ATELIER.mdexists, read its Interactivity level + Motion policy first (an award-grade signature moment must be sanctioned by the project's budget; set up via/atelier init— theatelierrouter).Inputs: the Direction Doc's signature moment + motion budget (this is award/creative-world spend). Default stack: React Three Fiber + Drei (vanilla Three noted). Gate:
atelier-perf-a11yis mandatory here — canvas is opaque to assistive tech and heavy on LCP/INP; production resilience (device/context-loss fallback, static poster, offline + reduced-motion paths) isatelier-hardenbefore that gate. For new flagship 3D, default to WebGPU (three/webgpu+ TSL,await renderer.init()) — zero-config since r171, a one-line swap with automatic WebGL2 fallback;WebGLRendereris now maintenance-only (still the mature baseline) — seereferences/shaders-glsl-tsl.mdandreferences/r3f-drei.md. Deep reference:references/fundamentals-deepdive.md(§2). Library versions move fast — verify current (≈ Three r184 · R3F v9 stable for React 19 · Drei ~10.7 at writing).Data —
atelier-data: a vetted Three.js do/don't table viascripts/search.py "<topic>" --stack threejs(version pitfalls, single-renderer-per-page, pixel-ratio cap). Implementation cross-check only.
Decide first: should this be WebGL at all?
Be honest about cost (full breakdown in references/integration-fallbacks.md):
- A 3D hero ships a big engine (Three core ~150KB+ gzip) + multi-MB assets + shader compile + a continuous rAF loop → hurts LCP, INP, battery, thermals.
- Canvas is invisible to assistive tech (not focusable, not readable), can trigger vestibular issues.
- Justified when the experience is the product (portfolios, agencies, product showcases, launches). A net negative as a decorative background on a content/conversion site — use a grainy CSS/SVG gradient or faux-3D instead.
- Often the right answer is faux-3D (image sequence, CSS/shader trick) — the 3D look without the WebGL cost.
If it's justified, proceed. Always build the fallback first.
Authored 3D geometry — delegate to Forge
When the signature moment needs authored 3D geometry — a specific product model, sculpt, organic form, parametric object, or baked-texture look-dev piece that can't be generated procedurally in GLSL/TSL — delegate the asset production to the standalone Forge suite (this skill still owns the web runtime):
- Read
ATELIER.md— confirm Interactivity: Award-grade (or the World explicitly calls for a 3D moment). If absent, run/atelier initfirst; don't spin up heavy authored 3D for a Production-world content site. Skill(forge)(the Forge router skill) — orAgent(forge-director)(the Agent tool,subagent_type: "forge-director") for the full brief→model→look-dev→render→export pipeline — passing the Direction Doc's aesthetic + the signature-moment description. (forge-directoris an agent, not a skill, so it is invoked with the Agent tool, neverSkill(...).)- Forge returns a web-ready pair:
public/forge/<slug>-hero.glb(DRACO or Meshopt geometry compression — they're mutually exclusive — plus KTX2 textures) +public/forge/<slug>-hero-poster.webp— the poster IS the reduced-motion / no-WebGL fallback. - Wire it with the
useGLTF+ poster-fallback pattern inreferences/r3f-drei.md; copy the local DRACO decoder topublic/draco/(and the KTX2/Basis transcoder topublic/basis/when textures are KTX2). Forge keeps its own asset gate (forge-validate); the web-runtime gate (LCP/CLS/INP, canvas DOM alternative) stays here →atelier-perf-a11y.
Run = call the tool. Writing "hand off to Forge" in prose does nothing — invoke Skill(forge) (the
router) or Agent(forge-director) (the full autonomous pipeline). Forge owns the asset
(geometry/materials/render); this skill owns the web scene (R3F, lazy-load, fallbacks, a11y). Always wire
the poster Forge produces — never omit the fallback.
The flow
- Confirm it's worth it → 2. R3F scene → 3. Shaders (GLSL/TSL) → 4. Integrate (Spline / faux-3D / DOM distortion) → 5. Lazy-load + fallback + a11y gate.
2. R3F scene
React Three Fiber renders JSX to a Three scene graph. Essentials + Drei helpers in
references/r3f-drei.md: <Canvas>, useFrame (mutate refs, never setState per frame),
useThree, Suspense loading; Drei <Environment> (IBL — makes PBR/glass look right), useGLTF,
<Html>, <Text>, <Instances>, <MeshTransmissionMaterial>, <PerformanceMonitor>/<AdaptiveDpr>.
Perf: instancing, dispose, clamp DPR ≤2, frameloop="demand" for static scenes.
3. Shaders (GLSL / TSL)
The substrate of the "WebGL look." Full recipes in references/shaders-glsl-tsl.md: vertex vs
fragment, uniforms/attributes/varyings, and copy-paste effects — gradient, fbm noise, fresnel rim,
UV distortion, dithering, mesh-gradient blob. How to attach (ShaderMaterial,
onBeforeCompile, Drei shaderMaterial()), animate uniforms each frame, and the modern TSL
(node-based, compiles to GLSL and WGSL) + WebGPURenderer path for future-proofing.
4. Integrate
In references/integration-fallbacks.md:
- Spline — no-code 3D via
@splinetool/react-spline; fast, but heavy payload → lazy-load, self-host the scene. - Faux-3D — image sequence on scroll, CSS 3D transforms, or a flat shader — the look without the cost.
- DOM image hover/scroll distortion — OGL / gpu-curtains (WebGPU; curtains.js is legacy) + GSAP-driven
uniforms; lives at the border with
atelier-scroll. - Scroll-driven 3D (scrubbed camera/timeline, pinned canvas, scene progress tied to scroll) — drive it
from
atelier-scroll(Lenis + ScrollTrigger) and feed the scroll progress intouseFrame/uniforms: this skill owns the scene,atelier-scrollowns the scroll plumbing. - Source images & textures (generate, don't stock-grab) — the image a shader distorts, plus matcaps,
gradient / dither / displacement maps, and sprite sheets, should be generated on the Direction Doc's
aesthetic via
/codex-imagegen(local Codex, no key), then compressed (KTX2/WebP) and lazy-loaded:$skills = if ($env:CLAUDE_CONFIG_DIR) { "$env:CLAUDE_CONFIG_DIR\skills" } else { "$env:USERPROFILE\.claude\skills" } & "$skills\codex-imagegen\scripts\codex-image.ps1" ` -Prompt "<texture / matcap / source-image prompt on the aesthetic>" -OutDir ".\public\tex" -Count 1 -Size 1024x1024-Transparentfor sprites/cut-outs. The same generated image is the static poster fallback for the no-WebGL / reduced-motion path — so it must exist regardless of the shader.
5. Lazy-load, fallback, gate (non-negotiable)
- Lazy-load the whole 3D bundle (dynamic import / below the fold); never block first paint with it.
- Pause the rАF loop offscreen (IntersectionObserver) and when the tab is hidden.
- Static poster fallback for no-WebGL/low-end/reduced-motion; DOM/text alternative for any content conveyed in the canvas (it's invisible to screen readers).
- Reduced motion → static render or poster. Clamp DPR ≤ 2, compress assets (DRACO/Meshopt/KTX2 —
loader-wiring snippet in
references/r3f-drei.md; feature-detect WebGPU withnavigator.gpubefore init). - Handle WebGPU device loss — the auto WebGL2 fallback only covers unsupported browsers at init. After
a successful init, listen for
renderer.getDevice?.().lost(ordevice.lost) — a GPU reset / driver crash / long backgrounding loses the device and blanks the canvas; on loss, re-init the renderer or swap to the static poster. - Run the full
atelier-perf-a11ygate — this layer is where perf/a11y most often breaks.
Operating principles
- One earned moment, never the substrate. Essential content/nav lives in the DOM, not the canvas.
- Build the fallback first — static poster + DOM alternative — then enhance to WebGL.
- R3F + Drei is the default; drop to vanilla Three/OGL for tiny shader-only widgets; consider faux-3D before real 3D.
- Default new work to TSL +
WebGPURenderer(three/webgpu,await renderer.init()) — write-once for WebGPU and WebGL2, with the automatic WebGL2 fallback. WebGPU hit Baseline (Jan 2026) but is only ~87% desktop / ~71% mobile and not yet full parity → the WebGL2 fallback is mandatory, not optional; verify on it.WebGLRendererstays the mature/compatible baseline (maintenance-only). - Perf/a11y is mandatory here — lazy-load, pause offscreen, clamp DPR, provide alternatives. Gate with
atelier-perf-a11y.
What ships with it: 4 files
154.4 KB alongside SKILL.md
references/
- fundamentals-deepdive.md135.5 KB
- integration-fallbacks.md4.3 KB
- r3f-drei.md8.4 KB
- shaders-glsl-tsl.md6.1 KB