The WebGL
Graphics Pipeline
Tarek Sherif
Outline
- Motivation
- Basic Architecture
- Pipeline Components
- Advantages and Limitations
Motivation
-
Having a better understanding of the graphics pipeline will help us:
- Understand what effects are possible
- Understand the performance costs of those effects
- Come up with new effects?
Basic Architecture
-
The pipeline must handle massive amounts of data in minimal time
- Potentially hundreds of thousands of vertices
- Transformation, lighting, texturing, shading
- Repeat every 16ms!
Basic Architecture
-
Massive parallelism
- SIMD
- Transformations applied independently to each vertex
- Shading applied independently to each pixel
Basic Architecture
Pipeline Components
Set Up
- Describe the geometry, normals, UVs
- Set parameters that will go into shading calculations
Vertex Shader
- Programmable
- Applied independently to each vertex
- Move object to its position relative to the camera and other objects
Three Steps
-
Model transformation
- Translate, rotate, scale model to its position in "the world"
-
View transformation
- Move object into its position relative to camera
-
Projection transformation
- Usually a perspective projection to give depth
- Usually all combined into a single "MVP" matrix
Vertex Shader
GLSL Code
attribute vec4 aPosition;
uniform mat4 uMVP;
void main() {
gl_Position = uMVP * aPosition;
}
Rasterization
- Map points on model surface to pixels of the screen to create "fragments"
Rasterization
- Vertex attributes will be interpolated across the pixels they enclose
- Each fragment contains interpolated values for an object that covers a given pixel
-
Might produce more than one fragment per pixel
- One for each object that covers the pixel
Rasterization
-
Interpolated attributes for a fragment can be anything, but typically include
- Position
- Normals
- Colors
- UVs
- Depth
Fragment Shader
- Programmable
- Use fragment data to calculate pixel color
-
Multiple fragments might be considered to calculate the color of a pixel
- Choose closest fragment for opaque objects
- Blend several fragments for transparent objects
Fragment Shader
GLSL Code
varying vec4 vPosition;
varying vec4 vNormal;
varying vec4 vColor;
uniform vec3 uLightPos;
uniform vec3 uLightColor;
void main() {
vec3 lightDir = normalize(uLightPos - vPosition.xyz);
float l = max(dot(normalize(vNormal), lightDir), 0.0);
gl_FragColor = vec4(l * vColor.rgb * uLightColor, vColor.a);
}
Rendering
- Final application of colors to pixels of the screen
- Includes some logic such as blending and depth testing
Advantages and Limitations
-
Key factors to consider:
- Parallel processing is intrinsic to the system
- Programmable vertex and fragment shaders
Advantages
-
FAST
- Complexity of the scenes we can render is a direct result of parallelism
- Programmable shaders are extremely flexible
Limitations
-
Global effects are difficult
- Shadows
- Reflection
- Refraction
-
Usually require the scene be rendered multiple times
- Comes at a performance cost