OPENGL BACKGROUND CS 4363/6353 WHY IS THIS CLASS SO HARD TO TEACH? (I’LL STOP WHINING SOON) • Hardware (GPUs) double in processing power ever 6 months! • The “graphics pipeline” has been *drastically* changing • Core profile • Compatibility profile (for backwards compatibility) • More of the pipeline is available: • Good for developers (beautiful graphics) • Hard for teachers (more difficult to get a “Hello, World!” going) • Requires students to understand more simply to begin • Need scaffolding WHAT IS OPENGL? • “Open” (source) Graphics Language • Developed by Silicon Graphics, Inc. (SGI) • Not a language, but an API (Application Programming Interface) • Include the “new” GLSL (Shading Language) – a C-like language for rendering • Intended to run on hardware • Cross-platform (MacOS, Windows, Linux using Mesa3D) • Was “owned” by an industry board (the ARB – Architecture Review Board) and now the Khronos group • OpenGL != GPGPU • Mesa is an open-source software implementation VERSIONS • • V1 – Fixed function pipeline • 1992 – 1.0 • 1997 – 1.1 • 1998 - 1.2 • 2001 – 1.3 • 2002 – 1.4 • 2003 – 1.5 V2 – Programmable pipeline • 2004 – 2.0 • 2006 - 2. * No longer backwards compatible • • V3* – Programmable buffers • 2008 – 3.0 • 2009 – 3.1 • 2009 – 3.2 • 2010 – 3.3 V4 - ?? • 2010 – 4.0 • 2011 (Aug) – 4.2 STATE MACHINE • OpenGL is a state machine that uses a client/server model • Our (C/C++) program is the client • The hardware (GPU driver) is the server • Client sends commands to the server • This is what GLEW does – asks the driver for pointers to all the gl functions! HELPER LIBRARIES YOU MIGHT USE • GL – The Graphics Library (opengl32.lib and DLL) • GLUT – OpenGL “Utility Toolkit” for system-independent windows, which also accepts user input (mouse). Others are: • SDL • GLX • WGL • We’ll use “FreeGLUT” • GLEW – The GL “Extension Wrangler” for determining which vendor extensions are available and loading them (later GL CONVENTIONS • Functions can begin with gl or glut • Data types usually begin with GL • GLboolean -1 bit • GLsizei – 32 bits • GLbyte – 8 bits • GLenum – 32 bits • GLubyte – 8 bits (unsigned) • GLfloat – 32 bits • GLchar – 8 bits • GLdouble – 64 bits • GLshort - 16 bits • GLint64 – 64 bits • GLushort – 16 bits unsigned • GLintptr – native pointer • GLint – 32 bits • GLuint – 32 bits unsigned • Enumerants start with GL_ • GL_TRIANGLES OPENGL ERRORS • Hard to debug! • Use the built-in method to determine which error occurred: • GL_INVALID_ENUM • GL_INVALID_VALUE • GL_INVALID_OPERATION • GL_OUT_OF_MEMORY • GL_NO_ERROR if (glGetError() == GL_INVALID_OPERATION) {...} • Note: invalid function calls are quietly disregarded! IDENTIFYING THE VERSION • Can query for the vendor and version number of the rendering engine: const GLubyte* glGetString(GLenum name); HINTS… • Sometimes, you need speed at the sacrifice of quality. glHint (GLenum target, GLenum mode) • Sometimes, you need speed at the sacrifice of quality. glHint (GL_POLYGON_SMOOTH, GL_FASTEST); ARE YOU AN ENABLER? (MORE OF THE STATE MACHINE) • In OpenGL, we are always turning features on and off with glEnable and glDisable • By default, everything is disabled! • Example: glEnable (GL_DEPTH_TEST); . . . glDisable (GL_DEPTH_TEST); • Note: you can always determine if something is on with GLboolean glIsEnabled(GLenum); COLOR THEORY • All colors in OpenGL are comprised of three primary colors • Red • Green • Blue • Have two separate ranges • 0-255 • 0.0-1.0 • Examples: • Red = {255, 0, 0} • Green = {0, 255, 0} • Blue = {0, 0, 255} LIGHTING • Lighting is complex! • We have to make approximations to real-world lighting • For now, understand OpenGL supports the idea of: • Camera (View) – using a matrix • Light sources – using an array • Normals of a triangle • We use math to calculate light THE GRAPHICS PIPELINE (AKA - THE BIG PICTURE) Vertex Processing Clipping/Assembly Rasterization Fragment Processing 4 major phases, though several sub-phases THE GRAPHICS PIPELINE (AKA - THE BIG PICTURE) Vertex Processing Clipping/Assembly Rasterization Fragment Processing Vertex Processing • Transform vertices using math • Light a vertex • Determine the color of a vertex • We write vertex shaders to do this! THE GRAPHICS PIPELINE (AKA - THE BIG PICTURE) Vertex Processing Clipping/Assembly Rasterization Fragment Processing Clipping and Primitive Assembly • Assemble vertices into triangles • Clip triangles if they straddle viewport • We have no (programmable) control over this THE GRAPHICS PIPELINE (AKA - THE BIG PICTURE) Vertex Processing Clipping/Assembly Rasterization Fragment Processing Rasterization • “Scanline” converting • Output is a set of “uncolored” fragments • Not programmable THE GRAPHICS PIPELINE (AKA - THE BIG PICTURE) Vertex Processing Clipping/Assembly Rasterization Fragment Processing Fragment Processing • Works on a pixel/fragment basis • Determining the color of each pixel • We write pixel shaders for this • Lighting • Materials • Color information