You are on page 1of 25

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); GLfloat vcoords[ ]={100.0,10.0,10.0};
Όνομα εντολής glVertex3fv(vcoords);
Αριθμός διαστάσεων: 3 -> 3 ορίσματα Όνομα εντολής
για (x,y,z) Αριθμός διαστάσεων: 3 -> 3 ορίσματα
Τύπος δεδομένων : i ->integer για (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*(…);
…..
glVertex*(…);
glEnd();
Θεμελιακά Στοιχεία (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, 7th edition, 2010
OpenGL SuperBible, Richard S. Wright, Jr., Nicholas
Haemel, Graham Sellers, Benjamin Lipchak, 5th edition,
2011
• GLUT Programming Interface, Mark J. Kilgard, Silicon
Graphics, Inc., 1996

You might also like