An Introduction to 3D Computer Graphics, Stereoscopic Image, and Animation in OpenGL and C/C++
To obtain the source code of the programs presented in the book, click the following link ( Resources ).

Sample Chapters:

Table of Content

Contents
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
Chapter 1 Introduction  1
  1.1 The Value of Knowledge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
  1.2 The Open-Source Movement . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
  1.3 Computer Graphics Applications . . . . . . . . . . . . . . . . . . . . . . . . . . 4
  1.4 This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Chapter 2 OpenGL Basics 7
  2.1 What Is OpenGL? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
  2.2 OpenGL Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
    2.2.1 Basics of OpenGL Code . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
    2.2.2 The Event Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
    2.2.3 OpenGL as a State Machine . . . . . . . . . . . . . . . . . . . . . . . . . 10
    2.2.4 Demo Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
  2.3 OpenGL Drawing Primitives . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
  2.4 Displaying Points, Lines and Polygons . . . . . . . . . . . . . . . . . . . . . . . 14
    2.4.1 Point and Line Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
    2.4.2 Polygon Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
  2.5 Two Dimensional Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
    2.5.1 Turtle Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

Chapter 3 Modeling and Viewing Transformations  25
  3.1 Viewing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
  3.2 Points and Vectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
  3.3 Vector, Affine, and Projective Spaces . . . . . . . . . . . . . . . . . . . . . . . . 27
    3.3.1 Vector Space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
    3.3.2 Affine Space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
    3.3.3 Projective Spaces and Projective Equivalence . . . . . . . . . . . . . . . . 28
  3.4 Homogeneous coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
  3.5 General Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
    3.5.1 Orthogonal Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
  3.6 3D Affine Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
    3.6.1 Translation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
    3.6.2 Scaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
    3.6.3 Rotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
  3.7 Composite Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
    3.7.1 Modelview Transformation . . . . . . . . . . . . . . . . . . . . . . . . . 40
    3.7.2 Affine Transformation Properties . . . . . . . . . . . . . . . . . . . . . . 41
  3.8 Viewing Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
    3.8.1 The gluLookAt() Utility Routine . . . . . . . . . . . . . . . . . . . . . . 43
    3.8.2 More Explanations on up Vector . . . . . . . . . . . . . . . . . . . . . . 46
  3.9 Coding Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
    3.9.1 Robot Arm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
    3.9.2 Solar System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

Chapter 4 Projection Transformations    53
4.1 Projections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.2 Perspective Projections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.2.1 Vanishing Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.2.2 Perspective Projection Transformations . . . . . . . . . . . . . . . . . . . 55
4.3 Orthographic Projection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.4 Rasterization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
 
Chapter 5 Color  71
5.1 Color Spaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.2 RGB Color Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.3 Color Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.3.1 The XYZ Color Model . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.3.2 YUV Color Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.3.3 YCbCr Color Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.4 RGBA Color Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.5 Color Blending . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Chapter 6 Depth Test and OpenGL Buffers    85
6.1 Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.2 Depth Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.2.1 The z-Buffer Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.2.2 OpenGL z-Buffering . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.3 Writing to Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
6.3.1 OpenGL Pixel-Array Function . . . . . . . . . . . . . . . . . . . . . . . 91
6.3.2 Pixel Data Block Transfer . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.4 Displaying and Saving Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.4.1 Portable Pixel Map (PPM) . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.4.2 The Convert Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.4.3 Read and Write PPM Files . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.4.4 Saving Graphics with glReadPixels . . . . . . . . . . . . . . . . . . . . . 101
6.4.5 Displaying PPM Images with glDrawPixels . . . . . . . . . . . . . . . . 102
6.4.6 Portable Network Graphics (PNG) . . . . . . . . . . . . . . . . . . . . . 103

Chapter 7 Lighting and Texture   107
7.1 Importance of Lighting and Local Illumination . . . . . . . . . . . . . . . . . . . 107
7.2 Phong Reflection Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.2.1 Specular Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.2.2 Diffuse Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.2.3 Ambient Reflection and Emissivity . . . . . . . . . . . . . . . . . . . . . 112
7.2.4 Phong Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.3 OpenGL Lighting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7.3.1 Light Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
7.3.2 Types of Light . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.3.3 Surface Material Properties . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.3.4 Surface Normals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
7.3.5 Attenuation and Spotlighting . . . . . . . . . . . . . . . . . . . . . . . . 117
7.4 Texture Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
7.4.1 Two Dimensional Texture Mapping . . . . . . . . . . . . . . . . . . . . . 120
7.4.2 OpenGL Texture Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . 123
7.4.3 Texture Programming Examples . . . . . . . . . . . . . . . . . . . . . . 124

Chapter 8 Depth Perception    131
8.1 Stereoscopic Depth Perception . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
8.2 Oculomotor Cues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
8.3 Monoscopic Depth Cues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
8.3.1 Occlusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
8.3.2 Relative Height . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
8.3.3 Aerial Perspective, Atmosphere Blur, Saturation, and Color Shift . . . . . 135
8.3.4 Shadows and Highlights . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
8.3.5 Linear Perspective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
8.3.6 Relative Size and Familiar Size . . . . . . . . . . . . . . . . . . . . . . . 137
8.3.7 Texture Gradient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
8.3.8 Familiar Shapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
8.4 Motion-based Depth Cues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
8.5 Binocular Cues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
8.5.1 Horopter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
8.5.2 Vision Fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

