Files
opencode-skill/skills/shader-dev/reference/webgl-pitfalls.md
Kunthawat Greethong 7edf5bc4d0 feat: Import 35+ skills, merge duplicates, add openclaw installer
Major updates:
- Added 35+ new skills from awesome-opencode-skills and antigravity repos
- Merged SEO skills into seo-master
- Merged architecture skills into architecture
- Merged security skills into security-auditor and security-coder
- Merged testing skills into testing-master and testing-patterns
- Merged pentesting skills into pentesting
- Renamed website-creator to thai-frontend-dev
- Replaced skill-creator with github version
- Removed Chutes references (use MiniMax API instead)
- Added install-openclaw-skills.sh for cross-platform installation
- Updated .env.example with MiniMax API credentials
2026-03-26 11:37:39 +07:00

1.9 KiB

WebGL2 Pitfalls Reference

This is a reference document for the webgl-pitfalls technique.

Complete Error Message Reference

Error Message Likely Cause Solution
'fragCoord' : undeclared identifier Using fragCoord instead of gl_FragCoord.xy in WebGL2 Replace with gl_FragCoord.xy
'' : Missing main() Fragment shader has no main() function Add void main() { mainImage(fragColor, gl_FragCoord.xy); } wrapper
'functionName' : no matching overloaded function found Wrong argument types OR function declared after use Check types; reorder or forward-declare functions
'return' : function return is not matching type: Return expression type doesn't match declared return type Verify vec3 foo() returns vec3, not float
#version must be first Leading whitespace when extracting from script tag Use .trim() on shader source string
Uniform returns null from getUniformLocation Uniform optimized away for being unused Ensure uniform is actually referenced in shader code

Type Mismatch Examples

// ERROR: terrainM expects vec2, passing vec3
float calcAO(vec3 pos, vec3 nor) {
    float d = terrainM(pos + h * nor);  // Wrong: pos + h*nor is vec3
}
// FIX: Extract xz components
float calcAO(vec3 pos, vec3 nor) {
    float d = terrainM(pos.xz + h * nor.xz);  // Correct: vec2
}
// ERROR: can't access .z on vec2
vec2 uv = vec2(1.0, 2.0);
float z = uv.z;  // Wrong: vec2 has no .z
// FIX: use proper swizzle or conversion
float z = uv.y;  // Or if you need third component, use vec3

GLSL ES 3.0 Specific Notes

  • All declared uniform variables must be used in shader code, otherwise compiler may optimize them away
  • When gl.getUniformLocation() returns null, setting that uniform triggers INVALID_OPERATION
  • Loop counters must be deterministic at runtime — avoid compile-time constant folding issues