State
To create an image
Default values makes starting easy
Much more flexibility
New model — dataflow architecture
Immediate mode graphics
Can be very inefficient, for real objects geometry and state change mix together
glBegin()
glColor()
glTexCoord()
glNormal()
glVertex()
// ...
glEnd()
As hardware progressed, more of the functionality was performed on the video card.
Eventually, video cards added support for replacing default functionality with programmed shaders.
"Traditional" state-driven OpenGL
Loop over all triangles:
vertex 1
set color state
set position state
vertex 2
set color state
set position state
vertex 3
set color state
set position state
draw triangle
Shader program
Loop over all triangles
vertex 1
transfer position to video card
transfer color to video card
vertex 2
transfer position to video card
transfer color to video card
vertex 3
transfer position to video card
transfer color to video card
draw triangle
Small improvement
Use TRIANGLE_STRIP
transfer large data structure draw triangle strip
Not real "mesh", but fewer vertices transfered
Use Buffer Object
Transfer all data to buffer Draw all triangles (object or entire scene)
Can leave in video card memory to draw again
OR
Draw second object in different position
C like languages with support for vectors, matrices, etc.
GLSL (GL Shading Language) works with OpenGL
Cg (C for graphics)
Traditional OpenGL
Sidenote:
Colors are assigned to vertices
Hardware "shades" by interpolating color, even with shader program
Why?
Simple computation
light-object interaction
depends on light source, including location
should be calculated at each pixel
More accurate
How can this be? Triangles are flat!
Approximation to surface
Gourard shading: per-vertex phong shading

Phong shading: per-fragment phong shading

Vertex shader
Fragment shader
Traditional Pipeline (each section uses state values)

Vertex Shader (retains some state variables)

Traditional Pipeline (each section uses state values)

Fragment Shader (some state variables retained)