Chapter 9 Principles of 3D Stereoscopic Graphics    145
9.1 Anaglyph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
9.2 Creating Anaglyphs with GIMP . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
9.3 Horizontal Parallax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
9.4 Calculating Stereo Pairs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
9.4.1 Perspective Projection . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
9.4.2 Rotation or Toe-in Method . . . . . . . . . . . . . . . . . . . . . . . . . 152
9.4.3 Two-Center Projection (Off-axis Projection) . . . . . . . . . . . . . . . . 153
9.4.4 Stereo Effect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

Chapter 10 Creating Stereoscopic Images with OpenGL    157
10.1 Multirendering using Accumulation Buffer . . . . . . . . . . . . . . . . . . . . 157
10.2 OpenGL Stereo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
10.3 3D Stereo Rendering Using OpenGL . . . . . . . . . . . . . . . . . . . . . . . 160
10.3.1 Using glColorMask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
10.3.2 Using Accumulation Buffer . . . . . . . . . . . . . . . . . . . . . . . . 161
10.3.3 Toe-in Projection Method . . . . . . . . . . . . . . . . . . . . . . . . . 162
10.3.4 Two-center Projection Method . . . . . . . . . . . . . . . . . . . . . . . 165

Chapter 11 Animation    171
11.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
11.2 Computer Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
11.3 Computer Animation Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
11.4 Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
11.5 Animation in OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

Chapter 12 Normal Vectors and Polygon Mesh    183
12.1 3D Vectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
12.2 Normal to a Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
12.2.1 Normal Vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
12.2.2 Equation of a Plane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
12.3 Polygon Mesh Modeling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
12.4 COLLADA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
12.4.1 3D Graphics Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
12.4.2 COLLADA Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
12.4.3 COLLADA Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
12.4.4 Parsing COLLADA Files . . . . . . . . . . . . . . . . . . . . . . . . . . 204
12.5 The libxml Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
12.5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
12.5.2 Reading and Parsing an XML File . . . . . . . . . . . . . . . . . . . . . 205
12.5.3 Parsing a File To a Tree . . . . . . . . . . . . . . . . . . . . . . . . . . 208
12.5.4 Searching For a Node . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
12.6 Blender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Chapter 13 Curves and Surfaces    215
13.1 Representation of Curves and Surfaces . . . . . . . . . . . . . . . . . . . . . . 215
13.1.1 Explicit Representation . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
13.1.2 Implicit Representation . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
13.1.3 Parametric Representation . . . . . . . . . . . . . . . . . . . . . . . . . 217
13.1.4 Geometric Continuity . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
13.2 Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
13.2.1 Polynomial Parametric Curves . . . . . . . . . . . . . . . . . . . . . . . 220
13.2.2 Interpolation Polynomial . . . . . . . . . . . . . . . . . . . . . . . . . . 220
13.2.3 Lagrange’s Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
13.2.4 Neville’s Algorithm and Barycentric Formula . . . . . . . . . . . . . . . 223
13.3 Bezier Curves and Surfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
13.3.1 Bezier Curve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
13.3.2 Cubic Bezier Curve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
13.3.3 Bezier Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
13.4 B-Splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
13.4.1 B-Spline Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
13.4.2 Knot Vector and Basis Functions . . . . . . . . . . . . . . . . . . . . . . 231
13.4.3 Cubic Uniform B-Splines . . . . . . . . . . . . . . . . . . . . . . . . . 232
13.4.4 Non Uniform Rational B-Splines (NURB) . . . . . . . . . . . . . . . . . 233
13.5 OpenGL Evaluators and NURBS . . . . . . . . . . . . . . . . . . . . . . . . . 235
13.5.1 OpenGL Evaluators for Bezier Curves and Surfaces . . . . . . . . . . . 235
13.5.2 The GLU NURBS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
13.6 Subdivision Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241

Chapter 14 3D Objects from Planar Contours    247
14.1 Prisms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
14.2 Matrix Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
14.3 Tubes and Snakes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
14.3.1 Segmented Tubes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
14.3.2 Frenet Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
14.3.3 Toroidal Spirals and Other Examples . . . . . . . . . . . . . . . . . . . 261
14.4 Surface of Revolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
14.4.1 Revolving a Profile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
14.4.2 Area of a Surface of Revolution . . . . . . . . . . . . . . . . . . . . . . 264
14.4.3 Volume of a Surface of Revolution . . . . . . . . . . . . . . . . . . . . . 266
14.4.4 Computing a Surface of Revolution . . . . . . . . . . . . . . . . . . . . 267
14.5 Anaglyphs by Extrusion and Revolution . . . . . . . . . . . . . . . . . . . . . . 269
14.5.1 Stereo Images with Black Background . . . . . . . . . . . . . . . . . . . 269
14.5.2 Stencil Buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
14.5.3 Stereo Images with Background . . . . . . . . . . . . . . . . . . . . . . 273

