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 --> colorMore 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,sampler2DandsamplerCube
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