Shaders and GLSL
Shaders
https://thebookofshaders.com/01/
What is a Shader
Types of Shaders
Fragment Shaders
Takes a position and outputs a color
graph LR
position --> shader
textures --> shader
shader --> color
More or less
Vertex Shader
??? #inprogress
Responsible for rendering shapes.
GLSL
OpenGLs Shader Language
Single main function that returns void
Returns through some “special global variables” such as gl_FragColor
No automatic casting
Example
#ifdef GL_ES
precision mediump float;
#endif
uniform float u_time;
void main() {
gl_FragColor = vec4(0.309,0.962,1.000,1.000);
}
Uniforms
https://thebookofshaders.com/03/
What is a uniform
? uniforms are the way data is exchanged between the CPU and GPU, this indicates it is UNIFORM across ALL pixels being processed by the GPU, the types supported are:
float
,vec2
,vec3
,vec4
,mat2
,mat3
,mat4
,sampler2D
andsamplerCube
Uniforms are defined with the corresponding type at the top of the shader right after assigning the default floating point precision.
u_
is a common prefix, sometimes they get an i
prefix to indicate that they are inputs.
Common Functions
The GPU has hardware accelerated angle, trigonometric and exponential functions. Some of those functions are: sin()
, cos()
, tan()
, asin()
, acos()
, atan()
, pow()
, exp()
, log()
, sqrt()
, abs()
, sign()
, floor()
, ceil()
, fract()
, mod()
, min()
, max()
and clamp()
.
gl_FragCoord
gl_FragCoord
, which holds the screen coordinates of the pixel or screen fragment that the active thread is working on
Normalizing to between 0.0 and 1.0: vec2 st = gl_FragCoord.xy/u_resolution;
(0,0) is bottom left corner
Requirements for Shaders
Blind
- Cannot know what other threads in the pipeline are doing
Memoryless
- Cannot maintain memory past execution
Why?
- GPUs execute shaders in parallel, and keep everything busy. This allows for fast parallel operations, has to meet the above requirements