agentsclimarketplace

Atelier webgl

Skill luminary19/atelier/skills/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

Install
npx -y skills add luminary19/atelier --skill atelier-webgl

Assembled 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.md exists, 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 — the atelier router).

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-a11y is 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) is atelier-harden before 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; WebGLRenderer is now maintenance-only (still the mature baseline) — see references/shaders-glsl-tsl.md and references/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 via scripts/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):

  1. Read ATELIER.md — confirm Interactivity: Award-grade (or the World explicitly calls for a 3D moment). If absent, run /atelier init first; don't spin up heavy authored 3D for a Production-world content site.
  2. Skill(forge) (the Forge router skill) — or Agent(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-director is an agent, not a skill, so it is invoked with the Agent tool, never Skill(...).)
  3. 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.webpthe poster IS the reduced-motion / no-WebGL fallback.
  4. Wire it with the useGLTF + poster-fallback pattern in references/r3f-drei.md; copy the local DRACO decoder to public/draco/ (and the KTX2/Basis transcoder to public/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

  1. 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 into useFrame/uniforms: this skill owns the scene, atelier-scroll owns 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
    
    -Transparent for 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 with navigator.gpu before init).
  • Handle WebGPU device loss — the auto WebGL2 fallback only covers unsupported browsers at init. After a successful init, listen for renderer.getDevice?.().lost (or device.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-a11y gate — 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. WebGLRenderer stays 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

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.