OpenGL Εισαγωγή στην OpenGL Βασικά Γεωμετρικά Σχήματα Παράλληλη (ορθογραφική) προβολή Κατερίνα Παπαδοπούλου / pakate@unipi.gr Μάθημα: Γραφικά Υπολογιστών και Εικονική Πραγματικότητα
OpenGL Εισαγωγή Είναι το πρότυπο της βιομηχανίας γραφικών για real-time 3d rendering Χρησιμοποιείται για την δημιουργία 3d/2d διαδραστικών εφαρμογών Είναι διεπαφή προγραμματισμού εφαρμογών (API) για γραφικά υπολογιστών. Αποτελεί διεπαφή μεταξύ μιας γλώσσας προγραμματισμού και του υλικού του υπολογιστή -> Δεν είναι γλώσσα προγραμματισμού Είναι ανεξάρτητη από το υλικό και το λειτουργικό σύστημα.
OpenGL Εισαγωγή Χρησιμοποιείται από πληθώρα γλωσσών προγραμματισμού, π.χ. C++, Java Παρέχει μια βιβλιοθήκη συναρτήσεων (περίπου 700 ρουτίνες) για το χειρισμό βασικών λειτουργιών γραφικών. Υπάρχουν βοηθητικές βιβλιοθήκες για το χειρισμό ειδικών λειτουργιών που σχετίζονται με την διαχείριση παραθύρων, της εισόδου δεδομένων από την πλευρά του χρήστη, κ.α.
ΒΟΗΘΗΤΙΚΗ ΒΙΒΛΙΟΘΗΚΗ OpenGL Utility (GLU) Αποτελεί μέρος της υλοποίησης της OpenGL Παρέχει ρουτίνες σχετικές με: Πίνακες μοντέλου, θέασης και προβολής Περιγραφής σύνθετων αντικειμένων Απόδοση σύνθετων επιφανειών Και άλλες υποστηρικτικές ρουτίνες Οι συναρτήσεις ξεκινούν με το πρόθεμα glu
ΕΡΓΑΛΕΙΟΘΗΚΗ OpenGL Utility Toolkit (GLUT) Παρέχει ρουτίνες: Για διεπαφή με οποιοδήποτε σύστημα παραθύρων οθόνης Για δημιουργία κάποιων τρισδιάστατων αντικειμένων Οι συναρτήσεις ξεκινούν με το πρόθεμα glut
OpenGL Μηχανή Καταστάσεων Λειτουργεί ως μηχανή καταστάσεων (state machine) Μια κατάσταση ορίζεται από τις τιμές ενός συνόλου μεταβλητών κατάστασης (state variables). Μια μεταβλητή κατάστασης μπορεί να πάρει διάφορες τιμές ή να είναι ενεργοποιημένη ή όχι. Η μεταβλητή κατάστασης διατηρεί την τιμή της μέχρι να γίνει αλλαγή αυτής της τιμής κατά τη διάρκεια εκτέλεσης του προγράμματος. Παραδείγματα μεταβλητών κατάστασης: χρώμα σχεδίασης, κατάσταση buffers(ενεργοποιημένοι/απενεργοποιημενοι),
OpenGL Τύποι Δεδομένων Επίθημα Τύπος Δεδομένων Τύπος OpenGL Αντιστοιχία στη γλώσσα C b GLbyte 8-bit integer Signed char s GLshort 16-bit integer short i GLint, Glsizei 32-bit integer int or long f GLfloat 32-bit floating point float d GLdouble 64-bit floating point double ub Glubyte, GLboolean 8-bit unsigned integer unsigned char us GLushort 16-bit unsigned integer unsigned short ui Gluint, Glenum, Glbitfield 32-bit unsigned integer unsigned int or unsigned long Πίνακας 1. Τύποι δεδομένων της OpenGL Έχει τους δικούς της τύπους ώστε να είναι ανεξάρτητη από τη γλώσσα
OpenGL Συμβολικές σταθερές Οι συμβολικές σταθερές της OpenGL έχουν ως πρόθεμα το GL_ Π.χ. GL_POLYGON, GL_COLOR_BUFFER_BIT, GL_SMOOTH Οι συμβολικές σταθερές της GLU έχουν ως πρόθεμα το GLU_ Π.χ. GLU_TRUE, GLU_INVALID_ENUM, GLU_NURBS_BEGIN Οι συμβολικές σταθερές της GLUT έχουν ως πρόθεμα το GLUT_ Π.χ. GLUT_LEFT_BUTTON, GLUT_KEY_RIGHT, GLUT_DOUBLE, GLUT_RGBA Όλα τα γράμματα ΚΕΦΑΛΑΙΑ Χρησιμοποιείται η κάτω παύλα ( _ )για διαχωρισμό των λέξεων
OpenGL Σύνταξη Συναρτήσεων Οι συναρτήσεις της OpenGL μπορεί να έχουν διάφορες παραλλαγές ακολουθώντας όλο ή μέρος του μοντέλου: gl +Όνομα εντολής (πρώτο γράμμα κεφαλαίο) +αριθμός διαστάσεων χώρου {2,3} ή χρωματικών τιμών {3,4} +επίθημα τύπου δεδομένων {b,s,i,,ui} (βλ. Πίνακα 1) +αν πρόκειται για vector list προσθέτουμε το γράμμα v και ως όρισμα δίνουμε το όνομα της μεταβλητής Vector glvertex3i(100,10,10); Όνομα εντολής Αριθμός διαστάσεων: 3 -> 3 ορίσματα για (x,y,z) Τύπος δεδομένων : i ->integer GLfloat vcoords[ ]={100.0,10.0,10.0}; glvertex3fv(vcoords); Όνομα εντολής Αριθμός διαστάσεων: 3 -> 3 ορίσματα για (x,y,z) Τύπος δεδομένων : f ->integer οι τιμές βρίσκονται σε vector: v
Δομή Προγράμματος OpenGL_Lab1 Δήλωση κεφαλίδων #include <gl/glut.h> Συνάρτηση που καλείται κάθε φορά που χρειάζεται να επανασχεδιαστεί κάτι στην οθόνη void display(){ } Συνάρτηση που καλείται κάθε φορά αλλάζει μέγεθος το παράθυρο void reshape(int width, int height){ } Όπου width το πλάτος και height το ύψος του παραθύρου εφαρμογής Συνάρτηση main του προγράμματος void main(int argc, char** argv){ }
ΣΥΝΑΡΤΗΣΗ main glutinit void glutinit(int *argcp, char **argv); Χρησιμοποιείται για να αρχικοποιήσει τη βιβλιοθήκη GLUT. Επίσης μπορεί να επεξεργαστεί ορίσματα γραμμής εντολών
ΣΥΝΑΡΤΗΣΗ main glutinitwindowposition, glutinitwindowsize Ορίζει το αρχικό μέγεθος και θέση του παραθύρου παρουσίασης της εφαρμογής void glutinitwindowsize(int width, int height); void glutinitwindowposition(int x, int y); width: το πλάτος σε pixels. height: το ύψος σε pixels. x: η συντεταγμένη X της άνω αριστερής γωνίας του παραθύρου y: η συντεταγμένη Υ της άνω αριστερής γωνίας του παραθύρου
ΣΥΝΑΡΤΗΣΗ main glutinitdisplaymode Ορίζει παραμέτρους εμφάνισης του παραθύρου που θα δημιουργηθεί. Παίρνει ως ορίσματα σταθερές της OpenGL που σχετίζονται με τις μνήμες προσωρινής αποθήκευσης(buffers) και την χρωματική κατάσταση (Περισσότερα του ενός ορίσματα χωρίζονται με ). void glutinitdisplaymode(unsigned int mode); Κάποιες από τις σταθερές που χρησιμοποιούνται συχνά για το mode: GLUT_RGBA (default), GLUT_INDEXχρωματική κατάσταση GLUT_SINGLE (default), GLUT_DOUBLE μονός ή διπλός buffer (για εφαρμογές κινούμενων γραφικών ) GLUT_DEPTH buffer βάθους
ΣΥΝΑΡΤΗΣΗ main glutcreatewindow Δημιουργεί το παράθυρο παρουσίασης στην οθόνη int glutcreatewindow(char *name); name: το όνομα του παραθύρου
ΣΥΝΑΡΤΗΣΗ main glutmainloop(); Εισέρχεται στο βρόχο επεξεργασίας γεγονότων της GLUT. Πρέπει να καλείται ακριβώς μια φορά σε κάθε πρόγραμμα που χρησιμοποιεί την GLUT στο τέλος της συνάρτησης main() Από τη στιγμή που καλείται δεν σταματάει να εκτελείται έως ότου το πρόγραμμα τερματιστεί.
CALLBACK FUNCTIONS Συναρτήσεις που καλούνται κάθε φορά που συμβαίνει κάποιο γεγονός(event) κατά την εκτέλεση ενός προγράμματος. Τέτοια events μπορεί να είναι: window event, mouse event, keyboard event glutdisplayfunc (όνομα συνάρτησης) glutreshapefunc (όνομα συνάρτησης) glutkeyboardfunc (όνομα συνάρτησης) glutspecialfunc (όνομα συνάρτησης) glutmousefunc (όνομα συνάρτησης) glutidlefunc (όνομα συνάρτησης)
ΣΥΝΑΡΤΗΣΗ main glutreshapefunc, glutdisplayfunc void glutreshapefunc(void (*func)(int width, int height)); Ορίζει τη συνάρτηση που θα καλείται κάθε φορά που γίνεται μεταβολή του μεγέθους του παραθύρου. Επίσης καλείται την πρώτη φορά που γίνεται εμφάνιση του παραθύρου μετά τη δημιουργία του με την glutcreatewindow(..) void glutdisplayfunc(void (*func)(void)); Ορίζει τη συνάρτηση που καλείται κάθε φορά που χρειάζεται να επανασχεδίαση του περιεχομένου του τρέχοντος παραθύρου. Κλήση για επανασχεδίαση μπορεί να πραγματοποιηθεί είτε με την εντολή glutpostredisplay() ή όταν δώσει εντολή το σύστημα παραθύρων του λειτουργικού.
Viewport Window Viewport size Window size glviewport(50,50,width-100,height-100);... glortho(0,200,0,100, -200, 200); To viewport ξεκινάει από το σημείο (50,50) - κάτω αριστερή γωνία και έχει πλάτος και ύψος 100 pixels μικρότερα από τα αντίστοιχα του παραθύρου Viewport size = Window size glviewport(0,0,width,height);... glortho(0,200,0,100, -200, 200); To viewport ξεκινάει από το σημείο (0,0), που ταυτίζεται με την κάτω αριστερή γωνία του παραθύρου και έχει πλάτος και ύψος ίσα με τα αντίστοιχα του παραθύρου
Παράλληλη (Ορθογραφική) Προβολή Στην παράλληλη προβολή ο όγκος θέασης (viewing volume) είναι ένα ορθογώνιο παραλληλεπίπεδο, όπου κάθε πλευρά του ορίζει ένα επίπεδο αποκοπής (clipping plane). Η απόσταση των αντικειμένων από την κάμερα δεν επηρεάζει το πόσο μεγάλα φαίνονται.
ΣΥΝΑΡΤΗΣΗ reshape glortho void glortho(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval); Καθορίζει τον μετασχηματισμό προβολής που θα χρησιμοποιηθεί - πολλαπλασιασμός του τρέχοντος πίνακα με τον ορθογραφικό πίνακα left, right: Συντεταγμένες για το δεξί και το αριστερό κάθετο clipping plane bottom, top: Συντεταγμένες για το κάτω και το άνω οριζόντιο clipping plane nearval, farval: η απόσταση του κοντινού και μακρινού επιπέδου αποκοπής από το σημείο θέασης. Αν το επίπεδο είναι πίσω από τον θεατή, οι τιμές είναι αρνητικές
ΣΥΝΑΡΤΗΣΗ reshape glmatrixmode, glortho void glmatrixmode(glenum mode); Ορίζει την κατάσταση και κατ επέκταση το ποιος θα είναι ο τρέχον πίνακας, δηλαδή ο πίνακας στον οποίο θα γίνουν τυχόν τροποποιήσεις. Πιθανές καταστάσεις και αντίστοιχές τιμές: Κατάσταση modelview: GL_MODELVIEW, Κατάσταση προβολής: GL_PROJECTION, Κατάσταση υφής: GL_TEXTURE και Κατάσταση χρώματος: GL_COLOR void glloadidentity(void); Θέτει ως τρέχοντα πίνακα τον 4 4 μοναδιαίο πίνακα (identity matrix)
Θεμελιακά Στοιχεία (Primitives) Geometric Primitives: Θεμελιακά στοιχεία που περιγράφουν τη γεωμετρία αντικειμένων Σημεία, γραμμές, τρίγωνα, quads, πολύγωνα Ορίζουμε τις συντεταγμένες των κορυφών/σημείων μέσα σε ένα μπλοκ κώδικα που περικλείεται από τις εντολές: glbegin(τυπος primitive); glvertex*( );.. glend(); glvertex*( );
Θεμελιακά Στοιχεία (Primitives) Τύποι Primitives που μπορεί να δεχτεί glbegin( ): GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_TRIANGLES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_QUADS GL_QUAD_STRIP GL_POLYGON http://www3.ntu.edu.sg/home/ehchua/programming/opengl/gl2_graphics3 D.html
Σύστημα συντεταγμένων Το σύστημα συντεταγμένων στην OpenGL είναι δεξιόστροφο positive x rotation positive y rotation positive z rotation
Βιβλιογραφία Γραφικά Υπολογιστών με OpenGL, Hearn Baker, Εκδόσεις Τζιόλα, 3 η έκδοση, Αθήνα, 2004 OpenGL Programming Guide (RedBook), Dave Shreiner, 7 th edition, 2010 OpenGL SuperBible, Richard S. Wright, Jr., Nicholas Haemel, Graham Sellers, Benjamin Lipchak, 5 th edition, 2011 GLUT Programming Interface, Mark J. Kilgard, Silicon Graphics, Inc., 1996