OpenGL® Third Edition

Rand! J. Rost Bill Licea-Kane

With cmnfilmtions by Dan Ginsburg, John ivL KesseniA, Barthold Lichtenbelt, Hugh Malan, and Mike Weible,i

Ar Addison-Wesley Upper Saddle River, NJ • Boston • Indianapolis • San Francisco New York • Toronto • Montreal • London • Munieh • Paris • Madrid Capetown • Sydney • Tokyo • Singapore • Mexico City Contents

Foreword to the Second Edition xxi Foreword to the First Edition xxv Preface xxix About the Authors xxxv About the Contributors xxxvii Acknowledgments xxxix

Chapter 1. Review of OpenGL Basics 1 1.1 OpenGL History 1 1.2 OpenGL Evolution 4 1.3 Execution Model 5 1.4 The 6 1.5 State 9 1.6 Processing Pipeline 9 1.7 Drawing Geometry 11 1.7.1 Geometry Specification 11 1.7.2 Per-Vertex Operations 13 1.7.3 Primitive Assembly 15 1.7.4 Primitive Processing 15 1.7.5 Rasterization 16 1.7.6 Fragment Processing 17 1.7.7 Per-Fragment Operations 18 1.7.8 Framebuffer Operations 18 1.8 Drawing Images 19 1.8.1 Pixel Unpacking 20 X Contents

1.8.2 Pixel Transfer 20 1.8.3 Rasterization and Back-End Processing 21 1.8.4 Read Control 22 1.9 Coordinate Transforms 22 1.10 Texturing 27 1.11 Summary 33 1.12 Further Information 33

Chapter 2. Basics 35 2.1 Introduction to the OpenGL Shading Language 35 2.2 Why Write ? 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 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 Pair 65 3.2 Data Types 67 3.2.1 Scalars 68 3.2.2 Vectors 69 3.2.3 Matrices 70 3.2.4 Samplers 71 3.2.5 Structures 73 3.2.6 Arrays 74 3.2.7 Void 75 Contents Xi

3.2.8 Declarations and Scope 75 3.2.9 Type Matching and Promotion 76 3.3 Initializers and Constructors 76 3.4 Type Conversions 78 3.5 Qualifiers and Interface to a Shader 79 3.5.1 Uniform Qualifiers 80 3.5.2 Uniform Blocks 81 3.5.3 In Qualifiers (Vertex Shader) 82 3.5.4 Out Qualifiers (Vertex Shader) 82 3.5.5 In Qualifiers (Fragment Shader) 83 3.5.6 Out Qualifiers (Fragment Shader) 83 3.5.7 Constant Qualifiers 83 3.5.8 Absent Qualifier 84 3.6 Flow Control 84 3.6.1 Functions 85 3.6.2 Calling Conventions 86 3.6.3 Built-in Functions 87 3.7 Operations 88 3.7.1 Indexing 89 3.7.2 Swizzling 90 3.7.3 Component-wise Operation 90 3.8 Preprocessor 93 3.9 Preprocessor Expressions 96 3.10 Error Handling 97 3.11 Summary 98 3.12 Further Information 98

Chapter 4. The OpenGL Programmable Pipeline 101 4.1 The Vertex Processor 102 4.1.1 Vertex Attributes 103 4.1.2 Special Input Variables 104 4.1.3 Uniform Variables 104 4.1.4 User-Defined Out Variables 104 4.1.5 Special Output Variables 105 4.2 The Fragment Processor 106 4.2.1 User-Defined In Variables 107 4.2.2 Special Input Variables 107 4.2.3 Uniform Variables 108 4.2.4 User-Defined Out Variables 108 4.2.5 Special Output Variables 109 xi i Contents

4.3 Built-in Uniform Variables 110 4.4 Built-in Constants 110 4.5 Interaction with OpenGL Fixed Functionality 111 4.5.1 Point Size Mode 111 4.5.2 Clipping 112 4.5.3 Position Invariance 113 4.5.4 Texturing 113 4.6 Summary 115 4.7 Further Information 115

