Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεOtos Makris Τροποποιήθηκε πριν 10 χρόνια
1
The ModelView Matrix •Το modelview matrix στην ουσία είναι ένα σύστημα αξόνων που μας βοηθάει να τοποθετούμε και περιστρέφουμε αντικείμενα. •Είναι ένας πίνακας 4 X 4 ο οποίος ή μετασχηματίζει κορυφές (vertices) ή μετασχηματίζεται ο ίδιος σε συνδυασμό με άλλους πίνακες. •Για να μετασχηματίσω μια κορυφή απλα πολλαπλασιάζω το modelview matrix με το σημείο και προκύπτει ένα νέο σημείο στον χώρο που είναι το τελικο αποτέλεσμα.
2
Τhe Modelview Matrix •Είναι το default matrix που μας μεταφέρει η OpenGL αλλα μπορούμε να μεταβούμε σε αυτο και με την βοήθεια της συνάρτησης. glMatrixMode(GL_MODELVIEW) •Συνηθώς οταν αρχίζουμε το render code θέλουμε να μεταφερθούμε στο σημείο (0,0,0) του ModelView Matrix. Αυτο το κάνουμε με την χρήση της συνάρτησης glLoadIdentity()
3
Translation •Οταν μετακινώ ένα αντικείμενο απο ένα σημειο του χώρου σε ένα αλλο τοτε κάνω translation. •Translation στην OpenGL μπορώ να κάνω με την βοήθεια της συνάρτησης glTranslate(d,f)(TYPE x,TYPE y,TYPE z). •Ως ορίσματα η συνάρτηση δέχεται το ποσοστό μετακίνησης στους άξονες. •Για παράδειγμα αμα είμαι στο σημείο 3,4,-10 και θέλω να πάω στο σημείο 7,-4,-5 θα περάσω ως όρισμα στην συνάρτηση glTranslatef(4,-8,5).
4
Translation •Παντα την πράξη του translation την εκτελούμε πριν ζωγραφίσουμε τα αντικειμενά μας. •πχ. glLoadIdentity(); glTranslatef(,4,-8,5) renderCube();
5
Rotation •Rotation κάνουμε οταν θέλουμε να περιστρέψουμε ένα αντικείμενο σε κάποιο άξονα. •Oταν περιστρέφω ένα αντικείμενο γύρω απο έναν άξονα τοτε ο άξονας περιστροφής παραμένει σταθερός. •Οταν περιστρέφω κατι τοτε το σύστημα αξόνων αλλάζει. •Στην ΟpenGL μπορώ να περιστρέψω ένα αντικείμενο με την συνάρτηση glRotate(d,f)(TYPE angle,TYPE x,TYPE y,TYPE z).
6
Rotation •H συνάρτηση glRotate δέχεται ως ορίσματα την γωνία περιστροφής και το σημείο που γινέται (χ,y,z). •Για παράδειγμα αν θέλω να περιστραφώ 90 μοίρες γύρω απο τον άξονα y τότε δίνω την εντολή glRotatef(90.0f,0.0,1.0,0.0). •Η OpenGL στις περιστροφές πηγαίνει με counter-clockwise λογική δηλαδή αμα ήθελα να περιστραφώ κατα 90 μοίρες clockwise θα έδινα -90.0 ως όρισμα.
7
Rotation •Αν θέλω να περιστραφώ γύρω απο έναν άξονα περα των βασικών x,y,z αυτο που πρέπει να κάνω είναι να περάσω ως όρισμα στην συνάρτηση το σημείο που θέλω (χ,y,z). •Μετα ο άξονας που σχηματίζεται απο την αρχή των αξόνων μέχρι το σημείο που έδωσα ως όρισμα είναι ο καινούργιος άξονας περιστροφής. •Την glRotate απο και την glTranslate τις εκτελώ πριν το render code μου.
8
Scale •To scaling πρακτικά είναι η αλλαγή μεγέθους ενός αντικειμένου ή σύστημα αξόνων. •Δηλαδή όταν εκτελώ πράξεις scaling τοτε στην ουσία πολλαπλασιάζω τις συντεταγμένες ενός σημείο με ενα scale factor και έχω το τελικό αποτέλεσμα. •Scaling στην OpenGL πραγματοποιώ με την συνάρτηση glScale(d,f)(TYPE x,TYPE y,TYPE z).
9
Scale •H συνάρτηση glScale δέχεται ως όρισμα τις τιμές του scale factor για τους άξονες. •Δηλαδή αν θέλω να ζωγραφίσω έναν κύβο διπλάσιο στον άξονα χ αλλά στους άλλους άξονες να μην αλλάξει το μέγεθος του τοτε θα δώσω glScalef(2.0,1.0,1.0). •Aλλα άμα θέλω να κάνω shrink το αντικείμενο τοτε θα δώσω τιμές απο 0 μέχρι 1.
10
Scale •Aμα δώσω αρνητικές τιμές στον scale factor τοτε το αντικείμενο μας θα κάνει flip. •Aυτο είναι ένα στοιχείο που βοηθάει πολύ οταν θέλω να έχω reflections.
11
Matrix Stacks •Μέχρι στιγμής έχουμε δει το modelview matrix,που στην ουσία είναι η κορυφή μιας στοίβας απο πίνακες(matrices). •Υπάρχουν matrix stacks για όλα τα έιδη των πινάκων.Δηλαδή υπάρχει η projection matrix stack,texture matrix stack,color matrix stack κτλ. •Αυτο γίνεται γιατι μας βοηθάει να κάνουμε διάφορες μεταμορφώσεις και μετα να πιστρέφουμε στην τελευταία αποθηκευμένη χωρίς να κάνω τις πράξεις για να επανέλθω.
12
Matrix Stacks Για παράδειγμα αμα είμαι στο σημείο 0,0,0 και κάνω Push Matrix και αμέσως μετα κάνω 2 πράξεις translate (10,0,0) και (10,5,3) τοτε θα βρίσκομαι στο σημείο (20,5,3). •Αμα κάνω pop απο την στοίβα τοτε θα ξαναμεταρφεθώ στο σημείο (0,0,0) κτλ.
13
Matrix Stacks
14
•Για να μεταφέρουμε ένα matrix στην στοίβα χρησιμοποιούμε την συνάρτηση glPushMatrix() ενώ για να κάνουμε Pop την συνάρτηση glPopMatrix(). •Aυτες η συναρτήσεις δεν δέχονται ορίσματα και τις εκτελούμε πριν απο μια πράξη translation,rotation,scale(glPushMatrix) και αμα θέλω να κάνω pop μετα απο ένα render code block.
15
Texture Mapping •Mέχρι τώρα χρησιμοποιούσαμε χρώματα στα αντικείμενα μας. •Τα χρώματα ομως δεν δείχνουν και τόσο ωραία και είναι δύσκολο να έχουν έναν υψηλό βαθμό αληθοφάνειας. •Χρησιμοποιώντας όμως την τεχνική του texture mapping μπορούμε να έχουμε μια δραματική αύξηση του ρεαλισμού στις σκηνές μας.
16
Texture Mapping •Texture mapping ονομάζουμε την τεχνική προσαρμογής μια εικόνας πάνω σε μια επιφάνεια. •Ενά texture map είναι ένα ορθογώνιο που περιέχει χρωματικές πληροφορίες και κάθε χρωματικό στοιχείο ονομάζεται texel. •Μπορεί ένα texture map να είναι ένα ορθογώνιο ομως προσαρμόζεται και σε αλλες επιφάνειες με την χρήση texture coordinates.
17
Παράδειγμα Texture Map
18
Texture Mapping •Ένα τυπικό texture map είναι μια δισδιάστατη εικόνα με ύψος και πλάτος. •Αλλα μερικά effects μπορούν να χρησιμοποιούν ειτε 1-dimension map ειτε τρισδιάστατα maps με πλάτος,ύψος και βάθος.
19
Texture Mapping in OpenGL •Για να μπορώ να προσαρμόσω ένα tex map πάνω σε μια επιφάνεια με την χρήση της OpenGL θα πρέπει πρώτα να εκτελέσω καποια βήματα •Το πρώτο βήμα που πρέπει να κάνω είναι να ορίσω το texture container.
20
Binding a Texture Map •Για να μπορέσω να ορίσω ένα tex container θα πρέπει να χρησιμοποιήσω την συνάρτηση glGenTextures(GLsizei n,GLuint *tex); •H συνάρτηση glGenTextures δέχεται ως όρισμα των αριθμό των unique “names” που θα δημιουργήσει για τα texture containers και το δευτέρο ονόμα είναι ποια είναι αυτα τα “names”.
21
Binding a Texture Map •Για παράδειγμα GLuint mytexture; glGenTextures(1,&mytexture); GLuint many_textures[3]; glGenTextures(3,many_textures);
22
Binding a Texture Map •Και αφού έχω δημιουργήσει ένα texture container με unique name πρέπει να καλέσω την συνάρτηση glBindTexture(GLenum target,GLuint texture) για να το ορίσω. •Για παράδειγμα glBindTexture(GL_TEXTURE_2D,mytexture); •H παράμετρος target μπορεί να πάρει τις τιμές GL_TEXTURE_(1D,2D,3D) GL_TEXTURE_CUBE_MAP TEXTURE_(1D,2D)_ARRAY.
23
Binding a Texture Map •Oι τιμές που περνάμε στο target βοηθάνε την OpenGL να προσδιορίσει την δίασταση του texture. •Μπορούμε να αλλάξουμε τον τύπο ενος texture θέτοντας αλλο target ως όρισμα.
24
Texture Mapping •Επόμενο βήμα είναι να αντιστοιχίσουμε τα στοιχεία της εικόνας με το texture container φορτώνοντας από ένα αρχείο εικόνας. •Αυτο μπορούμε να το κάνουμε με την βοήθεια μιας οικογένειας συναρτήσεων που μας παρέχει η OpenGL. glTexImage(1,2,3)D ανάλογα τις διαστάσεις ενός texture.
25
Tex Image •void glTexImage2D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * data); •Η συνάρτηση glTexImage2D μεταφέρει τα στοιχεία μιας εικόνας σε ένα 2D texture container.
26
Tex Image •Tα ορίσματα της συνάρτησης είναι τα εξής: target:Το ίδιο με την συνάρτηση bind(GL_TEXTURE_2D κτλ.). •level:Χρησιμοποιήτε για την παραγωγή mipmaps με διάφορα στάδια λεπτομέρειας.Αμα περάσουμε τον αριθμό 0 τοτε δεν παράγουμε mipmaps. •InternalFormat:Καθορίζει τον αριθμό και το τύπο απο τα στοιχεία του texture.Δηλαδη απο ποσα χρώματα αποτελουνται τα δεδομένα του texture.Πχ. Μια παράμετρος είναι η GL_RGBA8 που είναι και η ποιο συνηθησμένη που λέει στην ουσία 4 χρώματα απο 8 bit το καθένα. •Οι παράμετροι width & height και border(0 ή 1) είναι oι διαστάσεις της εικόνας. •Και οι παράμετροι format & type καθορίζoυν το πως θα είναι τα pixels στην εικόνα που θα περάσουμε ως όρισμα στην τελευταία παράμετρο data.
27
Παράδειγμα •glTexImage2D (GL_TEXTURE_2D,0,GL_RGBA8,128,128,0,GL_RGBA,GL_UN SIGNED_BYTE,imagedata). •Aυτο θα μας παράξει ένα texture χωρίς mipmaps,με 8 bit για το κάθε κανάλι,128 width,128 height,0 border με χρωματικά δεδομένα RGBA που θα αποθηκευτούν ως ένας πίνακας unsigned byte.
28
Tex Image •H συναρτήσεις glTexImage1D και glTexImage3D δουλεύουν με τον ίδιο τρόπο. •Απλός στην 1D δεν έχουμε ύψος και στην 3D έχουμε και βάθος.
29
Texture Filtering •Oταν προσαρμόζω μια εικόνα πάνω σε ένα πολύγωνο τοτε το ποιο πιθανό είναι κάθε texel του texture να αντιστοιχίζεται με ένα pixel. •Εαν όμως φέρω το αντικείμενο μου κοντά στην οθόνη τοτε ένα pixel θα είναι ένα μερος ενος texel ή αντίθετα αμα πάω το αντικείμενο μου ποιο μακριά τότε ένα pixel θα περιέχει παραπάνω απο ένα texel. •Aυτα τα φαινόμενα λέγονται magnifιcation & minifιcation αντιστοίχα.
30
Texture Filtering •H ΟpenGL σε αυτες τις περιπτώσεις πρέπει να υπολογίσει το χρώμα του pixel. •Το πως θα γίνει αυτο απο την OpenGL το καθορίζουμε με χρησιμοποιώντας Texture Filtering. •Αυτο μπορούμε να το κάνουμε με τις συναρτήσεις. glTexParameteri(i,f)(GLenum target,GLenum pname,TYPE param) glTexParameteri(i,f)v(GLenum target,GLenum pname,TYPE param)
31
Texture Filtering •H παράμετρος target είναι η ιδία με τις υπόλοιπες GL_TEXTURE_2D. •Η παράμετρος pname παίρνει 2 τιμές GL_TEXTURE_MAG_FILTER ή GL_TEXTURE_MIN_FILTER ανάλογα την περίπτωση. •Eφόσον έχουμε ορίσει το target και pname η παράμετρος param παίρνει και αυτη κυριως 2 τιμές(εαν δεν έχω mipmaps).
32
Nearest Filtering •Εαν θέσω το mag_filter να είναι GL_NEAREST τοτε λέω στην OpenGL να χρησιμοποιεί το texel που είναι ποιο κοντά στο κέντρο του pixel. •Aυτη η μέθοδος είναι γνωστή επίσης ως point sample.
33
Nearest Filtering •Είναι η ποιο φθηνή μέθοδος filtering απο άποψη πολυπλοκοτητας. •Αλλα μπορεί να παράγει φαινόμενα τετραγονοποιήσης ενός texture.
34
Nearest Filtering
35
Linear Filtering •Οταν λεω στην OpenGL να χρησιμοποιήσει GL_LINEAR ως mag_filter τοτε λέω να πάρει κατα καποιον τρόπο το μέσο όρο των χρωμάτων απο τα 4 texel που είναι ποιο κοντά στο κέντρο του pixel. •Αυτη η τεχνική λέγεται και bilinear filtering.
36
Linear Filtering •Mε αυτη την τεχνική καταπολεμάμε σε μεγάλο βαθμό το φαινόμενο τον blocky textures.
37
Linear Filtering
38
Texture Filtering •Οσο αναφόρα τα mig filters οι επιλογές είναι οι ίδιες μονο που έχει και τις ίδιες επιλογές για τα mipmaps. •Πχ. GL_LINEAR_MIPMAP_LINEAR Εδω διαλέγει τα 2 mipmaps ποιο κοντά στην ανάλυση του πολυγώνου και μετα μέσω γραμμικού interpolation βγαζει το τελικό χρώμα. •Αυτη η τεχνική είναι γνωστή και ως trilinear filtering.
39
Texture Coordinates •Tα textures είναι ορθογώνια που πρέπει με κάποιο τρόπο να μπορούν να τοποθετηθούν πάνω σε οποιοδήποτε πολύγωνο. •Τα texture coordinates δείχνουν ποιο κομμάτι του texture θα “πατήσει” πάνω σε ένα πολύγωνο.
40
Texture Coordinates •Κάθε γώνια του texture έχει 2D συντεταγμένες (0.0,0.0) για την κάτω αριστερα γωνία και (1.0,1.0) για την πάνω δεξιά. •Οι συνταταγμένες ενος texture καθορίζονται ανα vertex οταν κάνουμε render ένα primitive.
41
Texture Coordinates
42
•Οταν αναφερόμαστε σε συντεταγμένες ενός πολυγώνου τοτε τις αναφέρουμε ως x,y,z,w •Στα textures είναι s(u),t(v),r,q. •Τα textures μπορούν να προσαρμοστούν κατάλληλα πάνω σε ένα πολύγωνο ετσι ώστε να φαίνεται μονο το texture ως τελικό αποτέλεσμα.
43
Texture Coordinates •Για παράδειγμα έχουμε ένα τεράγωνο που αποτελείται απο 2 τρίγωνα •Αμα τοποθετήσω το texture σωστά πάνω σε κάθε τρίγωνο θα φαίνεται ομοιόμορφο και θα καλύπτει όλο το πολύγωνο. •Εαν όμως δώσω τις ίδιες συντεταγμένες για το texture στις κοίνες γωνίες. •Εαν έκανα το αντιθέτο το αποτέλεσμα δεν θα ήταν ίδιο λόγο της διαγωνίου.
44
Texture Coordinates
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.