This help only covers the parts of GLSL ES that are relevant for Shadertoy. For the complete specification please have a look at GLSL ES specification
Version: WebGL 2.0
Arithmetic: ( ) + - ! * / %
Logical/Relatonal: ~ < > <= >= == != && ||
Bit Operators: & ^ | << >>
Comments: // /* */
Types: void bool int uint float vec2 vec3 vec4 bvec2 bvec3 bvec4 ivec2 ivec3 ivec4 uvec2 uvec3 uvec4 mat2 mat3 mat4 mat?x? sampler2D, sampler3D samplerCube
Format: float a = 1.0; int b = 1; uint i = 1U; int i = 0x1;
Function Parameter Qualifiers: [none] in out inout
Global Variable Qualifiers: const
Vector Components: .xyzw .rgba .stpq
Flow Control: if else for return break continue switch/case
Output: vec4 fragColor
Input: vec2 fragCoord
Preprocessor: # #define #undef #if #ifdef #ifndef #else #elif #endif #error #pragma #line
| function | description |
|---|---|
type radians (type degrees) |
degrees to radians |
type degrees (type radians) |
radians to degrees |
type sin (type angle) |
|
type cos (type angle) |
|
type tan (type angle) |
|
type asin (type x) |
|
type acos (type x) |
|
type atan (type y, type x) |
|
type atan (type y_over_x) |
|
type sinh (type x) |
|
type cosh (type x) |
|
type tanh (type x) |
|
type asinh (type x) |
|
type acosh (type x) |
|
type atanh (type x) |
|
type pow (type x, type y) |
|
type exp (type x) |
|
type log (type x) |
|
type exp2 (type x) |
|
type log2 (type x) |
|
type sqrt (type x) |
|
type inversesqrt (type x) |
|
type abs (type x) |
|
type sign (type x) |
|
type floor (type x) |
|
type ceil (type x) |
|
type trunc (type x) |
|
type fract (type x) |
the fractional part of x. Same as x - floor(x). |
type mod (type x, float y) |
modulo |
type modf (type x, out type i) |
|
type min (type x, type y) |
|
type max (type x, type y) |
|
type clamp (type x, type minV, type maxV) |
|
type mix (type x, type y, type a) |
|
type step (type edge, type x) |
|
type smoothstep (type a, type b, type x) |
|
float length (type x) |
|
float distance (type p0, type p1) |
|
float dot (type x, type y) |
|
vec3 cross (vec3 x, vec3 y) |
|
type normalize (type x) |
|
type faceforward (type N, type I, type Nref) |
|
type reflect (type I, type N) |
|
type refract (type I, type N,float eta) |
|
float determinant (mat? m) |
|
mat?x? outerProduct (vec? c, vec? r) |
|
type matrixCompMult (type x, type y) |
|
type inverse (type inverse) |
|
type transpose (type inverse) |
|
vec4 texture ( sampler? , vec? coord [, float bias]) |
|
vec4 textureLod ( sampler, vec? coord, float lod) |
|
vec4 textureLodOffset ( sampler? sampler, vec? coord, float lod, ivec? offset) |
|
vec4 textureGrad ( sampler? , vec? coord, vec2 dPdx, vec2 dPdy) |
|
vec4 textureGradOffset sampler? , vec? coord, vec? dPdx, vec? dPdy, vec? offset) |
|
vec4 textureProj ( sampler? , vec? coord [, float bias]) |
|
vec4 textureProjLod ( sampler? , vec? coord, float lod) |
|
vec4 textureProjLodOffset ( sampler? , vec? coord, float lod, vec? offset) |
|
vec4 textureProjGrad ( sampler? , vec? coord, vec2 dPdx, vec2 dPdy) |
|
vec4 texelFetch ( sampler? , ivec? coord, int lod) |
|
vec4 texelFetchOffset (sampler?, ivec? coord, int lod, ivec? offset) |
|
ivec? textureSize ( sampler? , int lod) |
|
type dFdx (type x) |
|
type dFdy (type x) |
|
type fwidth (type p) |
the sum of the absolute value of derivatives in x and y |
type isnan (type x) |
|
type isinf (type x) |
|
float intBitsToFloat (int v) |
|
uint uintBitsToFloat (uint v) |
|
int floatBitsToInt (float v) |
|
uint floatBitsToUint (float v) |
|
uint packSnorm2x16 (vec2 v) |
|
uint packUnorm2x16 (vec2 v) |
|
vec2 unpackSnorm2x16 (uint p) |
|
vec2 unpackUnorm2x16 (uint p) |
|
bvec lessThan (type x, type y) |
|
bvec lessThanEqual (type x, type y) |
|
bvec greaterThan (type x, type y) |
|
bvec greaterThanEqual (type x, type y) |
|
bvec equal (type x, type y) |
|
bvec notEqual (type x, type y) |
|
bool any (bvec x) |
|
bool all (bvec x) |
|
bvec not (bvec x) |
- Int to Float:
int(uv.x * 3.0)
Use structs: struct myDataType { float occlusion; vec3 color; }; myDataType myData = myDataType(0.7, vec3(1.0, 2.0, 3.0));
Initialize arrays: float[] x = float[] (0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6);
Do conversions: int a = 3; float b = float(a);
Do component swizzling: vec4 a = vec4(1.0,2.0,3.0,4.0); vec4 b = a.zyyw;
Access matrix components: mat4 m; m[1] = vec4(2.0); m[0][0] = 1.0; m[2][3] = 2.0;
Be careful!
the f suffix for floating point numbers: 1.0f is illegal in GLSL. You must use 1.0
saturate(): saturate(x) doesn't exist in GLSL. Use clamp(x,0.0,1.0) instead
pow/sqrt: please don't feed sqrt() and pow() with negative numbers. Add an abs() or max(0.0, x) to the argument
mod: please don't do mod(x,0.0). This is undefined in some platforms
variables: initialize your variables! Don't assume they'll be set to zero by default
functions: don't name your functions the same as some of your variables
| type | name | description |
|---|---|---|
vec3 |
iResolution |
image/buffer The viewport resolution (z is pixel aspect ratio, usually 1.0) |
float |
iTime |
image/sound/buffer Current time in seconds |
float |
iTimeDelta |
image/buffer Time it takes to render a frame, in seconds |
int |
iFrame |
image/buffer Current frame |
float |
iFrameRate |
image/buffer Number of frames rendered per second |
float |
iChannelTime[4] |
image/buffer Time for channel (if video or sound), in seconds |
vec3 |
iChannelResolution[4] |
image/buffer/sound Input texture resolution for each channel |
vec4 |
iMouse |
image/buffer xy = current pixel coords (if LMB is down). zw = click pixel |
sampler2D |
iChannel{i} |
image/buffer/sound Sampler for input textures i |
vec4 |
iDate |
image/buffer/sound Year, month, day, time in seconds in .xyzw |
float |
iSampleRate |
image/buffer/sound The sound sample rate (typically 44100) |
fragColor is used as output channel. It is not, for now, mandatory but recommended to leave the alpha channel to 1.0.
the mainSound() function returns a vec2 containing the left and right (stereo) sound channel wave data.
Nice!!!!!!