--- name: glsl-shader-expert description: "Expert guide for modern web shaders: Three Shading Language (TSL), WebGPU WGSL, Compute Shaders, and WebGL GLSL in Three.js and Babylon.js. Covers procedural generation, compute kernels, and post-processing / Panduan ahli shader web modern: TSL, WGSL, Compute Shader, dan GLSL." author: "Roedy Rustam" version: "4.4.2" --- # Modern Web Shader Expert (TSL, WGSL, Compute Shaders & GLSL) [English](#english) | [Bahasa Indonesia](#bahasa-indonesia) --- ## English ### Orchestration & Integration Connects and orchestrates with relevant domain skills: - `web-3d-graphics-expert` — WebGPU/WebGL scene rendering and NodeMaterial binding. - `web-game-engine-expert` — Physics simulations, particle systems, and VFX materials. - `ui-ux-pro-max` — Modern visual effects, glassmorphism, and screen-space distortion. - `visual-ui-auditor` — Visual validation of shader effects, color spaces, and post-processing aesthetics. - `anti-slop` — Anti-slop graphics enforcement, eliminating cheap neon glow and unoptimized fullscreen blurs. - `performance-web-vitals` — GPU profiling, draw call reduction, and compute shader optimization. ### Description Production-grade guidance for authoring, compiling, and optimizing GPU shaders for modern web applications. Focuses on the cutting-edge **TSL (Three Shading Language)** node system which cross-compiles to both **WGSL (WebGPU)** and **GLSL (WebGL2)**, standalone **WGSL Compute Shaders** for parallel processing (particles, boids, simulation), and legacy **GLSL** optimization. ### Trigger Conditions Activate this skill when the user is: - Writing custom shader materials in Three.js or Babylon.js. - Refactoring legacy GLSL shaders to Three Shading Language (TSL) or WebGPU WGSL. - Implementing WebGPU Compute Shaders (`@compute` workgroups, storage buffers). - Creating procedural VFX: fluid simulations, volumetric clouds, noise-based terrain, or holographic shields. - Designing post-processing screen passes (bloom, chromatic aberration, SSAO/GTAO, depth of field). - Optimizing GPU bottlenecks, thread divergence, or ALU instruction counts. --- ### Modern Web Shader Paradigms (2026) | Paradigm | Target API | Key Advantages | When to Use | | :--- | :--- | :--- | :--- | | **TSL (Three Shading Language)** | WebGPU + WebGL2 | Cross-compiles node trees to WGSL and GLSL; type-safe JavaScript/TypeScript syntax. | Default standard for modern Three.js (r170+) materials and post-processing. | | **WGSL (WebGPU Shading Language)** | WebGPU native | Direct GPU memory access, structured storage buffers, atomic operations. | Raw WebGPU apps, Babylon.js WebGPU compute, custom WebGPU pipelines. | | **Compute Shaders** | WebGPU | General-purpose GPU (GPGPU) computing; runs without rasterization or vertex buffers. | 100,000+ particle systems, cloth physics, fluid simulation, GPU boids. | | **GLSL (ES 3.0)** | WebGL2 fallback | Universal device compatibility on legacy hardware. | Legacy Three.js/Babylon.js projects and fallback pipelines. | --- ### 1. Three Shading Language (TSL) Node System TSL replaces string-concatenated GLSL with modular, type-safe node expressions that Three.js automatically compiles to WGSL on WebGPU and GLSL on WebGL2. ```typescript import * as THREE from 'three/webgpu'; import { Fn, float, vec3, color, uv, time, positionLocal, sin, uniform } from 'three/tsl'; // Define custom dynamic uniforms const uFrequency = uniform(3.0); const uSpeed = uniform(1.5); // Reusable TSL shader function (Node-based) const waterWave = Fn(([freq, spd]) => { const coord = uv(); const wave = sin(coord.x.mul(freq).add(time.mul(spd))) .add(sin(coord.y.mul(freq).add(time.mul(spd)))) .mul(0.5); return wave; }); // Vertex Position displacement in TSL const displacedPosition = Fn(() => { const wave = waterWave(uFrequency, uSpeed); const newPos = positionLocal.add(vec3(0.0, wave.mul(0.2), 0.0)); return newPos; }); // Create Node Material const oceanMaterial = new THREE.MeshStandardNodeMaterial(); oceanMaterial.positionNode = displacedPosition(); oceanMaterial.colorNode = Fn(() => { const wave = waterWave(uFrequency, uSpeed); const baseColor = color(0x004488); const foamColor = color(0x88eeff); return baseColor.mix(foamColor, wave.add(0.5)); })(); ``` --- ### 2. WebGPU Compute Shaders (GPGPU Parallel Processing) Compute shaders run arbitrary mathematical workloads across thousands of GPU threads simultaneously: ```typescript import * as THREE from 'three/webgpu'; import { Fn, float, vec3, uniform, storage, instanceIndex } from 'three/tsl'; const PARTICLE_COUNT = 65536; // Create GPU Storage Buffers const positionBuffer = new THREE.StorageBufferAttribute(new Float32Array(PARTICLE_COUNT * 3), 3); const velocityBuffer = new THREE.StorageBufferAttribute(new Float32Array(PARTICLE_COUNT * 3), 3); const posStorage = storage(positionBuffer, 'vec3', PARTICLE_COUNT); const velStorage = storage(velocityBuffer, 'vec3', PARTICLE_COUNT); // TSL Compute Kernel (executes per particle on GPU) const computeParticles = Fn(() => { const index = instanceIndex; const pos = posStorage.element(index); const vel = velStorage.element(index); // Update position based on velocity pos.addAssign(vel.mul(0.016)); // Bounce off boundaries [-5, 5] vel.y.assign(pos.y.lessThan(-5.0).select(vel.y.abs(), vel.y)); vel.y.assign(pos.y.greaterThan(5.0).select(vel.y.abs().negate(), vel.y)); })().compute(PARTICLE_COUNT); // In the render loop: // renderer.compute(computeParticles); // renderer.render(scene, camera); ``` --- ### 3. Babylon.js Node Material & WebGPU WGSL Compute Shader Babylon.js compiles Node Materials (NME) to WGSL on WebGPU and GLSL on WebGL2. For raw mathematical simulation, Babylon.js provides first-class native WGSL compute shaders: ```typescript import { Scene, Mesh, NodeMaterial, ComputeShader, StorageBuffer, UniformBuffer } from '@babylonjs/core'; export async function initBabylonNodeAndCompute(scene: Scene, targetMesh: Mesh) { // 1. Node Material: Type-safe visual shader graph const nodeMaterial = new NodeMaterial('oceanNodeMat', scene); await nodeMaterial.loadAsync('https://assets.babylonjs.com/materials/nme/ocean.json'); nodeMaterial.build(false); targetMesh.material = nodeMaterial; // 2. Native WebGPU WGSL Compute Shader const wgslSource = ` struct Particle { position : vec3, velocity : vec3, }; @group(0) @binding(0) var particles : array; @compute @workgroup_size(64) fn main(@builtin(global_invocation_id) global_id : vec3) { let index = global_id.x; particles[index].position += particles[index].velocity * 0.016; } `; const computeShader = new ComputeShader( 'particleCompute', scene.getEngine(), { computeSource: wgslSource }, { bindingsMapping: { particles: { group: 0, binding: 0 } } } ); return { nodeMaterial, computeShader }; } ``` --- ### 4. High-Performance Shader Rules (GPU Architecture) 1. **Eliminate Branching Divergence:** - GPU threads execute in lockstep warps (NVIDIA: 32 threads, AMD/Apple: 32-64 threads). - If threads inside the same warp take different branches in an `if/else`, both paths are evaluated serially, destroying throughput. - **Use Math Primitives:** Replace branches with `step()`, `smoothstep()`, `mix()`, `clamp()`, or `select()`. ```glsl // BAD: Divergent GPU branch if (vDepth > 0.5) { color = vec3(1.0); } else { color = vec3(0.0); } // GOOD: Branchless step function color = vec3(step(0.5, vDepth)); ``` 2. **Precision Management:** - Always specify precision for mobile GPUs. - Use `mediump` (16-bit float) for colors, normal vectors, and UVs to gain 2x arithmetic throughput and save bandwidth. - Reserve `highp` (32-bit float) for world-space coordinates and depth calculations. 3. **Precompute on CPU or Vertex Shader:** - Never compute values in the fragment shader (millions of pixels) that are constant across the mesh or linear across vertices. - Move matrix inversions, static lighting directions, or uniform transformations to the CPU or Vertex stage. ### Sovereign Execution, Token Efficiency & Invariants | Dimension | Sovereign Mandate & Deterministic Contract | | :--- | :--- | | **Frontier Model Cascade** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) | | **Availability Fallback** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Zero unhandled missing-model errors) | | **KV-Cache & Token Protocol** | Pin static instructions & schemas at prompt prefix (`kv-cache-prefix-optimizer`); pass surgical `CONTEXT_MAP.md` slices (<250 tokens/call) during Swarm Fan-Out | | **SaaT CLI & MCP Dispatch** | CLI: `vibes skill exec glsl-shader-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` | | **NFR & Anti-Slop Invariants** | P99 API Gateway Latency < 85ms, OpenAPI 3.1 / TypeSpec strict schema parity, RFC 9457 Problem Details error contracts, Idempotency-Key enforcement; 100% complete zero-placeholder output verified via `node scripts/check-anti-slop.js --strict` | --- --- ## Bahasa Indonesia ### Integrasi Orkestrasi Terhubung dan mengorkestrasi skill domain yang relevan: - `web-3d-graphics-expert` — Rendering scene WebGPU/WebGL dan integrasi NodeMaterial. - `web-game-engine-expert` — Simulasi fisika, sistem partikel, dan material efek game. - `ui-ux-pro-max` — Efek visual modern, glassmorphism, dan distorsi screen-space. - `visual-ui-auditor` — Validasi visual efek shader, ruang warna, dan estetika post-processing. - `anti-slop` — Penegakan anti-slop grafis, membasmi neon glow murahan dan blur fullscreen tanpa optimasi. - `performance-web-vitals` — Profiling GPU, optimasi draw call, dan compute shader. ### Deskripsi Panduan produksi untuk menulis, mengompilasi, dan mengoptimalkan shader GPU untuk aplikasi web modern. Fokus pada sistem node **TSL (Three Shading Language)** yang dapat dikompilasi silang menjadi **WGSL (WebGPU)** dan **GLSL (WebGL2)**, **Compute Shader WGSL** mandiri untuk pemrosesan paralel GPU skala masif (partikel, boids, simulasi cairan), dan optimasi **GLSL**. ### Kondisi Pemicu Aktifkan skill ini ketika pengguna: - Menulis *custom shader material* pada Three.js atau Babylon.js. - Merefaktor shader GLSL lama menjadi Three Shading Language (TSL) atau WebGPU WGSL. - Mengimplementasikan WebGPU Compute Shader (`@compute` workgroups, storage buffers). - Membuat efek visual prosedural (simulasi air, awan volumetrik, medan prosedural, perisai hologram). - Merancang *post-processing passes* (bloom, chromatic aberration, SSAO, depth of field). - Mengatasi bottleneck GPU, *thread divergence*, atau instruksi ALU berlebih. --- ### Prinsip Utama Shader Modern 1. **Adopsi TSL (Three Shading Language)**: - Hindari menulis shader dalam bentuk *string concatenation* GLSL mentah pada proyek modern. Gunakan TSL (`Fn`, `color`, `uv`, `positionLocal`). TSL menjaga keamanan tipe (type-safety) dan otomatis menghasilkan WGSL atau GLSL sesuai runtime. 2. **GPGPU dengan Compute Shader**: - Manfaatkan WebGPU Compute Shader untuk kalkulasi ribuan partikel atau simulasi matematika tanpa melalui tahap rasterisasi atau vertex buffer tradisional. 3. **Aturan Anti-Branching (Branchless Shader)**: - GPU mengeksekusi instruksi dalam kelompok thread (*warp/wavefront*). Percabangan `if/else` yang tidak seragam akan memaksa GPU mengeksekusi kedua cabang secara berurutan (*branch penalty*). - Gunakan fungsi matematika seperti `step()`, `smoothstep()`, dan `mix()` alih-alih percabangan logika kondisional. 4. **Manajemen Presisi**: - Gunakan `mediump` (16-bit float) untuk warna, koordinat UV, dan vektor normal untuk melipatgandakan kecepatan komputasi pada GPU smartphone. - Gunakan `highp` (32-bit float) hanya untuk posisi ruang dunia (*world space*) dan perhitungan kedalaman (*depth*). 5. **Babylon.js Node Material (NME) & WGSL Compute Shader**: - Manfaatkan Node Material (`NodeMaterial`) yang otomatis mengompilasi graf visual menjadi WGSL pada WebGPU dan GLSL pada WebGL2. - Gunakan `ComputeShader` untuk pemrosesan paralel GPU berbasis kode native WGSL: ```typescript import { Scene, Mesh, NodeMaterial, ComputeShader } from '@babylonjs/core'; export async function inisialisasiNodeDanCompute(scene: Scene, targetMesh: Mesh) { const nodeMaterial = new NodeMaterial('oceanNodeMat', scene); await nodeMaterial.loadAsync('https://assets.babylonjs.com/materials/nme/ocean.json'); nodeMaterial.build(false); targetMesh.material = nodeMaterial; const wgslSource = ` @group(0) @binding(0) var partikel : array>; @compute @workgroup_size(64) fn main(@builtin(global_invocation_id) global_id : vec3) { let index = global_id.x; partikel[index].y += 0.016 * partikel[index].w; } `; const computeShader = new ComputeShader('partikelCompute', scene.getEngine(), { computeSource: wgslSource }, { bindingsMapping: { partikel: { group: 0, binding: 0 } } }); return { nodeMaterial, computeShader }; } ``` ### Matriks Eksekusi Berdaulat, Efisiensi Token & Invarian | Dimensi | Mandat Berdaulat & Kontrak Deterministik | | :--- | :--- | | **Kaskade Model Frontier** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) | | **Invarian Fallback Ketersediaan** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Bebas gagal saat model belum tersedia/kuota penuh) | | **Protokol Hemat Token & KV-Cache** | Kunci instruksi & skema statis di prefix awal (`kv-cache-prefix-optimizer`); kirim potongan `CONTEXT_MAP.md` (<250 token/panggilan) saat Fan-Out | | **Eksekusi SaaT CLI & MCP** | CLI: `vibes skill exec glsl-shader-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` | | **Invarian NFR & Anti-Slop** | Latensi P99 API < 85ms, paritas skema ketat OpenAPI 3.1 / TypeSpec, kontrak error RFC 9457 Problem Details, penegakan Idempotency-Key; kode 100% tuntas tanpa placeholder diverifikasi melalui `node scripts/check-anti-slop.js --strict` |