1 / 48

OpenGL: Introduction

OpenGL: Introduction Inspired by slides from Mitch Parry and from David Luebke 3D Modeling, Graphics, and Animation Prof. Jarek Rossignac College of Computing Georgia Institute of Technology Outline Historical perspective on hardware, standards, markets Resources: Web sites and books

jana
Télécharger la présentation

OpenGL: Introduction

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. OpenGL: Introduction Inspired by slides from Mitch Parry and from David Luebke 3D Modeling, Graphics, and Animation Prof. Jarek Rossignac College of Computing Georgia Institute of Technology Jarek Rossignac, CoC, GT, ©Copyright 2003

  2. Outline • Historical perspective on hardware, standards, markets • Resources: Web sites and books • API, library, and hardware: Map geometry to pixels and colors • Pipeline: Transform, Clip, Project, Rasterize • Geometric primitives: vertices, polygons, cubes, cylinders... • Attributes: color, material, drawing mode • Viewing: camera position, lens, object position • Control and flow • Programming conventions: glu- & gl- calls, types, -.h files Jarek Rossignac, CoC, GT, ©Copyright 2003

  3. History of the 3D graphics industry • 1960s: • Line drawings, hidden lines, parametric surfaces (B-splines…) • Automated drafting & machining for car, airplane, and ships manufacturers • 1970’s: • Mainframes, Vector tubes (HP…) • Software: Solids, (CSG), Ray Tracing, Z-buffer for hidden lines • 1980s: • Graphics workstations ($50K-$1M): Frame buffers, rasterizers , GL, Phigs • VR: CAVEs and head-mounted displays • CAD/CAM & GIS: CATIA, SDRC, PTC • Sun, HP, IBM, SGI, E&S, DEC • 1990s: • PCs ($2K): Graphics boards, OpenGL, Java3D • CAD+Videogames+Animations: AutoCAD, SolidWorks…, Alias-Wavefront • Intel, many board vendors • 2000s: • Laptops, PDAs, Cell Phones: Parallel graphic chips • Everything will be graphics, 3D, animated, interactive • Nvidia, Sony, Nokia Jarek Rossignac, CoC, GT, ©Copyright 2003

  4. Resources for OpenGL • OpenGL Primer by E. Angel • OpenGL user’s guide and programming manual • Lots of online documentation and examples http://www.gvu.gatech.edu/~jarek/courses/4451 http://www.cc.gatech.edu/classes/AY2003/cs4451b_fall/ http://www.cc.gatech.edu/classes/AY2003/cs4451b_fall/p1examples.htm Jarek Rossignac, CoC, GT, ©Copyright 2003

  5. OpenGL • Open Standard (controlled by multi-company board) • Used as common API for portable applications • Maps geometry to libraries that exploit graphics hardware • Function: • Take 3D geometry, attributes, user actions • Produce images/animations • OpenGL Pipeline: • States (colors, rendering modes, view parameters, local frame) • Geometry (vertices, connectivity) flows in and gets: • Transformed and clipped to the viewing frustum • Colored and textured • Projected and painted on the pixels of the window (frame buffer) • Hidden parts removed by hardware (z-buffer stores depth to visible surface) Jarek Rossignac, CoC, GT, ©Copyright 2003

  6. Utilities and programming conventions • OpenGL • GLUT Jarek Rossignac, CoC, GT, ©Copyright 2003

  7. GLUT components • Main() // Init window • Init() // set state vars • Display() // draw model • Reshape() // adjust w/h • Mouse() // mouse events • Keyboard() // keyboard events Jarek Rossignac, CoC, GT, ©Copyright 2003

  8. GLUT: Main int Main(int argc, char** argv) glutInit(); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (Vx_max-Vx_min, Vy_max-Vy_min); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; Jarek Rossignac, CoC, GT, ©Copyright 2003

  9. GLUT: Init void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glEnable(…); } Jarek Rossignac, CoC, GT, ©Copyright 2003

  10. GLUT: Display void display(void) { glClear (GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,1.0); glBegin(GL_LINES); glVertex2d(100.0, 100.0); glVertex2d(400.0, 100.0); … glEnd(); glFlush (); } Jarek Rossignac, CoC, GT, ©Copyright 2003

  11. GLUT: Reshape void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluOrtho2D(Vx_min, Vx_max, Vy_min, Vy_max); glMatrixMode (GL_MODELVIEW); } Jarek Rossignac, CoC, GT, ©Copyright 2003

  12. GLUT: Mouse void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { printf("left mouse click\n"); } break; default: break; } } Jarek Rossignac, CoC, GT, ©Copyright 2003

  13. GLUT: Keyboard void keyboard(unsigned char key, int x, int y) { switch (key) { case ‘r’: glutPostRedisplay(); break; case 27: /* Escape key */ exit(0); break; default: break; } } Jarek Rossignac, CoC, GT, ©Copyright 2003

  14. OpenGL: Conventions • Functions in OpenGL start with gl • Functions starting with glu are utility functions (i.e., gluLookAt()) • Functions starting with glx are for interfacing with the X Windows system • Function names indicate argument type/# • Functions ending with f take Floats • Functions ending with i take Ints, functions that end with v take an array, with b take byte, etc. • Ex: glColor3f() takes 3 floats, but glColor4fv()takes an array of 4 floats Jarek Rossignac, CoC, GT, ©Copyright 2003

  15. OpenGL: Specifying Geometry Geometry in OpenGL consists of a list of vertices in between calls to glBegin() and glEnd() • A simple example: telling GL to render a triangle glBegin(GL_POLYGON); glVertex3f(x1, y1, z1); glVertex3f(x2, y2, z2); glVertex3f(x3, y3, z3); glEnd(); • Usage: glBegin(geomtype) where geomtype is: • Points, lines, polygons, triangles, quadrilaterals, etc... Jarek Rossignac, CoC, GT, ©Copyright 2003

  16. OpenGL: More Examples • Example: GL supports quadrilaterals: glBegin(GL_QUADS); glVertex3f(-1, 1, 0); glVertex3f(-1, -1, 0); glVertex3f(1, -1, 0); glVertex3f(1, 1, 0); glEnd(); • This type of operation is called immediate-mode rendering; • each command happens immediately • Although you may not see the result if you use double buffering • Things get drawn into the back buffer • Then buffers are swapped Jarek Rossignac, CoC, GT, ©Copyright 2003

  17. OpenGL: Front/Back Rendering • Each polygon has two sides, front and back • OpenGL can render the two differently • The ordering of vertices in the list determines which is the front side: • When looking at the front side, the vertices go counterclockwise • This is basically the right-hand rule • Note that this still holds after perspective projection Jarek Rossignac, CoC, GT, ©Copyright 2003

  18. OpenGL: Drawing Triangles • You can draw multiple triangles between glBegin(GL_TRIANGLES) and glEnd(): float v1[3], v2[3], v3[3], v4[3]; ... glBegin(GL_TRIANGLES); glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3); glVertex3fv(v1); glVertex3fv(v3); glVertex3fv(v4); glEnd(); The same vertex is used (transformed, colored) many time (6 on average) Jarek Rossignac, CoC, GT, ©Copyright 2003

  19. v2 v4 v0 v5 v1 v3 OpenGL: Triangle Strips • An OpenGL triangle strip primitive reduces this redundancy by sharing vertices: glBegin(GL_TRIANGLE_STRIP); glVertex3fv(v0); glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3); glVertex3fv(v4); glVertex3fv(v5); glEnd(); • triangle 0 is v0, v1, v2 • triangle 1 is v2, v1, v3 (why not v1, v2, v3?) • triangle 2 is v2, v3, v4 • triangle 3 is v4, v3, v5 (again, not v3, v4, v5) Jarek Rossignac, CoC, GT, ©Copyright 2003

  20. v4 v3 v5 v0 v2 v6 v1 OpenGL: Triangle Fan • The GL_TRIANGLE_FAN primitive is another way to reduce vertex redundancy: Jarek Rossignac, CoC, GT, ©Copyright 2003

  21. OpenGL: Drawing Other Primitives • You can draw other primitives using: • GL_POINTS • GL_LINES • GL_LINE_STRIP • GL_LINE_LOOP • GL_QUADS • … Jarek Rossignac, CoC, GT, ©Copyright 2003

  22. OpenGL: Specifying Color • Can specify other properties such as color • To produce a single aqua-colored triangle: glColor3f(0.1, 0.5, 1.0); glVertex3fv(v0); glVertex3fv(v1); glVertex3fv(v2); • To produce a smoothly Gouraud-shaded triangle: glColor3f(1, 0, 0); glVertex3fv(v0); glColor3f(0, 1, 0); glVertex3fv(v1); glColor3f(0, 0, 1); glVertex3fv(v2); • In OpenGL, colors can also have a fourth component  (transparency) • Generally want  = 1.0 (opaque); Jarek Rossignac, CoC, GT, ©Copyright 2003

  23. OpenGL: Modeling Transforms • Some OpenGL commands generate transformation matrices: glTranslatef(Tx, Ty, Tz); glRotatef(angleDegrees, Ax, Ay, Az); glScalef(Sx, Sy, Sz); • Example of rotations around x, y, and z axes glRotatef(xangle,1,0,0); glRotatef(yangle,0,1,0); glRotatef(zangle,0,0,1); Jarek Rossignac, CoC, GT, ©Copyright 2003

  24. OpenGL: Modeling Transforms • Example: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(…); glRotatef(…); • Result: the modelview matrix is set to: I • T • R == T • R which then is used to transform all subsequent vertices Jarek Rossignac, CoC, GT, ©Copyright 2003

  25. OpenGL: Viewing Transforms • Ex: gluLookAt() computes a lookat matrix : gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ); Use it after loading the identity. Jarek Rossignac, CoC, GT, ©Copyright 2003

  26. OpenGL: Projection • The projection matrix is generally used for the perspective projection matrix • gluOrtho2D() creates a matrix for projecting 2D coordinates onto the screen without perspective, gluOrtho2D(double left, double right, double bottom, double top); Jarek Rossignac, CoC, GT, ©Copyright 2003

  27. Selecting a Polygon w/Mouse • Use gluUnProject() to find world coordinates for mouse click on near and far clipping planes (pnear and pfar). • Intersect every triangle in the scene with the line that passes through pnear and pfar. Jarek Rossignac, CoC, GT, ©Copyright 2003

  28. Example 1 (Brooks van Horn) • #include <glut.h> • #include <GL/gl.h> • #include <GL/glu.h> • #include <stdlib.h> • void mouse( int, int, int, int ); • void display( void ); • void reshape( int, int ); • void keyboard( unsigned char, int, int ); • void Idle( void ); • void InitializeVariables( void ); // forwarding functions • int xdim, ydim; // screen dimensions • struct vPoint { inline float & operator [] ( int index ) { return element[ index ]; } float element[ 3 ]; }; • const float X_STEP = 0.005; const float Y_STEP = 0.020; const float Z_STEP = 0.025; • bool flag; // flag to tell us if there is anything to draw yet • vPoint rotation; // current rotation Jarek Rossignac, CoC, GT, ©Copyright 2003

  29. Example 1 of a main int main( int argc, char *argv[] ) {InitializeVariables(); // My function that zeroes variables and such stuff. xdim = ( argc > 1 ) ? atoi( argv[ 1 ] ) : 500; ydim = ( argc > 2 ) ? atoi( argv[ 2 ] ) : 500; glutInit( &argc, argv ); /* Initialization function */ glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB ); // double buffer and GRB modes glutInitWindowSize( xdim, ydim ); // Set the screen size glutCreateWindow( "This is the title of the window."); glClearColor( 0.0, 0.0, 0.0, 0.0 ); // clear color and alpha at each pixel glShadeModel( GL_FLAT ); // set shading mode to flat (constant color for each polygon) glutDisplayFunc( display ); // tells OpenGL what to call when it needs to redraw glutReshapeFunc( reshape ); // tells OpenGL what to call when window is reshaped glutMouseFunc( mouse ); // tells OpenGL what to call when a mouse button is pressed glutKeyboardFunc( keyboard ); // tells OpenGL what to call upon keyboard events glutIdleFunc( Idle ); // Says what to call when nothings is happening glutMainLoop(); // important call to include after the above 3 return 0; } Jarek Rossignac, CoC, GT, ©Copyright 2003

  30. Example 1 of a display function void display( void ) {glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); if ( flag ) { glutSwapBuffers(); return ; } glPushMatrix(); // push matrix on stack glColor3f( 1.0, 1.0, 1.0 ); // specify a color by giving R-G-B values from 0 to 1. glTranslatef( 0.0, 0.0, -3.0 ); // move the dots so that we can see them glRotatef(rotation[0],1,0,0); glRotatef(rotation[1],0,1,0); glRotatef(rotation[2],0,0,1); glBegin( GL_POINTS ); for ( int i = 0; i < MAX_DOTS; i++ ) glVertex3f(dots[i][0],dots[i][1],dots[i][2]); glEnd(); glPopMatrix(); glutSwapBuffers();} // This says: "DRAW WHAT YOU'VE GOT!" Jarek Rossignac, CoC, GT, ©Copyright 2003

  31. Example 1 of a reshape function void reshape( int new_width, int new_height ) {xdim = new_width; ydim = new_height; glViewport(0,0,(GLsizei) new_width, (GLsizei) new_height ); // This resets the viewing port glMatrixMode( GL_PROJECTION ); // This resets the use of Matrices based upon the new view glLoadIdentity(); gluPerspective( 60.0, (GLfloat) xdim / (GLfloat) ydim, 0.1, 20.0 ); // reset the viewing projection glMatrixMode( GL_MODELVIEW ); } Jarek Rossignac, CoC, GT, ©Copyright 2003

  32. Example 1 of a mouse function void mouse( int button, int state, int x, int y ) { /* button: GLUT_LEFT_BUTTON or GLUT_MIDDLE_BUTTON or GLUT_RIGHT_BUTTON, state: (pressed GLUT_DOWN or not GLUT_UP) (x, y): position of mouse */ if ( state == GLUT_UP ) return ; // do nothing when buttons up // otherwise generate dots for (int i = 0; i<MAX_DOTS; i++) for (int j = 0; j<3; j++) dots[i][j] = (float) rand() / (float) RAND_MAX; glutPostRedisplay(); } // will invoke display again so that a new thing is put on the screen Jarek Rossignac, CoC, GT, ©Copyright 2003

  33. Example 2 (Peter Lindstrom) /* Simple geometry viewer:  Left mouse: rotate;  Middle mouse:  zoom;  Right mouse:   menu;  ESC to quit  The function InitGeometry() initializes  the geometry that will be displayed. */ #include <assert.h> #include <math.h> #include <stdlib.h> #include <GL/glut.h> #define MAX_TRIANGLES (10) struct Point {float x[3];   float n[3]; }; struct Triangle {   Point v[3];  }; Triangle triangleList[MAX_TRIANGLES]; int triangleCount = 0; void InitGeometry(); Jarek Rossignac, CoC, GT, ©Copyright 2003

  34. Example 2 Initialization /* Viewer state */ float sphi=90.0, stheta=45.0; float sdepth = 10; float zNear=1.0, zFar=100.0; float aspect = 5.0/4.0; float xcam = 0, ycam = 0; long xsize, ysize; int downX, downY; bool leftButton = false, middleButton = false; int i,j; GLfloat light0Position[] = { 0, 1, 0, 1.0}; int displayMenu, mainMenu; enum {WIREFRAME, HIDDENLINE, FLATSHADED, SMOOTHSHADED}; int displayMode = WIREFRAME; void MyIdleFunc(void) { glutPostRedisplay();} /* things to do while idle */ void RunIdleFunc(void) {   glutIdleFunc(MyIdleFunc); } void PauseIdleFunc(void) {   glutIdleFunc(NULL); } Jarek Rossignac, CoC, GT, ©Copyright 2003

  35. Example 2 Flat shading of triangles void DrawFlatShaded(void) {   int i;   glEnable(GL_POLYGON_OFFSET_FILL);   glColor3f(0.8f, 0.2f, 0.8f);   glBegin ( GL_TRIANGLES ) ;   for ( i = 0; i < triangleCount; ++i ) {     glVertex3fv( triangleList[i].v[0].x );     glVertex3fv( triangleList[i].v[1].x );     glVertex3fv( triangleList[i].v[2].x );   }   glEnd ( ) ;   glDisable(GL_POLYGON_OFFSET_FILL);} Jarek Rossignac, CoC, GT, ©Copyright 2003

  36. Example 2 Smooth shading of triangles void DrawSmoothShaded(void) {   int i;   assert( triangleCount < MAX_TRIANGLES );   glColor3f(0.8f, 0.2f, 0.8f);   glBegin ( GL_TRIANGLES ) ;   for ( i = 0; i < triangleCount; ++i ) {     glNormal3fv( triangleList[i].v[0].n );     glVertex3fv( triangleList[i].v[0].x );     glNormal3fv( triangleList[i].v[1].n );     glVertex3fv( triangleList[i].v[1].x );     glNormal3fv( triangleList[i].v[2].n );     glVertex3fv( triangleList[i].v[2].x ); }   glEnd ( ) ; } Jarek Rossignac, CoC, GT, ©Copyright 2003

  37. Example 2 Drawing edges of triangles void DrawWireframe(void) {   int i;   glColor3f(1.0, 1.0, 1.0);   for ( i = 0; i < triangleCount; ++i ) {     glBegin(GL_LINE_STRIP);     glVertex3fv( triangleList[i].v[0].x );     glVertex3fv( triangleList[i].v[1].x );     glVertex3fv( triangleList[i].v[2].x );     glVertex3fv( triangleList[i].v[0].x );     glEnd();   } } Jarek Rossignac, CoC, GT, ©Copyright 2003

  38. Example 2 Hidden lines void DrawHiddenLine(void) {   glEnable(GL_POLYGON_OFFSET_FILL);   glColor3f(0,0,0);   glBegin ( GL_TRIANGLES ) ;   for ( i = 0; i < triangleCount; ++i ) {     glVertex3fv( triangleList[i].v[0].x );     glVertex3fv( triangleList[i].v[1].x );     glVertex3fv( triangleList[i].v[2].x );   }   glEnd ( ) ;   glDisable(GL_POLYGON_OFFSET_FILL);   glColor3f(1.0,1.0,1.0);   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);   glBegin ( GL_TRIANGLES ) ;   for ( i = 0; i < triangleCount; ++i ) {     glVertex3fv( triangleList[i].v[0].x );     glVertex3fv( triangleList[i].v[1].x );     glVertex3fv( triangleList[i].v[2].x );   }   glEnd ( ) ;   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } Jarek Rossignac, CoC, GT, ©Copyright 2003

  39. Example 2 Reshape void ReshapeCallback(int width, int height) {   xsize = width;   ysize = height;   aspect = (float)xsize/(float)ysize;   glViewport(0, 0, xsize, ysize);   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   glutPostRedisplay();} Jarek Rossignac, CoC, GT, ©Copyright 2003

  40. Example 2 Menu void SetDisplayMenu(int value) {   displayMode = value;   switch(value) {     case WIREFRAME: glShadeModel(GL_FLAT); glDisable(GL_LIGHTING); break;     case HIDDENLINE: glShadeModel(GL_FLAT); glDisable(GL_LIGHTING); break;     case FLATSHADED: glShadeModel(GL_FLAT); glEnable(GL_LIGHTING); break;     case SMOOTHSHADED: glShadeModel(GL_SMOOTH); (GL_LIGHTING); break; }   glutPostRedisplay();} void SetMainMenu(int value) {switch(value) {case 99: exit(0); break;}} Jarek Rossignac, CoC, GT, ©Copyright 2003

  41. Example 2 Display Callback void DisplayCallback(void) {   glMatrixMode(GL_PROJECTION);   glLoadIdentity();   gluPerspective(64.0, aspect, zNear, zFar);   glMatrixMode(GL_MODELVIEW);   glLoadIdentity();   glTranslatef(0.0,0.0,-sdepth);   glRotatef(-stheta, 1.0, 0.0, 0.0);   glRotatef(sphi, 0.0, 0.0, 1.0);   switch (displayMode) {     case WIREFRAME: DrawWireframe();     break;     case HIDDENLINE: DrawHiddenLine();     break;     case FLATSHADED: DrawFlatShaded();     break;     case SMOOTHSHADED: DrawSmoothShaded();     break;   }   glutSwapBuffers();   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } Jarek Rossignac, CoC, GT, ©Copyright 2003

  42. Example 2 Keyboard and mouse void KeyboardCallback(unsigned char ch, int x, int y) {   switch (ch) {case 27: exit(0);break; } glutPostRedisplay(); } void MouseCallback(int button, int state, int x, int y) {   downX = x; downY = y;   leftButton = ((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN));   middleButton = ((button == GLUT_MIDDLE_BUTTON) &&  (state == GLUT_DOWN));   glutPostRedisplay();} void MotionCallback(int x, int y) {   if (leftButton){sphi+=(float)(x-downX)/4.0;stheta+=(float)(downY-y)/4.0;} // rotate   if (middleButton){sdepth += (float)(downY - y) / 10.0;  } // scale   downX = x;   downY = y;   glutPostRedisplay();} Jarek Rossignac, CoC, GT, ©Copyright 2003

  43. Example 2 InitGL void InitGL() {   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);   glutInitWindowSize(500, 500);   glutCreateWindow("cs175 Triangle Viewer");   glEnable(GL_DEPTH_TEST);   glDepthFunc(GL_LEQUAL);   glClearColor(0.0, 0.0, 0.0, 0.0);   glPolygonOffset(1.0, 1.0);   glDisable(GL_CULL_FACE);   glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);   glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   glEnable(GL_COLOR_MATERIAL);   glColorMaterial(GL_FRONT, GL_DIFFUSE);   glLightfv (GL_LIGHT0, GL_POSITION, light0Position);   glEnable(GL_LIGHT0);   glutReshapeFunc(ReshapeCallback);   glutDisplayFunc(DisplayCallback);   glutKeyboardFunc(KeyboardCallback);   glutMouseFunc(MouseCallback);   glutMotionFunc(MotionCallback); } Jarek Rossignac, CoC, GT, ©Copyright 2003

  44. Example 2 Init Menu void InitMenu() {   displayMenu = glutCreateMenu(SetDisplayMenu);   glutAddMenuEntry("Wireframe", WIREFRAME);   glutAddMenuEntry("Hidden Line", HIDDENLINE);   glutAddMenuEntry("Flat Shaded", FLATSHADED);   glutAddMenuEntry("Smooth Shaded", SMOOTHSHADED);   mainMenu = glutCreateMenu(SetMainMenu);   glutAddSubMenu("Display", displayMenu);   glutAddMenuEntry("Exit", 99);   glutAttachMenu(GLUT_RIGHT_BUTTON); } Jarek Rossignac, CoC, GT, ©Copyright 2003

  45. Example 2 Init Geometry void InitGeometry() {   triangleCount = 2;   /* coordinates */   triangleList[0].v[0].x[0] = 0;   triangleList[0].v[0].x[1] = 0;   triangleList[0].v[0].x[2] = 0;   triangleList[0].v[1].x[0] = 0;   triangleList[0].v[1].x[1] = 1;   triangleList[0].v[1].x[2] = 0;   triangleList[0].v[2].x[0] = 1;   triangleList[0].v[2].x[1] = 0;   triangleList[0].v[2].x[2] = 0;   triangleList[1].v[0].x[0] = 0;   triangleList[1].v[0].x[1] = 0;   triangleList[1].v[0].x[2] = 0;   triangleList[1].v[1].x[0] = 0;   triangleList[1].v[1].x[1] = 0;   triangleList[1].v[1].x[2] = 1;   triangleList[1].v[2].x[0] = 0;   triangleList[1].v[2].x[1] = 1;   triangleList[1].v[2].x[2] = 0;   /* normals */   triangleList[0].v[0].n[0] = 0.7;   triangleList[0].v[0].n[1] = 0;   triangleList[0].v[0].n[2] = 0.7;   triangleList[0].v[1].n[0] = 0.7;   triangleList[0].v[1].n[1] = 0;   triangleList[0].v[1].n[2] = 0.7;   triangleList[0].v[2].n[0] = 0;   triangleList[0].v[2].n[1] = 0;   triangleList[0].v[2].n[2] = 1;   triangleList[1].v[0].n[0] = 0.7;   triangleList[1].v[0].n[1] = 0;   triangleList[1].v[0].n[2] = 0.7;   triangleList[1].v[1].n[0] = 1;   triangleList[1].v[1].n[1] = 0;   triangleList[1].v[1].n[2] = 0;   triangleList[1].v[2].n[0] = 0.7;    triangleList[1].v[2].n[1] = 0;   triangleList[1].v[2].n[2] = 0.7; } Jarek Rossignac, CoC, GT, ©Copyright 2003

  46. Example 2 Main void main(int argc, char **argv) {   glutInit(&argc, argv);   InitGL();   InitMenu();   InitGeometry();   glutMainLoop(); } Jarek Rossignac, CoC, GT, ©Copyright 2003

  47. lPaying with examples of OpenGL • Go to http://www.gvu.gatech.edu/~jarek/courses/4451 • Download 6 files: 3d.c, light.c, unproject.c, spinner.htm, viewer.htm, cubes.htm, and texture.htm • Edit as needed, compile, and run • Change some of their parameters and check that you understand what the code does • Use http://www.cc.gatech.edu/classes/AY2003/cs4451b_fall/p1examples.htm Jarek Rossignac, CoC, GT, ©Copyright 2003

  48. Practice questions • When did commercial graphics workstation become available? • How are the visible surfaces selected by the graphics hardware? • What is OpenGL? • OpenGL code fragment that draws a line in 2D from point (a,b) to point (b,c). • When would you call gluOrtho2D and what are the parameters. Jarek Rossignac, CoC, GT, ©Copyright 2003

More Related