Chapter 5. Built-in Functions 117 5.1 Angle and Trigonometry Functions 118 5.2 Exponential Functions 121 5.3 Common Functions 122 5.4 Geometric Functions 134 5.5 Matrix Functions 136 5.6 Vector Relational Functions 138 5.7 Texture Access Functions 140 5.8 Fragment Processing Functions 176 5.9 Noise Functions 177 5.10 Summary 178 5.11 Further Information 178

Chapter 6. Simple Shading Example 181 6.1 Brick Shader Overview 182 6.2 Vertex Shader 183 6.3 Fragment Shader 189 6.4 Observations 196 6.5 Summary 197 6.6 Further Information 197

Chapter 7. OpenGL Shading Language API 199 7.1 Obtaining Version Information 200 7.2 Creating Shader Objects 203 7.3 Compiling Shader Objects 204 7.4 Linking and Using Shaders 205 7.5 Cleaning Up 210 7.6 Query Functions 211 7.7 Specifying Vertex Attributes 217 Contents Xiii

7.8 Specifying Uniform Variables 226 7.8.1 Default Uniform Block 227 7.8.2 Named Uniform Blocks 234 7.9 Samplers 238 7.10 239 7.11 Development Aids 240 7.12 Implementation-Dependent API Values 241 7.13 Application Code for Brick Shaders 242 7.14 Summary 247 7.15 Further Information 248

Chapter 8. Shader Development 251 8.1 General Principles 251 8.1.1 Understand the Problem 252 8.1.2 Add Complexity Progressively 252 8.1.3 Test and Iterate 253 8.1.4 Strive for Simplicity 253 8.1.5 Exploit Modularity 253 8.2 Performance Considerations 254 8.2.1 Consider Computational Frequency 254 8.2.2 Analyze Your Algorithm 255 8.2.3 Use the Built-in Functions 255 8.2.4 Use Vectors 255 8.2.5 Use Textures to Encode Complex Functions 256 8.2.6 Review the Information Logs 256 8.3 Shader Debugging 256 8.3.1 Use the Vertex Shader Output 256 8.3.2 Use the Fragment Shader Output 257 8.3.3 Use Simple Geometry 258 8.4 Shader Development Tools 258 8.4.1 RenderMonkey 258 8.4.2 Apple GLSLEditorSample 261 8.4.3 Graphic Remedy gDEBugger 261 8.4.4 OpenGL Shading Language Compiler Front End . . 261 8.5 Scene Graphs 263 8.6 Summary 266 8.7 Further Information 266 Xiv Contents

Chapter 9. Emulating OpenGL Fixed Functionality 269 9.1 Transformation 270 9.2 Light Sources 273 9.2.1 Directional Lights 273 9.2.2 Point Lights 274 9.2.3 Spotlights 276 9.3 Material Properties and Lighting 277 9.4 Two-Sided Lighting 279 9.5 No Lighting 280 9.6 Fog 281 9.7 Texture Coordinate Generation 283 9.8 User Clipping 286 9.9 Texture Application 286 9.10 Matrices 288 9.10.1 Identity Matrix 288 9.10.2 Scale 288 9.10.3 Translate 289 9.10.4 Rotate 289 9.10.5 Ortho 290 9.10.6 Frustum 290 9.11 Operating an the Current Matrices 291 9.11.1 A Simple Matrix Transformation Example 293 9.12 Summary 294 9.13 Further Information 294

Chapter 10. Stored Texture Shaders 297 10.1 Access to Texture Maps from a Shader 298 10.2 Simple Texturing Example 300 10.2.1 Application Setup 301 10.2.2 Vertex Shader 302 10.2.3 Fragment Shader 303 10.3 Multitexturing Example 303 10.3.1 Application Setup 305 10.3.2 Vertex Shader 306 10.3.3 Fragment Shader 307 10.4 Cube Mapping Example 309 10.4.1 Application Setup 310 10.4.2 Vertex Shader 310 10.4.3 Fragment Shader 311 Contents xv