Chapter 15 Stereoscopic Displays    277
15.1 Anaglyph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
15.2 Time-Sequential . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
15.3 Spatially Multiplexed Polarized . . . . . . . . . . . . . . . . . . . . . . . . . . 278
15.4 Polarized Projection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
15.4 Lenticular, Parallax Barrier and Parallax Illumination . . . . . . . . . . . . . . . 279
15.5 Dual-View Twin-LCD Systems . . . . . . . . . . . . . . . . . . . . . . . . . . 280
15.6 Other Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
15.7 Stereoscopic Compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285

Chapter 16 Ray Tracing    287
16.1 Local vs. Global Illumination . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
16.2 Ray Tracing Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
16.3 Basic Ray Tracing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
16.3.1 Ray Casting (Nonrecursive Ray Tracing) . . . . . . . . . . . . . . . . . 289
16.3.2 Recursive Ray Tracing . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
16.4 Global Intensity Calculation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
16.4.1 Basic Ray Tracing Vectors . . . . . . . . . . . . . . . . . . . . . . . . . 293
16.4.2 Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
16.4.3 Transmission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
16.4.4 Phong Lighting for Transmission . . . . . . . . . . . . . . . . . . . . . 296

Chapter 17 Intersection Testing    299
17.1 Rays, Lines, and Planes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
17.1.1 Representing Lines and Planes . . . . . . . . . . . . . . . . . . . . . . 299
17.1.2 Ray-Plane Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
17.1.3 Ray-Slab Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
17.1.4 Ray-Box Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
17.2 Ray-Triangle Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
17.2.1 Ray-Triangle Intersection Test . . . . . . . . . . . . . . . . . . . . . . . 305
17.2.2 Triangle Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . 307
17.2.3 Ray-Triangle Intersection Test Implementation . . . . . . . . . . . . . . 308
17.3 Ray-Sphere Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
17.3.1 Ray-Sphere Intersection Test . . . . . . . . . . . . . . . . . . . . . . . . 309
17.3.2 Ray-Sphere Intersection Implementation . . . . . . . . . . . . . . . . . 311
17.4 Ray-Tapered Cylinder Intersection . . . . . . . . . . . . . . . . . . . . . . . . . 312
17.5 Ray-Quadric Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313

Chapter 18 Vertex Array    315
18.1 Function Calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
18.2 Vertex Array Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
18.3 Drawing a Cube . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

Chapter 19 OpenGL Shading Language (GLSL)    321
19.1 Extending OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
19.2 OpenGL Shaders Execution Model . . . . . . . . . . . . . . . . . . . . . . . . 322
19.3 OpenGL Shading Language API . . . . . . . . . . . . . . . . . . . . . . . . . . 323
19.4 Data Types in GLSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
19.5 The OpenGL Extension Wrangler Library . . . . . . . . . . . . . . . . . . . . . 331
19.6 Drawing Polygons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
19.6.1 Creating a Shader Class . . . . . . . . . . . . . . . . . . . . . . . . . . 332
19.6.2 Drawing a Triangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
19.6.2 Temperature Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
19.6.3 Drawing a Wireframe Tetrahedron . . . . . . . . . . . . . . . . . . . . . 341
19.6.4 Drawing a Color Solid Tetrahedron . . . . . . . . . . . . . . . . . . . . 343
19.7 Drawing Spheres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
19.7.1 Spherical Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
19.7.2 Rendering a Wireframe Sphere . . . . . . . . . . . . . . . . . . . . . . . 347
19.7.3 Rendering a Color Solid Sphere . . . . . . . . . . . . . . . . . . . . . . 351
19.7.4 Lighting a Sphere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
19.8 Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
19.8.1 Animating a Color Sphere . . . . . . . . . . . . . . . . . . . . . . . . . 359
19.8.2 Animated Particle Systems . . . . . . . . . . . . . . . . . . . . . . . . . 361
19.8.3 Morphing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
19.9 Texture Shaders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
19.9.1 A Simple Texture Example . . . . . . . . . . . . . . . . . . . . . . . . . 367
19.9.1 Bump Mapping with Shaders . . . . . . . . . . . . . . . . . . . . . . . 371

Appendix A FFmpeg Libraries    377
A.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
A.2 Getting and Compiling FFmpeg . . . . . . . . . . . . . . . . . . . . . . . . . . 377
A.3 Using FFmpeg Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Opening the File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Decoding the Stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Playing the Video Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Sample Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
A.4 Using FFmpeg Functions in Graphics . . . . . . . . . . . . . . . . . . . . . . . 385

Appendix B Video Compression using Graphics Models   389
B.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
B.2 MPEG-4 Facial Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
B.3 Computing Face Mesh Vertices . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
B.4 Keyframing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
B.5 Extracting FAPs From Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
B.5.1 Active Appearance Model (AAM) . . . . . . . . . . . . . . . . . . . . . 397
B.5.2 An AAM Search Algorithm . . . . . . . . . . . . . . . . . . . . . . . . 400
B.6 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Bibliography  403
Index    407