Opengl® Shading Language Third Edition
Total Page:16
File Type:pdf, Size:1020Kb
OpenGL® Shading Language 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 Framebuffer 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 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 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 Multiple Render Targets 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 Texture Mapping 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.