10.5 Another Environment Mapping Example 312 10.5.1 Vertex Shader 313 10.5.2 Fragment Shader 314 10.6 Glyph Bombing 316 10.6.1 Application Setup 317 10.6.2 Vertex Shader 321 10.6.3 Fragment Shader 322 10.7 Summary 326 10.8 Further Information 326

Chapter 11. Procedural Texture Shaders 329 11.1 Regular Patterns 331 11.1.1 Stripes Vertex Shader 333 11.1.2 Stripes Fragment Shader 334 11.2 Toy Ball 336 11.2.1 Application Setup 337 11.2.2 Vertex Shader 338 11.2.3 Fragment Shader 339 11.3 Lattice 344 11.4 Bump Mapping 345 11.4.1 Application Setup 348 11.4.2 Vertex Shader 350 11.4.3 Fragment Shader 351 11.4.4 Normal Maps 353 11.5 Summary 354 11.6 Further Information 354

Chapter 12. Lighting 357 12.1 Hemisphere Lighting 357 12.2 Image-Based Lighting 361 12.3 Lighting with Spherical Harmonics 365 12.4 The Überlight Shader 369 12.4.1 Überlight Controls 369 12.4.2 Vertex Shader 372 12.4.3 Fragment Shader 373 12.5 Summary 376 12.6 Further Information 376 xvi Contents

Chapter 13. Shadows 379 13.1 Ambient Occlusion 380 13.2 Shadow Maps 385 13.2.1 Application Setup 387 13.2.2 Vertex Shader 388 13.2.3 Fragment Shader 389 13.3 Deferred Shading for Volume Shadows 392 13.3.1 Shaders for First Pass 395 13.3.2 Shaders for Second Pass 396 13.4 Summary 400 13.5 Further Information 400

Chapter 14. Surface Characteristics 403 14.1 Refraction 404 14.2 Diffraction 410 14.3 BRDF Models 415 14.4 Polynomial with BRDF Data 422 14.4.1 Application Setup 425 14.4.2 Vertex Shader 426 14.4.3 Fragment Shader 429 14.5 Summary 431 14.6 Further Information 432

Chapter 15. Noise 435 15.1 Noise Defined 436 15.1.1 2D Noise 442 15.1.2 Higher Dimensions of Noise 443 15.1.3 Using Noise in OpenGL Shaders 443 15.2 Noise Textures 444 15.3 Trade-offs 447 15.4 A Simple Noise Shader 448 15.4.1 Application Setup 448 15.4.2 Vertex Shader 448 15.4.3 Fragment Shader 449 15.5 Turbulence 451 15.5.1 Sun Surface Shader 451 15.5.2 452 15.6 Granite 453 Contents Xvii

15.7 Wood 454 15.7.1 Application Setup 454 15.7.2 Fragment Shader 455 15.8 Summary 457 15.9 Further Information 458

Chapter 16. Animation 461 16.1 On/Off 462 16.2 Threshold 463 16.3 Translation 463 16.4 Morphing 464 16.4.1 Sphere Morph Vertex Shader 466 16.5 Other Blending Effects 467 16.6 Vertex Noise 468 16.7 Particle Systems 469 16.7.1 Application Setup 470 16.7.2 Confetti Cannon Vertex Shader 473 16.7.3 Further Enhancements 476 16.8 Wobble 476 16.9 Animating Once per Frame 480 16.9.1 Application Setup 481 16.9.2 Updating Matrices Once per Frame 482 16.10 Summary 483 16.11 Further Information 484

