Foreword xxiiiForeword to the First Edition xxviiPreface xxxiAbout the Author xxxviiAbout the Contributors xxxixAcknowledgments xliChapter 1. Review of OpenGL Basics 1
1.1 OpenGL History 1
1.2 OpenGL Evolution 3
1.3 Execution Mode l4
1.4 The Frame Buffer 5
1.5 State 8
1.6 Processing Pipeline 8
1.7 Drawing Geometry 9
1.7.1 Geometry Specification 9
1.7.2 Per-Vertex Operations 12
1.7.3 Primitive Assembly 14
1.7.4 Primitive Processing 14
1.7.5 Rasterization 15
1.7.6 Fragment Processing 16
1.7.7 Per-Fragment Operations 16
1.7.8 Frame Buffer Operations 17
1.8 Drawing Images 18
1.8.1 Pixel Unpacking 19
1.8.2 Pixel Transfer 19
1.8.3 Rasterization and Back-End Processing 20
1.8.4 Read Control 20
1.9 Coordinate Transforms 21
1.10 Texturing 26
1.11 Summary 31
1.12 Further Information 32
Chapter 2. Basics35
2.1 Introduction to the OpenGL Shading Language 35
2.2 Why Write Shaders? 37
2.3 OpenGL Programmable Processors 38
2.3.1 Vertex Processor 40
2.3.2 Fragment Processor 43
2.4 Language Overview 47
2.4.1 Language Design Considerations 47
2.4.2 C Basis 50
2.4.3 Additions to C 50
2.4.4 Additions from C++ 52
2.4.5 C Features Not Supported 53
2.4.6 Other Differences 53
2.5 System Overview 54
2.5.1 Driver Model 54
2.5.2 OpenGL Shading Language Compiler/Linker 56
2.5.3 OpenGL Shading Language API 57
2.6 Key Benefits 59
2.7 Summary 61
2.8 Further Information 63
Chapter 3. Language Definition 65
3.1 Example Shader Pair 65
3.2 Data Types 67
3.2.1 Scalars 67
3.2.2 Vectors 69
3.2.3 Matrices 70
3.2.4 Samplers 71
3.2.5 Structures 72
3.2.6 Arrays 73
3.2.7 Void 74
3.2.8 Declarations and Scope 74
3.2.9 Type Matching and Promotion 75
3.3 Initializers and Constructors 75
3.4 Type Conversions 77
3.5 Qualifiers and Interface to a Shader 78
3.5.1 Attribute Qualifiers 79
3.5.2 Uniform Qualifiers 79
3.5.3 Varying Qualifiers 79
3.5.4 Constant Qualifiers 80
3.5.5 Absent Qualifier 81
3.6 Flow Control 82
3.6.1 Functions 82
3.6.2 Calling Conventions 83
3.6.3 Built-in Functions 84
3.7 Operations 85
3.7.1 Indexing 86
3.7.2 Swizzling 87
3.7.3 Component-wise Operation 87
3.8 Preprocessor 90
3.9 Preprocessor Expressions 93
3.10 Error Handling 94
3.11 Summary 95
3.12 Further Information 95
Chapter 4. The OpenGL Programmable Pipeline 97
4.1 The Vertex Processor 98
4.1.1 Vertex Attributes 99
4.1.2 Uniform Variables 100
4.1.3 Special Output Variables 101
4.1.4 Built-in Varying Variables 102
4.1.5 User-Defined Varying Variables 103
4.2 The Fragment Processor 104
4.2.1 Varying Variables 104
4.2.2 Uniform Variables 105
4.2.3 Special Input Variables 106
4.2.4 Special Output Variables 107
4.3 Built-in Uniform Variables 108
4.4 Built-in Constants 113
4.5 Interaction with OpenGL Fixed Functionality 114
4.5.1 Two-Sided Color Mode 114
4.5.2 Point Size Mode 115
4.5.3 Clipping 116
4.5.4 Raster Position 117
4.5.5 Position Invariance 117
4.5.6 Texturing 118
4.6 Summary 120
4.7 Further Information 120
Chapter 5. Built-in Functions 123
5.1 Angle and Trigonometry Functions 124
5.2 Exponential Functions 126
5.3 Common Functions 126
5.4 Geometric Functions 136
5.5 Matrix Functions 138
5.6 Vector Relational Functions 139
5.7 Texture Access Functions 141
5.8 Fragment Processing Functions 144
5.9 Noise Functions 145
5.10 Summary 147
5.11 Further Information 147
Chapter 6. Simple Shading Example 149
6.1 Brick Shader Overview 150
6.2 Vertex Shader 151
6.3 Fragment Shader 157
6.4 Observations 164
6.5 Summary 165
6.6 Further Information 165
Chapter 7. OpenGL Shading Language AP I 167
7.1 Obtaining Version Information 168
7.2 Creating Shader Objects 170
7.3 Compiling Shader Objects 172
7.4 Linking and Using Shaders 173
7.5 Cleaning Up 177
7.6 Query Functions 178
7.7 Specifying Vertex Attributes 184
7.8 Specifying Uniform Variables 195
7.9 Samplers 203
7.10 Multiple Render Targets 204
7.11 Development Aids 206
7.12 Implementation-Dependent API Values 207
7.13 Application Code for Brick Shaders 208
7.14 Summary 212
7.15 Further Information 213
Chapter 8. Shader Development 215
8.1 General Principles 215
8.1.1 Understand the Problem 216
8.1.2 Add Complexity Progressively 216
8.1.3 Test and Iterate 217
8.1.4 Strive for Simplicity 217
8.1.5 Exploit Modularity 217
8.2 Performance Considerations 218
8.2.1 Consider Computational Frequency 218
8.2.2 Analyze Your Algorithm 219
8.2.3 Use the Built-in Functions 219
8.2.4 Use Vectors 220
8.2.5 Use Textures to Encode Complex Functions 220
8.2.6 Review the Information Logs 220
8.3 Shader Debugging 220
8.3.1 Use the Vertex Shader Output 221
8.3.2 Use the Fragment Shader Output 221
8.3.3 Use Simple Geometry 222
8.4 Shader Development Tools 222
8.4.1 RenderMonkey 222
8.4.2 OpenGL Shading Language Compiler Front End 225
8.5 Scene Graphs 227
8.6 Summary 229
8.7 Further Information 230
Chapter 9. Emulating OpenGL Fixed Functionality 233
9.1 Transformation 234
9.2 Light Sources 236
9.2.1 Directional Lights 236
9.2.2 Point Lights 237
9.2.3 Spotlights 239
9.3 Material Properties and Lighting 240
9.4 Two-Sided Lighting 243
9.5 No Lighting 244
9.6 Fog 244
9.7 Texture Coordinate Generation 246
9.8 User Clipping 249
9.9 Texture Application 249
9.10 Summary 251
9.11 Further Information 251
Chapter 10. Stored Texture Shaders 253
10.1 Access to Texture Maps from a Shader 254
10.2 Simple Texturing Example 256
10.2.1 Application Setup 257
10.2.2 Vertex Shader 258
10.2.3 Fragment Shader 259
10.3 Multitexturing Example 260
10.3.1 Application Setup 262
10.3.2 Vertex Shader 262
10.3.3 Fragment Shader 263
10.4 Cube Mapping Example 265
10.4.1 Application Setup 266
10.4.2 Vertex Shader 266
10.4.3 Fragment Shader 267
10.5 Another Environment Mapping Example 68
10.5.1 Vertex Shader 269
10.5.2 Fragment Shader 269
10.6 Glyph Bombing 272
10.6.1 Application Setup 272
10.6.2 Vertex Shader 276
10.6.3 Fragment Shader 277
10.7 Summary 281
10.8 Further Information 282
Chapter 11. Procedural Texture Shaders 285
11.1 Regular Patterns 287
11.1.1 Stripes Vertex Shader 289
11.1.2 Stripes Fragment Shader 290
11.2 Toy Ball 292
11.2.1 Application Setup 293
11.2.2 Vertex Shader 294
11.2.3 Fragment Shader 294
11.3 Lattice 299
11.4 Bump Mapping 300
11.4.1 Application Setup 303
11.4.2 Vertex Shader 306
11.4.3 Fragment Shader 306
11.4.4 Normal Maps 308
11.5 Summary 309
11.6 Further Information 310
Chapter 12. Lighting 311
12.1 Hemisphere Lighting 311
12.2 Image-Based Lighting 315
12.3 Lighting with Spherical Harmonics 318
12.4 The *erLight Shader 322
12.4.1 *erLight Controls 323
12.4.2 Vertex Shader 325
12.4.3 Fragment Shader 326
12.5 Summary 329
12.6 Further Information 330
Chapter 13. Shadows 333
13.1 Ambient Occlusion 334
13.2 Shadow Maps 338
13.2.1 Application Setup 340
13.2.2 Vertex Shader 341
13.2.3 Fragment Shader 343
13.3 Deferred Shading for Volume Shadows 346
13.3.1 Shaders for First Pass 349
13.3.2 Shaders for Second Pass 350
13.4 Summary 354
13.5 Further Information 355
Chapter 14. Surface Characteristics 357
14.1 Refraction 358
14.2 Diffraction 363
14.3 BRDF Models 368
14.4 Polynomial Texture Mapping with BRDF Data 375
14.4.1 Application Setup 378
14.4.2 Vertex Shader 379
14.4.3 Fragment Shader 382
14.5 Summary 384
14.6 Further Information 384
Chapter 15. Noise 387
15.1 Noise Defined 388
15.1.1 2D Noise 394
15.1.2 Higher Dimensions of Noise 395
15.1.3 Using Noise in OpenGL Shaders 395
15.2 Noise Textures 396
15.3 Trade-offs 399
15.4 A Simple Noise Shader 400
15.4.1 Application Setup 400
15.4.2 Vertex Shader 400
15.4.3 Fragment Shader 401
15.5 Turbulence 402
15.5.1 Sun Surface Shader 403
15.5.2 Marble 404
15.6 Granite 404
15.7 Wood 405
15.7.1 Application Setup 405
15.7.2 Fragment Shader 406
15.8 Summary 409
15.9 Further Information 409
Chapter 16. Animation 411
16.1 On/Off 412
16.2 Threshold 413
16.3 Translation 413
16.4 Morphing 414
16.4.1 Sphere Morph Vertex Shader 415
16.5 Other Blending Effects 417
16.6 Vertex Noise 417
16.7 Particle Systems 418
16.7.1 Application Setup 420
16.7.2 Confetti Cannon Vertex Shader 423
16.7.3 Further Enhancements 425
16.8 Wobble 426
16.9 Summary 430
16.10 Further Information 430
Chapter 17. Antialiasing Procedural Textures 433
17.1 Sources of Aliasing 433
17.2 Avoiding Aliasing 435
17.3 Increasing Resolution 436
17.4 Antialiased Stripe Example 437
17.4.1 Generating Stripes 437
17.4.2 Analytic Prefiltering 439
17.4.3 Adaptive Analytic Prefiltering 440
17.4.4 Analytic Integration 443
17.4.5 Antialiased Brick Fragment Shader 446
17.5 Frequency Clamping 447
17.5.1 Antialiased Checkerboard Fragment Shader 448
17.6 Summary 450
17.7 Further Information 450
Chapter 18. Non-Photorealistic Shaders 453
18.1 Hatching Example 454
18.1.1 Application Setup 455
18.1.2 Vertex Shader 455
18.1.3 Generating Hatching Strokes 456
18.1.4 Obtaining Uniform Line Density 456
18.1.5 Simulating Lighting 458
18.1.6 Adding Character 459
18.1.7 Hatching Fragment Shader 461
18.2 Technical Illustration Example 462
18.2.1 Application Setup 466
18.2.2 Vertex Shader 466
18.2.3 Fragment Shader 466
18.3 Mandelbrot Example 467
18.3.1 About the Mandelbrot Set 468
18.3.2 Vertex Shader 471
18.3.3 Fragment Shader 472
18.3.4 Julia Sets 474
18.4 Summary 475
18.5 Further Information 476
Chapter 19. Shaders for Imaging 479
19.1 Geometric Image Transforms 480
19.2 Mathematical Mappings 481
19.3 Lookup Table Operations 481
19.4 Color Space Conversions 482
19.5 Image Interpolation and Extrapolation 483
19.5.1 Brightness 484
19.5.2 Contrast 485
19.5.3 Saturation 485
19.5.4 Sharpness 486
19.6 Blend Modes 486
19.6.1 Normal 488
19.6.2 Average 488
19.6.3 Dissolve 488
19.6.4 Behind 488
19.6.5 Clear 489
19.6.6 Darken 489
19.6.7 Lighten 489
19.6.8 Multiply489
19.6.9 Screen 490
19.6.10 Color Burn 490
19.6.11 Color Dodge 490
19.6.12 Overlay 490
19.6.13 Soft Light 491
19.6.14 Hard Light 491
19.6.15 Add 491
19.6.16 Subtract 492
19.6.17 Difference 492
19.6.18 Inverse Difference 492
19.6.19 Exclusion 492
19.6.20 Opacity 492
19.6.21 Convolution 493
19.6.22 Smoothing 495
19.6.23 Edge Detection 498
19.6.24 Sharpening 499
19.7 Summary 501
19.8 Further Information 501
Chapter 20. RealWorldz 505
20.1 Features 505
20.2 RealWorldz Internals 506
20.2.1 Terrain-Rendering Structure 506
20.2.2 Shading 507
20.2.3 Fractal Terrains 508
20.2.4 Fractal Terrains in RealWorldz 510
20.2.5 Noise Texture Creation 510
20.2.6 Tile Set Noise 511
20.2.7 Surface Normals 513
20.2.8 Overhanging Terrain 513
20.3 Implementation 517
20.3.1 Noise Values and Derivatives 517
20.3.2 Tile Sets 518
20.3.3 The Function Tree 519
20.3.4 Terrain Color 521
20.3.5 AltGrad Map for Snow 522
20.3.6 AltGrad Map for AlienRockArt 522
20.3.7 AltGrad Map for DragonRidges 523
20.3.8 Lighting 524
20.3.9 Performance Considerations 524
20.4 Atmospheric Effects 525
20.4.1 Aerial Perspective 525
20.4.2 Sky Shading 529
20.5 Ocean 532
20.5.1 Reflections 532
20.5.2 Reflected Sky 536
20.5.3 Rendering the Ocean 536
20.6 Clouds 537
20.7 Summary 540
20.8 Further Information 540
Chapter 21. Language Comparison 543
21.1 Chronology of Shading Languages 543
21.2 RenderMan 544
21.3 OpenGL Shader (ISL) 547
21.4 HLSL 549
21.5 Cg 552
21.6 Summary 554
21.7 Further Information 555
Appendix A. Language Grammar 559Appendix B. API Function Reference 573
Implementation-Dependent API Values for GLSL 574
Other Queriable Values for GLSL 575
glAttachShader 576
glBindAttribLocation 578
glCompileShader 581
glCreateProgram 583
glCreateShader 585
glDeleteProgram 587
glDeleteShader 589
glDetachShader 591
glDrawBuffers 593
glEnableVertexAttribArray 596
glGetActiveAttrib 598
glGetActiveUniform 601
glGetAttachedShaders 605
glGetAttribLocation 607
glGetProgram 609
glGetProgramInfoLog 612
glGetShader 614
glGetShaderInfoLog 616
glGetShaderSource 618
glGetUniform 620
glGetUniformLocation 622
glGetVertexAttrib 624
glGetVertexAttribPointer 627
glIsProgram 629
glIsShader 631
glLinkProgram 632
glShaderSource 636
glUniform 638
glUseProgram 645
glValidateProgram 649
glVertexAttrib 651
glVertexAttribPointer 657
OpenGL 1.5 to OpenGL 2.0 GLSL Migration Guide 660
Afterword 665Glossary 669Further Reading 689Index 705