The document provides an overview of OpenGL and GLUT (OpenGL Utility Toolkit). It discusses that OpenGL is a graphics library specification that allows specification of geometric objects using points, lines and polygons. Since OpenGL has limited drawing commands, GLUT was created to aid in developing more complex 3D objects. The document then describes the OpenGL rendering pipeline and various components involved, including evaluators, per-vertex operations, rasterization and display lists. It also discusses libraries, include files, compiling OpenGL programs, and basic functions like initialization, display callback, reshape callback and the main loop.
Download as PPTX, PDF, TXT or read online on Scribd
0 ratings0% found this document useful (0 votes)
64 views
OPENGL - Intro
The document provides an overview of OpenGL and GLUT (OpenGL Utility Toolkit). It discusses that OpenGL is a graphics library specification that allows specification of geometric objects using points, lines and polygons. Since OpenGL has limited drawing commands, GLUT was created to aid in developing more complex 3D objects. The document then describes the OpenGL rendering pipeline and various components involved, including evaluators, per-vertex operations, rasterization and display lists. It also discusses libraries, include files, compiling OpenGL programs, and basic functions like initialization, display callback, reshape callback and the main loop.
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 21
OpenGL
• OpenGL is a low-level graphics library specification. It makes
available to the programmer a small set of geometric primitives - points, lines, polygons, images, and bitmaps. OpenGL provides a set of commands that allow the specification of geometric objects in two or three dimensions, using the provided primitives, together with commands that control how these objects are rendered (drawn). • Since OpenGL drawing commands are limited to those that generate simple geometric primitives (points, lines, and polygons), the OpenGL Utility Toolkit (GLUT) has been created to aid in the development of more complicated three-dimensional objects such as a sphere, a torus, and even a teapot GLUT • GLUT is designed to fill the need for a window system independent programming interface for OpenGL programs. The interface is designed to be simple yet still meet the needs of useful OpenGL programs. • GLUT simplifies the implementation of programs using OpenGL rendering. The GLUT application programming interface (API) requires very few routines to display a graphics scene rendered using OpenGL. The GLUT routines also take relatively few parameters. • Rendering Pipeline • Most implementations of OpenGL have a similar order of operations, a series of processing stages called the OpenGL rendering pipeline. Although this is not a strict rule of how OpenGL is implemented, it provides a reliable guide for predicting what OpenGL will do. Geometric data (vertices, line, and polygons) follow a path through the row of boxes that includes evaluators and per-vertex operations, while pixel data (pixels, images and bitmaps) are treated differently for part of the process. Both types of data undergo the same final step (rasterization) before the final pixel data is written to the framebuffer. • Display Lists: All data, whether it describes geometry or pixels, can be saved in a display list for current or later use. (The alternative to retaining data in a display list is processing the data immediately-known as immediate mode.) When a display list is executed, the retained data is sent from the display list just as if it were sent by the application in immediate mode. Evaluators and Per-Vertex and Primitive Assembly • Evaluators: All geometric primitives are eventually described by vertices. Evaluators provide a method for deriving the vertices used to represent the surface .The method is a polynomial mapping, which can produce surface normal, colors.
• Per-Vertex and Primitive Assembly: For vertex data, the next step
converts the vertices into primitives. Some types of vertex data are transformed by 4x4 floating-point matrices. Spatial coordinates are projected from a position in the 3D world to a position on your screen. In some cases, this is followed by perspective division, which makes distant geometric objects appear smaller than closer objects. Then depth operations are applied. The results at this point are geometric primitives, which are transformed with related color and depth values. Pixel Operations and Rasterization • Pixel Operations: While geometric data takes one path through the OpenGL rendering pipeline, pixel data takes a different route. Pixels from an array in system memory are first unpacked form one of a variety of formats into the proper number of components. Next the data is scaled, biased, processed by a pixel map, and sent to the rasterization step. • Rasterization: Rasterization is the conversion of both geometric and pixel data into fragments. Each fragment corresponds to a pixel in the frame buffer. Color and depth values are assigned for each fragment. The processed fragment is then drawn into the appropriate buffer, where it has finally advanced to be a pixel and achieved its final resting place. Libraries • OpenGL provides a powerful but primitive set of rendering command, and all higher-level drawing must be done in terms of these commands. There are several libraries that allow you to simplify your programming tasks, including the following: • OpenGL Utility Library (GLU) contains several routines that use lower-level OpenGL commands to perform such tasks as setting up matrices for specific viewing orientations and projections and rendering surfaces. OpenGL Utility Toolkit (GLUT) is a window-system- independent toolkit, written by Mark Kilgard. Include Files • For all OpenGL applications, you want to include the gl.h header file in every file. Almost all OpenGL applications use GLU, the aforementioned OpenGL Utility Library, which also requires inclusion of the glu.h header file. So almost every OpenGL source file begins with: • #include <GL/gl.h> #include <GL/glu.h> • If you are using the OpenGL Utility Toolkit (GLUT) for managing your window manager tasks, you should include: • #include <GL/glut.h> • Note that glut.h guarantees that gl.h and glu.h are properly included for you so including these three files is redundant. To make your GLUT programs portable, include glut.h and do not include gl.h or glu.h explicitly. Compiling OpenGL/GLUT Programs • Create a new project: – choose File | New from the File Menu – select the Projects tab – choose Console Application – fill in your Project name • Designate library files for the linker to use: – choose Project | Settings from the File Menu – under Project /library modules: enter "opengl32.lib glu32.lib glut32.lib" • Add/Create files to the project: – choose Project | Add to Project | Files from the File menu – add the required program files • Build and Execute Initialization • The first thing we need to do is call the glutInit() procedure. It should be called before any other GLUT routine because it initializes the GLUT library. • The next thing we need to do is call the glutInitDisplayMode() procedure to specify the display mode for a window. RGBA (GLUT_RGBA) or color model. The RGBA mode stores its color buffers as red, green, blue, and alpha color components. The forth color component, alpha, corresponds to the notion of opacity. An alpha value of 1.0 implies complete opacity, and an alpha value of 0.0 complete transparency. • Another decision you need to make when setting up the display mode is whether you want to use single buffering (GLUT_SINGLE) or double buffering (GLUT_DOUBLE). Applications that use both front and back color buffers are double-buffered. Smooth animation is accomplished by rendering into only the back buffer (which isn't displayed), then causing the front and back buffers to be swapped. If you aren't using animation, stick with single buffering, which is the default. • We need to create the characteristics of our window. A call to glutInitWindowSize() will be used to specify the size, in pixels, of your initial window. The arguments indicate the height and width (in pixels) of the requested window. • Similarly, glutInitWindowPosition() is used to specify the screen location for the upper-left corner of your initial window. The arguments, x and y, indicate the location of the window relative to the entire display. Creating a Window • To actually create a window, the with the previously set characteristics (display mode, size, location, etc), the programmer uses the glutCreateWindow() command. The command takes a string as a parameter which may appear in the title bar if the window system you are using supports it. The window is not actually displayed until the glutMainLoop() is entered. Display Function • The glutDisplayFunc() procedure is the first and most important event callback function you will see. glutDisplayFunc() is the function that is called whenever GLUT determines that the contents of the window needs to be redisplayed. Therefore, you should put all the routines that you need to draw a scene in this display callback function. Reshape Function • The glutReshapeFunc() is a callback function that specifies the function that is called whenever the window is resized or moved. Typically, the function that is called when needed by the reshape function displays the window to the new size and redefines the viewing characteristics as desired.. Main Loop • The very last thing you must do is call glutMainLoop(). All windows that have been created can now be shown, and rendering those windows is now effective. The program will now be able to handle events as they occur (mouse clicks, window resizing, etc). In addition, the registered display callback (from our glutDisplayFunc()) is triggered. Once this loop is entered, it is never exited! glFlush • The final thing we need to do is then flush the current buffer to the screen so we • can see it. This can be done with glFlush() as we are only using a single buffer. void display() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque glClear(GL_COLOR_BUFFER_BIT); // Clear the color buffer
// Draw a Red 1x1 Square centered at origin
glBegin(GL_QUADS); // Each set of 4 vertices form a quad glColor3f(1.0f, 0.0f, 0.0f); // Red glVertex2f(-0.5f, -0.5f); // x, y glVertex2f( 0.5f, -0.5f); glVertex2f( 0.5f, 0.5f); glVertex2f(-0.5f, 0.5f); glEnd();
glFlush(); // Render now
} int main(int argc, char** argv) { glutInit(&argc, argv); // Initialize GLUT glutCreateWindow("OpenGL Setup Test"); // Create a window with the given title glutInitWindowSize(320, 320); // Set the window's initial width & height glutInitWindowPosition(50, 50); // Position the window's initial top- left corner glutDisplayFunc(display); // Register display callback handler for window re-paint glutMainLoop(); // Enter the infinitely event-processing loop return 0; }