Chapter 17. Antialiasing Procedural Textures 487 17.1 Sources of Aliasing 487 17.2 Avoiding Aliasing 489 17.3 Increasing Resolution 490 17.4 Antialiased Stripe Example 491 17.4.1 Generating Stripes 491 17.4.2 Analytic Prefiltering 493 17.4.3 Adaptive Analytic Prefiltering 494 17.4.4 Analytic Integration 498 17.4.5 Antialiased Brick Fragment Shader 501 17.5 Frequency Clamping 502 17.5.1 Antialiased Checkerboard Fragment Shader 502 17.6 Summary 504 17.7 Further Information 504 xviii Contents

Chapter 18. Non-photorealistic Shaders 507 18.1 Hatching Example 508 18.1.1 Application Setup 508 18.1.2 Vertex Shader 509 18.1.3 Generating Hatching Strokes 510 18.1.4 Obtaining Uniform Line Density 511 18.1.5 Simulating Lighting 513 18.1.6 Adding Character 513 18.1.7 Hatching Fragment Shader 515 18.2 Technical Illustration Example 516 18.2.1 Application Setup 520 18.2.2 Vertex Shader 520 18.2.3 Fragment Shader 521 18.3 Mandelbrot Example 521 18.3.1 About the Mandelbrot Set 522 18.3.2 Vertex Shader 525 18.3.3 Fragment Shader 526 18.3.4 Julia Sets 529 18.4 Summary 529 18.5 Further Information 530

Chapter 19. Shaders for Imaging 533 19.1 Geometric Image Transforms 534 19.2 Mathematical Mappings 534 19.3 Lookup Table Operations 535 19.4 Color Space Conversions 536 19.5 Image Interpolation and Extrapolation 537 19.5.1 Brightness 537 19.5.2 Contrast 538 19.5.3 Saturation 538 19.5.4 Sharpness 539 19.6 Blend Modes 540 19.6.1 Normal 541 19.6.2 Average 541 19.6.3 Dissolve 542 19.6.4 Behind 542 19.6.5 Clear 542 19.6.6 Darken 542 19.6.7 Lighten 543 Contents xix

19.6.8 Multiply 543 19.6.9 Screen 543 19.6.10 Color Burn 543 19.6.11 Color Dodge 544 19.6.12 Overlay 544 19.6.13 Soft Light 544 19.6.14 Hard Light 545 19.6.15 Add 545 19.6.16 Subtract 545 19.6.17 Difference 545 19.6.18 Inverse Difference 546 19.6.19 Exclusion 546 19.6.20 Opacity 546 19.7 Convolution 546 19.7.1 Smoothing 549 19.7.2 Edge Detection 552 19.7.3 Sharpening 553 19.8 Summary 555 19.9 Further Information 555

Chapter 20. Language Comparison 559 20.1 Chronology of Shading Languages 559 20.2 RenderMan 560 20.3 OpenGL Shader (ISL) 563 20.4 HLSL 565 20.5 Cg 568 20.6 Summary 570 20.7 Further Information 570

Appendix A. Language Grammar 573

Appendix B. API Function Reference 589 Implementation-Dependent API Values for GLSL 590 Other Queriable Values for GLSL 591 glAttachShader 592 glBindAttribLocation 594 glCompileShader 597 glCreateProgram 599 glCreateShader 601 glDeleteProgram 603 xx Contents

glDeleteShader 605 gID etachShader 607 glDrawBuffers 609 glEnableVertexAttribArray 612 glGetActiveAttrib 614 glGetActiveUniform 617 glGetAttachedShaders 621 glGetAttribLocation 623 glGetProgram 625 glGetProgramInfoLog 628 glGetShader 630 glGetShaderInfoLog 632 glGetShaderSource 634 glGetUniform 636 glGetUniformLocation 638 glGetVertexAttrib 640 glGetVertexAttribPointer 643 glIsProgram 645 gllsShader 647 glLinkProgram 648 glShaderSource 652 glUniform 654 glUseProgram 661 glValidateProgram 665 glVertexAttrib 667 glVertexAttribPointer 673 OpenGL 1.5 to OpenGL 2.0 GLSL Migration Guide 676

Afterword 681

Glossary 685

Further Reading 705

Index 721