OpenGUES 2.0 Programming Guide Aaftab Munshi Dan Ginsburg Dave Shreiner TT r^addison-wesley Upper Saddle River, NJ Boston Indianapolis San Francisco New York Toronto Montreal London Munich Paris Madrid Capetown Sydney Tokyo Singapore Mexico City
List of Figures List of Examples List of Tables Foreword Preface Intended Audience Organization of the Book Example Code and Shaders Errata Acknowledgments About the Authors xiii xv...xix xxi xxiii xxiii xxiv xxviii xxviii xxix xxxi 1. Introduction to OpenGL ES 2.0 1 What Is OpenGL ES? 1 OpenGL ES 2.0 3 Vertex Shader 4 Primitive Assembly 6 Rasterization 7 Fragment Shader 7 Per-Fragment Operations 9
OpenGL ES 2.0 and OpenGL ES 1.x Backward Compatibility 11 EGL 12 Programming with OpenGL ES 2.0 13 Libraries and Include Files 13 EGL Command Syntax 14 OpenGL ES Command Syntax 14 Error Handling 15 Flush and Finish 16 Basic State Management 17 Further Reading 18 2. Hello Triangle: An OpenGL ES 2.0 Example 19 Code Framework 20 Where to Download the Examples 20 Hello Triangle Example 21 Building and Running the Examples 25 Using the OpenGL ES 2.0 Framework 26 Creating a Simple Vertex and Fragment Shader 27 Compiling and Loading the Shaders 29 Creating a Program Object and Linking the Shaders : 30 Setting the Viewport and Clearing the Color Buffer 32 Loading the Geometry and Drawing a Primitive 33 Displaying the Back Buffer 33 3. An Introduction to EGL 35 Communicating with the Windowing System 36 Checking for Errors 37 Initializing EGL 37 Determining the Available Surface Configurations 38 Querying EGLConfig Attributes 39 Letting EGL Choose the Config 39 Creating an On-Screen Rendering Area: The EGL Window 43 Creating an Off-Screen Rendering Area: EGL Pbuffers 46 Creating a Rendering Context 50 Making an EGLContext Current 52 Putting All Our EGL Knowledge Together 52 Synchronizing Rendering 54 vi
4. Shaders and Programs 57 Shaders and Programs 57 Creating and Compiling a Shader 58 Creating and Linking a Program 62 Uniforms and Attributes 67 Getting and Setting Uniforms 67 Getting and Setting Attributes 72 Shader Compiler and Shader Binaries 72 5. OpenGL ES Shading Language 77 OpenGL ES Shading Language Basics 78 Variables and Variable Types 78 Variable Constructors, 79 Vector and Matrix Components 81 Constants 82 Structures 82 Arrays 83 Operators 84 Functions.85 Built-in Functions 86 Control Flow Statements 87 Uniforms.-. 88 Attributes 89 Varyings 90 Preprocessor and Directives 92 Uniform and Varying Packing 94 Precision Qualifiers 96 Invariance 97 6. Vertex Attributes, Vertex Arrays, and Buffer Objects 101 Specifying Vertex Attribute Data 102 Constant Vertex Attribute 102 Vertex Arrays 103 Declaring Vertex Attribute Variables in a Vertex Shader 110 Binding Vertex Attributes to Attribute Variables in a Vertex Shader 113 vii
Vertex Buffer Objects 115 Mapping Buffer Objects 124 Performance Tip 125 7. Primitive Assembly and Rasterization 127 Primitives 127 Triangles 128 Lines 129 Point Sprites 130 Drawing Primitives 131 Performance Tips 134 Primitive Assembly 136 Coordinate Systems 137 Clipping 138 Perspective Division 139 Viewport Transformation 140 Rasterization 141 Culling 142 Polygon Offset 143 8. Vertex Shaders 147 Vertex Shader Overview 148 Vertex Shader Built-in Variables 149 Precision Qualifiers : 152 ES 2.0 Vertex Shader Limitations 152 Vertex Shader Examples 159 A Simple Vertex Shader 160 Lighting in a Vertex Shader 160 Generating Texture Coordinates 167 Vertex Skinning 168 OpenGL ES 1.1 Vertex Pipeline as an ES 2.0 Vertex Shader 173 9. Texturing 181 Texturing Basics 181 2D Textures 182 Cubemap Textures 183 viii
Texture Objects and Loading Textures 184 Texture Filtering and Mipmapping 188 Automatic Mipmap Generation 193 Texture Coordinate Wrapping 194 Using Textures in the Fragment Shader 196 Example of Using a Cubemap Texture 198 Compressed Textures 201 Texture Subimage Specification 202 Copying Texture Data from the Color Buffer 204 Optional Extensions 207 3D Textures 207 Ericsson Texture Compression (ETC) 213 Floating-Point Textures... 213 Non-Power-of-Two Textures 214 10. Fragment Shaders 215 Fixed Function Fragment Shaders 216 Fragment Shader Overview 218 Built-in Special Variables 219 Built-in Constants 220 Precision Qualifiers 221 ES 2.0 Fragment Shader Limitations 221 Implementing Fixed Function Techniques Using Shaders 222 Multitexturing 222 Fog, 224. Alpha Test (Using Discard) 227 User Clip Planes 229 11. Fragment Operations 233 Buffers 234 Requesting Additional Buffers 235 Clearing Buffers 235 Using Masks to Control Writing to Framebuffers 236 Fragment Tests and Operations 238 Using the Scissor Test 239 Stencil Buffer Testing 240 ix
Depth Buffer Testing 245 Blending 246 Dithering 249 Multisampled Antialiasing 249 Reading and Writing Pixels to the Framebuffer 250 12. Framebuffer Objects 253 Why Framebuffer Objects? 253 Framebuffer and Renderbuffer Objects 255 Choosing a Renderbuffer Versus a Texture as a Framebuffer Attachment 256 Framebuffer Objects Versus EGL Surfaces 257 Creating Framebuffer and Renderbuffer Objects 258 Using Renderbuffer Objects 259 Using Framebuffer Objects 262 Attaching a Renderbuffer as a Framebuffer Attachment 263 Attaching a 2D Texture as a Framebuffer Attachment 264 Attaching an Image of a 3D Texture as a Framebuffer Attachment 266 Checking for Framebuffer Completeness 267 Deleting Framebuffer and Renderbuffer Objects 269 Deleting Renderbuffer Objects That Are Used as Framebuffer Attachments 270 Reading Pixels and Framebuffer Objects 270 Examples 271 Performance Tips and Tricks 277 13. Advanced Programming with OpenGL ES 2.0 279 Per-Fragment Lighting 279 Lighting with a Normal Map 280 Lighting Shaders 281 Lighting Equations 285 Environment Mapping 286 Particle System with Point Sprites 290 Particle System Setup 290 Particle System Vertex Shader 291 Particle System Fragment Shader 293
Image Postprocessing : 296 Render-to-Texture Setup 297 Blur Fragment Shader 297 Light Bloom 298 Projective Texturing 300 Projective Texturing Basics 301 Matrices for Projective Texturing 303 Projective Spotlight Shaders. 304 Noise Using a 3D Texture 307 Generating Noise 308 Using Noise 313 Procedural Texturing '. 315 A Procedural Texture Example 316 Antialiasing of Procedural Textures 319 Further Reading on Procedural Textures 322 14. State Queries 323 OpenGL ES 2.0 Implementation String Queries 323 Querying Implementation-Dependent Limits 324 Querying OpenGL ES State 327 Hints.'. 330 Entity Name Queries 331 Nonprogrammable Operations Control and Queries 332 Shader and Program State Queries 333 Vertex Attribute Queries 335 Texture State Queries 336 Vertex Buffer Queries 337 Renderbuffer and Framebuffer State Queries 337 15. OpenGL ES and EGL on Handheld Platforms 339 Handheld Platforms Overview 339 Online Resources 340 C++Portability 341 OpenKODE 343 Platform-Specific Shader Binaries 350 Targeting Extensions 351 xi
A. GL_HALF_FLOAT_OES 353 16-Bit Floating-Point Number 354 Converting Float to Half-Float 355 B. Built-in Functions 357 Angle and Trigonometry Functions 358 Exponential Functions 360 Common Functions 361 Geometric Functions 364 Matrix Functions 366 Vector Relational Functions 367 Texture Lookup Functions 369 Derivative Functions 371 C. Shading Language Grammar 375 D. ES Framework API 385 Framework Core Functions 385 Transformation Functions 390 E. OpenGL ES 2.0 on the iphone 3GS 395 Getting Started with the iphone SDK 3.0 396 Getting the Sample Code for the iphone 396 Building the Sample Code Using Xcode 397 Porting the Sample Code to the iphone 399 Objective C 399 Creating an OpenGL ES 2.0 Rendering Surface 400 Using a Framebuffer Object for Rendering 401 Discussion of a Complete Example 401 EAGLView.h Header File 401 EAGLView.m Source File 403 Transitioning from OpenGL ES 1.1 to OpenGL ES 2.0 411 Conclusion 412 Index 413 xii