Skip to content

Instantly share code, notes, and snippets.

@markknol
Last active March 28, 2024 16:14
Show Gist options
  • Star 20 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save markknol/d06c0167c75ab5c6720fe9083e4319e1 to your computer and use it in GitHub Desktop.
Save markknol/d06c0167c75ab5c6720fe9083e4319e1 to your computer and use it in GitHub Desktop.
Shader cheatsheet (from shadertoy)

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

Language:

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

Built-in Functions:

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)

Conversions

  • Int to Float: int(uv.x * 3.0)

How-to

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

Shadertoy Inputs

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)

Shadertoy Outputs

Image shaders:

fragColor is used as output channel. It is not, for now, mandatory but recommended to leave the alpha channel to 1.0.

Sound shaders:

the mainSound() function returns a vec2 containing the left and right (stereo) sound channel wave data.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment