skills/shader-dev/SKILL.md
Comprehensive GLSL shader techniques for creating stunning visual effects — ray marching, SDF modeling, fluid simulation, particle systems, procedural generation, lighting, post-processing, and more.
npx skillsauth add MiniMax-AI/skills shader-devInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A unified skill covering 36 GLSL shader techniques (ShaderToy-compatible) for real-time visual effects.
/shader-dev <request>
$ARGUMENTS contains the user's request (e.g. "create a raymarched SDF scene with soft shadows").
shader-dev/
├── SKILL.md # Core skill (this file)
├── techniques/ # Implementation guides (read per routing table)
│ ├── ray-marching.md # Sphere tracing with SDF
│ ├── sdf-3d.md # 3D signed distance functions
│ ├── lighting-model.md # PBR, Phong, toon shading
│ ├── procedural-noise.md # Perlin, Simplex, FBM
│ └── ... # 34 more technique files
└── reference/ # Detailed guides (read as needed)
├── ray-marching.md # Math derivations & advanced patterns
├── sdf-3d.md # Extended SDF theory
├── lighting-model.md # Lighting math deep-dive
├── procedural-noise.md # Noise function theory
└── ... # 34 more reference files
techniques/ — each file contains core principles, implementation steps, and complete code templatesreference/| User wants to create... | Primary technique | Combine with | |---|---|---| | 3D objects / scenes from math | ray-marching + sdf-3d | lighting-model, shadow-techniques | | Complex 3D shapes (booleans, blends) | csg-boolean-operations | sdf-3d, ray-marching | | Infinite repeating patterns in 3D | domain-repetition | sdf-3d, ray-marching | | Organic / warped shapes | domain-warping | procedural-noise | | Fluid / smoke / ink effects | fluid-simulation | multipass-buffer | | Particle effects (fire, sparks, snow) | particle-system | procedural-noise, color-palette | | Physically-based simulations | simulation-physics | multipass-buffer | | Game of Life / reaction-diffusion | cellular-automata | multipass-buffer, color-palette | | Ocean / water surface | water-ocean | atmospheric-scattering, lighting-model | | Terrain / landscape | terrain-rendering | atmospheric-scattering, procedural-noise | | Clouds / fog / volumetric fire | volumetric-rendering | procedural-noise, atmospheric-scattering | | Sky / sunset / atmosphere | atmospheric-scattering | volumetric-rendering | | Realistic lighting (PBR, Phong) | lighting-model | shadow-techniques, ambient-occlusion | | Shadows (soft / hard) | shadow-techniques | lighting-model | | Ambient occlusion | ambient-occlusion | lighting-model, normal-estimation | | Path tracing / global illumination | path-tracing-gi | analytic-ray-tracing, multipass-buffer | | Precise ray-geometry intersections | analytic-ray-tracing | lighting-model | | Voxel worlds (Minecraft-style) | voxel-rendering | lighting-model, shadow-techniques | | Noise / FBM textures | procedural-noise | domain-warping | | Tiled 2D patterns | procedural-2d-pattern | polar-uv-manipulation | | Voronoi / cell patterns | voronoi-cellular-noise | color-palette | | Fractals (Mandelbrot, Julia, 3D) | fractal-rendering | color-palette, polar-uv-manipulation | | Color grading / palettes | color-palette | — | | Bloom / tone mapping / glitch | post-processing | multipass-buffer | | Multi-pass ping-pong buffers | multipass-buffer | — | | Texture / sampling techniques | texture-sampling | — | | Camera / matrix transforms | matrix-transform | — | | Surface normals | normal-estimation | — | | Polar coords / kaleidoscope | polar-uv-manipulation | procedural-2d-pattern | | 2D shapes / UI from SDF | sdf-2d | color-palette | | Procedural audio / music | sound-synthesis | — | | SDF tricks / optimization | sdf-tricks | sdf-3d, ray-marching | | Anti-aliased rendering | anti-aliasing | sdf-2d, post-processing | | Depth of field / motion blur / lens effects | camera-effects | post-processing, multipass-buffer | | Advanced texture mapping / no-tile textures | texture-mapping-advanced | terrain-rendering, texture-sampling | | WebGL2 shader errors / debugging | webgl-pitfalls | — |
fragCoord, main() wrapper, function order, macro limitations, uniform nullAll technique files use ShaderToy GLSL style. When generating standalone HTML pages, apply these adaptations:
canvas.getContext("webgl2")#version 300 es, fragment shader adds precision highp float;out vec4 fragColor;attribute → in, varying → outvarying → in, gl_FragColor → fragColor, texture2D() → texture()gl_FragCoord.xy instead of fragCoord (WebGL2 does not have fragCoord built-in)// WRONG
vec2 uv = (2.0 * fragCoord - iResolution.xy) / iResolution.y;
// CORRECT
vec2 uv = (2.0 * gl_FragCoord.xy - iResolution.xy) / iResolution.y;
void mainImage(out vec4 fragColor, in vec2 fragCoord)void main() entry point — always wrap mainImage:void mainImage(out vec4 fragColor, in vec2 fragCoord) {
// shader code...
fragColor = vec4(col, 1.0);
}
void main() {
mainImage(fragColor, gl_FragCoord.xy);
}
// WRONG — getAtmosphere() calls getSunDirection() before it's defined
vec3 getAtmosphere(vec3 dir) { return getSunDirection(); } // Error!
vec3 getSunDirection() { return normalize(vec3(1.0)); }
// CORRECT — define callee first
vec3 getSunDirection() { return normalize(vec3(1.0)); }
vec3 getAtmosphere(vec3 dir) { return getSunDirection(); } // Works
#define cannot use function calls — use const instead:// WRONG
#define SUN_DIR normalize(vec3(0.8, 0.4, -0.6))
// CORRECT
const vec3 SUN_DIR = vec3(0.756, 0.378, -0.567); // Pre-computed normalized value
<script> tags, ensure #version is the first character — use .trim():const fs = document.getElementById('fs').text.trim();
gl.getUniformLocation() to return null — always use uniforms in a way the compiler cannot optimize out#define macros in some ES versionsterrainM(vec2) need XZ components — use terrainM(pos.xz + offset) not terrainM(pos + offset)When generating a standalone HTML page:
body { margin: 0; overflow: hidden; background: #000; }iTime, iResolution, iMouse, iFramelet/const variables must be declared at the top of the <script> block, before any function that references them:
// 1. State variables FIRST
let frameCount = 0;
let startTime = Date.now();
// 2. Canvas/GL init, shader compile, FBO creation
const canvas = document.getElementById('canvas');
const gl = canvas.getContext('webgl2');
// ...
// 3. Functions and event bindings LAST
function resize() { /* can now safely reference frameCount */ }
function render() { /* ... */ }
window.addEventListener('resize', resize);
Reason: let/const have a Temporal Dead Zone — referencing them before declaration throws ReferenceError, causing a white screen.
float fbm(vec3 p), cannot call fbm(uv) with a vec2patch, cast, sample, filter, input, output, common, partition, activevec3 x = 1.0 is illegal — use vec3 x = vec3(1.0); cannot use .z to access a vec2if/else insteadDeployment environments may use headless software rendering with limited GPU power. Stay within these limits:
Common effect combinations — complete rendering pipelines assembled from technique modules.
Visual debugging methods — temporarily replace your output to diagnose issues.
| What to check | Code | What to look for |
|---|---|---|
| Surface normals | col = nor * 0.5 + 0.5; | Smooth gradients = correct normals; banding = epsilon too large |
| Ray march step count | col = vec3(float(steps) / float(MAX_STEPS)); | Red hotspots = performance bottleneck; uniform = wasted iterations |
| Depth / distance | col = vec3(t / MAX_DIST); | Verify correct hit distances |
| UV coordinates | col = vec3(uv, 0.0); | Check coordinate mapping |
| SDF distance field | col = (d > 0.0 ? vec3(0.9,0.6,0.3) : vec3(0.4,0.7,0.85)) * (0.8 + 0.2*cos(150.0*d)); | Visualize SDF bands and zero-crossing |
| Checker pattern (UV) | col = vec3(mod(floor(uv.x*10.)+floor(uv.y*10.), 2.0)); | Verify UV distortion, seams |
| Lighting only | col = vec3(shadow); or col = vec3(ao); | Isolate shadow/AO contributions |
| Material ID | col = palette(matId / maxMatId); | Verify material assignment |
tools
Analyze, describe, and extract information from images using the MiniMax vision MCP tool. Use when: user shares an image file path or URL (any message containing .jpg, .jpeg, .png, .gif, .webp, .bmp, or .svg file extension) or uses any of these words/phrases near an image: "analyze", "analyse", "describe", "explain", "understand", "look at", "review", "extract text", "OCR", "what is in", "what's in", "read this image", "see this image", "tell me about", "explain this", "interpret this", in connection with an image, screenshot, diagram, chart, mockup, wireframe, or photo. Also triggers for: UI mockup review, wireframe analysis, design critique, data extraction from charts, object detection, person/animal/activity identification. Triggers: any message with an image file extension (jpg, jpeg, png, gif, webp, bmp, svg), or any request to analyze/describ/understand/review/extract text from an image, screenshot, diagram, chart, photo, mockup, or wireframe.
development
React Native and Expo development guide covering components, styling, animations, navigation, state management, forms, networking, performance optimization, testing, native capabilities, and engineering (project structure, deployment, SDK upgrades, CI/CD). Use when: building React Native or Expo apps, implementing animations or native UI, managing state, fetching data, writing tests, optimizing performance, deploying to App Store/Play Store, setting up CI/CD, upgrading Expo SDK, or configuring Tailwind/NativeWind.
data-ai
Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing PPTX via XML workflows, or extract text with markitdown. Triggers: PPT, PPTX, PowerPoint, presentation, slide, deck, slides.
development
Open, create, read, analyze, edit, or validate Excel/spreadsheet files (.xlsx, .xlsm, .csv, .tsv). Use when the user asks to create, build, modify, analyze, read, validate, or format any Excel spreadsheet, financial model, pivot table, or tabular data file. Covers: creating new xlsx from scratch, reading and analyzing existing files, editing existing xlsx with zero format loss, formula recalculation and validation, and applying professional financial formatting standards. Triggers on 'spreadsheet', 'Excel', '.xlsx', '.csv', 'pivot table', 'financial model', 'formula', or any request to produce tabular data in Excel format.