Βιβλιοθήκη γραφικών OpenGL. Γνωριμία με το OpenGL

Ηλεκτρονική 30.05.2019
Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

Chercher

Ηλεκτρονική

Το OpenGL (ανοιχτή βιβλιοθήκη γραφικών) είναι ένα από τα πιο δημοφιλή γραφικά πρότυπαγια εργασία με γραφικά. Τα προγράμματα που γράφτηκαν με τη βοήθειά του μπορούν να μεταφερθούν σχεδόν σε οποιαδήποτε πλατφόρμα, αποκτώντας το ίδιο αποτέλεσμα. Το OpenGL σας επιτρέπει να μην γράφετε προγράμματα για το υλικό, αλλά να επωφεληθείτε από τις υπάρχουσες εξελίξεις. Το OpenGL αναπτύσσεται από τη Silicon Graphics, σε συνεργασία με άλλους τεχνολογικούς κολοσσούς.

Από προγραμματιστική άποψη, το OpenGL είναι διεπαφή λογισμικούΓια ράστερ γραφικά, όπως επιταχυντές γραφικών. Περιλαμβάνει περίπου 150 διάφορες ομάδες, με το οποίο ο προγραμματιστής μπορεί να ορίσει διάφορα αντικείμενα και να αποδώσει.

Υλικό Μελέτης

Φροντιστήρια

Διαδικτυακά μαθήματα

  • Lynda - "OpenGL Course";
  • Πανεπιστήμιο του Τόκιο - «Διαδραστικά Γραφικά Υπολογιστών»
  • Πανεπιστήμιο του Σαν Ντιέγκο - "Βασικές αρχές γραφικών υπολογιστών."

Βιβλία

Στα ρωσικά

1. D. Shreiner - OpenGL Redbook - λήψη;

Βιβλίο - επίσημος οδηγόςγια εκμάθηση OpenGL. Οι τελευταίες εκδόσεις είναι σχεδόν εντελώς διαφορετικές από τις αρχικές εκδόσεις ο συγγραφέας τις ενημερώνει σύμφωνα με τις αλλαγές στις εκδόσεις. Σύμφωνα με εκατοντάδες ειδικούς που εργάζονται με το Open GL, αυτό το βιβλίο είναι το πρώτο πράγμα που πρέπει να πάρει όποιος θέλει να μάθει την τεχνολογία.

2. D. Wolf - Open GL 4. Shader language. Βιβλίο συνταγών (2015) - λήψη;

Αυτό το βιβλίο καλύπτει όλο το φάσμα των τεχνικών προγραμματισμού GLSL, ξεκινώντας από βασικοί τύποι shaders - κορυφή και θραύσμα - για τη γεωμετρία, τον υπολογισμό και τον τεμαχισμό shaders. Αφού το διαβάσετε, θα μπορείτε να χρησιμοποιήσετε τη GPU για να λύσετε μια μεγάλη ποικιλία προβλημάτων.

3. D. Ginsburg - OpenGL ES 3.0. Οδηγός προγραμματιστή (2014) - αγορά;

Σε αυτό το βιβλίο, ο συγγραφέας εξετάζει ολόκληρο το API και τη γλώσσα για τη γραφή shaders. Θα βρείτε επίσης συμβουλές για τη βελτιστοποίηση της απόδοσης, τη μεγιστοποίηση της αποδοτικότητας Δουλειά APIκαι GPU και πλήρη χρήση OpenGL ES σε ένα ευρύ φάσμα εφαρμογών.

4. V. Porev - Computer graphics (2002) - λήψη;

Το βιβλίο συζητά τρόπους εργασίας με γραφικά υπολογιστή, κοινά προβλήματα, δίνονται παραδείγματα προγραμμάτων σε C++.

Στα αγγλικά

1. P. Shirley - Fundamentals of Computer Graphics (2009) - ;

Το βιβλίο προορίζεται ως εισαγωγή στα γραφικά υπολογιστών βασικό επίπεδο. Οι συγγραφείς μιλούν για μαθηματικά θεμέλιαγραφικά υπολογιστή με έμφαση στον τρόπο εφαρμογής αυτών των βασικών αρχών για την ανάπτυξη αποτελεσματικού κώδικα.

2. E. Angel - Διαδραστικά γραφικά υπολογιστή - αγοράστε;

Αυτό το βιβλίο απευθύνεται σε όλους τους μαθητές που μελετούν σε βάθος την επιστήμη των υπολογιστών και τον προγραμματισμό. Κινούμενα σχέδια υπολογιστήκαι τα γραφικά δεν είναι τόσο περίπλοκα όσο πριν. Μετά τη δήλωσή του, ο συγγραφέας έγραψε το βιβλίο στην πιο κατανοητή γλώσσα.

Διαβάζετε το πρώτο μου σεμινάριο OpenGL!

Πριν ξεκινήσετε να μαθαίνετε το ίδιο το OpenGL, μου φαίνεται ότι είναι καλύτερο να σας πω πώς να μεταγλωττίσετε τον κώδικα, να τον εκτελέσετε και, κυρίως, πώς να πειραματιστείτε με τους πηγαίους κώδικες που δίνονται σε αυτά τα μαθήματα.

Τι πρέπει να ξέρετε

Τα μαθήματα αυτά απευθύνονται στον αναγνώστη χωρίς ιδιαίτερες γνώσεις προγραμματισμού. Φυσικά, η γνώση οποιασδήποτε γλώσσας προγραμματισμού (C, Java, Lisp, JavaSript) θα είναι ένα τεράστιο πλεονέκτημα, αλλά αυτό δεν απαιτείται, απλά πρέπει να μελετήσετε δύο μαθήματα ταυτόχρονα - τρισδιάστατα γραφικά και προγραμματισμό.

Όλος ο κώδικας σε αυτά τα μαθήματα είναι γραμμένος σε C++ με το απλούστερο δυνατό στυλ. Χωρίς πρότυπα, κλάσεις ή αριθμητική δείκτη. Επομένως, κοιτάζοντας τον κώδικα, μπορείτε να καταλάβετε τι κάνει, ακόμα κι αν είστε εξοικειωμένοι μόνο με τη JavaSript.

Ξεχάστε όλα όσα ξέρατε για το OpenGL 1/2

Αυτά τα μαθήματα υποθέτουν ότι δεν γνωρίζετε τίποτα για τα τρισδιάστατα γραφικά. Αλλά αν έχετε διαβάσει μαθήματα OpenGL και συναντήσετε κάτι σαν glBegin(), τότε ξεχάστε το. Εδώ θα μελετήσουμε το OpenGL 3 και 4 και αυτό που διαβάσατε ισχύει για το OpenGL 1 ή 2. Επομένως, σας συνιστώ να ξεχάσετε όλα όσα ξέρατε πριν, διαφορετικά ο εγκέφαλός σας θα αρχίσει να λιώνει από τις ασυνέπειες.

Κατασκευή του έργου

Ο κώδικας από αυτά τα μαθήματα μπορεί να μεταγλωττιστεί για Windows και Linux. Για να ξεκινήσετε τη μεταγλώττιση κώδικα για οποιαδήποτε από τις πλατφόρμες, πρέπει να κάνετε τα εξής:

  1. Ενημερώστε τα προγράμματα οδήγησης για την κάρτα γραφικών σας!! σε προειδοποίησα :)
  2. Κάντε λήψη του μεταγλωττιστή εάν δεν τον έχετε ήδη.
  3. Εγκαταστήστε το CMake
  4. Κατεβάστε έτοιμες πηγές μαθήματος.
  5. Δημιουργήστε το έργο χρησιμοποιώντας το CMake
  6. Συγκεντρώστε το έργο.
  7. Πειραματιστείτε με τον κώδικα για να κατανοήσετε καλύτερα τι συμβαίνει εκεί.

Παρακάτω έχω δώσει μια πιο λεπτομερή περιγραφή των έργων συναρμολόγησης για κάθε πλατφόρμα. Αλλά ανάλογα με την έκδοση του λειτουργικού συστήματος, τα στιγμιότυπα οθόνης μπορεί να διαφέρουν ελαφρώς από αυτά που θα εμφανιστούν στην οθόνη σας, αλλά γενικά, όλα θα πρέπει να είναι περίπου τα ίδια.

Συναρμολόγηση για Windows


Δημιουργία για Linux

Υπάρχει ένας τεράστιος αριθμός διαφορετικών παραλλαγών του Linux στον κόσμο, επομένως δεν θέλω να δώσω παραδείγματα συναρμολόγησης ενός έργου για το καθένα. Εάν κάτι δεν λειτουργεί όπως περιγράφεται παρακάτω, διαβάστε την τεκμηρίωση ή ψάξτε στο Διαδίκτυο.

  1. Εγκαθιστώ τελευταία προγράμματα οδήγησηςστην κάρτα γραφικών σας. Συνιστώ ανεπιφύλακτα προγράμματα οδήγησης που δεν είναι ανοιχτού κώδικα. Δεν περιλαμβάνονται στο GNU, αλλά συχνά λειτουργούν πολύ καλύτερα. Εάν η έκδοση Linux δεν παρέχειαυτόματο πρόγραμμα εγκατάστασης
  2. , δοκιμάστε να διαβάσετε τον οδηγό του Ubuntu. Εγκαταστήστε τον μεταγλωττιστή με όλααπαραίτητες βιβλιοθήκες
  3. και εργαλεία. Ακολουθεί μια λίστα με αυτά που χρειάζεστε: cmake make g++ libx11-dev libgl1-mesa-dev libglu1-mesa-dev libxrandr-dev libxext-dev. Χρησιμοποιήστε sudo apt-get install ***** ή su /yum install ******
  4. Κάντε λήψη των παραδειγμάτων πηγών και αποσυμπιέστε τα σε έναν φάκελο, για παράδειγμα ~/Projects/OpenGLTutorials/
  • Μεταβείτε στο ~/Projects/OpenGLTutorials/ και πληκτρολογήστε τις ακόλουθες εντολές:
  • mkdir κατασκευή
  • κατασκευή cd
  1. cmake..
  2. Εάν οι προηγούμενες εντολές εκτελέστηκαν με επιτυχία, θα δημιουργηθεί ένα makefile στο build/folder πληκτρολογήστε "make all" και μετά από αυτό θα συγκεντρωθούν όλα τα παραδείγματα και οι εξαρτήσεις τους. Εάν δεν υπάρχουν σφάλματα, τότε έτοιμοεκτελέσιμα αρχεία

θα τοποθετηθεί στο φάκελο ~/Projects/OpenGLTutorials/

Μου αρέσει πολύ να χρησιμοποιώ το QtCreator IDE. Αυτό το IDE μπορεί να λειτουργήσει με το CMake out of the box και παρέχει ένα σωρό άλλα καλούδια, όπως εντοπισμό σφαλμάτων, αυτόματη συμπλήρωση κ.λπ.

1. Οδηγίες για την κατασκευή ενός έργου στο QtCreator: Στο QtCreator κάντε κλικ

2. Αρχείο->Εργαλεία->Επιλογές->Συμπλήρωση&Εκτέλεση->CMake

3. Καθορίστε τη διαδρομή προς το CMake. Αυτό πιθανότατα θα είναι /usr/bin/cmake

4. File-> Ανοίξτε το Project και επιλέξτε tutorials/CMakeLists.txt

5. Καθορίστε το φάκελο κατασκευής, ο φάκελος θα πρέπει κατά προτίμηση να βρίσκεται εκτός του φακέλου tutorials.

6. Προαιρετικά ορίζεται –DCMAKE_BUILD_TYPE=Εντοπισμός σφαλμάτων στο πεδίο επιλογών. Κλικστο σφυρί από κάτω.

7. Μετά από αυτό, τα παραδείγματα μπορούν να εκτελεστούν από τον φάκελο tutorials/

Για να εκτελέσετε παραδείγματα από το QtCreator, επιλέξτε Έργα -> Παράμετροι εκτέλεσης -> Κατάλογος εργασίας και επιλέξτε τον κατάλογο όπου βρίσκονται οι σκιαδιστές υφής και μοντέλου. Για το tutorial 2 θα είναι ~/opengl -tutorial /tutorial02_red_triangle/

Παραδείγματα τρεξίματος
Μόλις ολοκληρωθεί το έργο, οι εφαρμογές μπορούν να εκκινηθούν απευθείας από τον κατάλογο.

Εάν πρέπει να εκτελέσετε παραδείγματα απευθείας από το IDE, χρησιμοποιήστε τις παραπάνω οδηγίες για να ορίσετε σωστά τον κατάλογο εργασίας.

Πώς να πάρετε αυτά τα μαθήματα Κάθε μάθημα συνοδεύεται απόπηγαίος κώδικας

και δεδομένα. Όλα αυτά τα αρχεία βρίσκονται στον αντίστοιχο κατάλογο tutorialXX/.

Καθώς διαβάζετε αυτά τα σεμινάρια, θα βλέπετε κομμάτια κώδικα παντού. Μη διστάσετε να τα αντιγράψετε στο playground.cpp για να τα δείτε σε δράση - ο πειραματισμός είναι πάντα καλός. Θα το ξαναπώ, μην διαβάζετε μόνο. έτοιμος κωδικόςκαι προσπαθήστε να το εκκινήσετε. Δεν θα μάθετε πολλά διαβάζοντας απλώς τον πηγαίο κώδικα. Ακόμα και με απλό copy-paste, θα αποκτήσετε τον δικό σας κουβά με προβλήματα, λύνοντας τα οποία θα αποκτήσετε την απαραίτητη εμπειρία.

Ανοίγοντας το παράθυρο

Τελικά! OpenGL!

Ωστόσο, θα πρέπει να περιμένετε λίγο ακόμα. Σε όλα τα μαθήματα, οι τρισδιάστατες λειτουργίες θα εκτελούνται σε πολύ χαμηλό επίπεδο, οπότε δεν θα υπάρχει μαγεία για εσάς. Ωστόσο, η εργασία με παράθυρα συστήματος και μηνύματα δεν είναι ενδιαφέρουσα και βαρετή, επομένως θα αφήσουμε τη βιβλιοθήκη GLFW να κάνει τη βρώμικη δουλειά για εμάς. Εάν το θέλετε πραγματικά, μπορείτε να χρησιμοποιήσετε το Win32 Api για Windows ή το X11 API για Linux ή να χρησιμοποιήσετε κάτι άλλο, όπως SFML, FreeGLUT, SDL, ... διαβάστε τη σελίδα συνδέσμου.

Εντάξει, ας ξεκινήσουμε ήδη. Ας ξεκινήσουμε με το γεγονός ότι πρέπει να συνδέσουμε τις εξαρτήσεις. Εφόσον πρέπει να εξάγουμε μηνύματα στην κονσόλα, θα γράψουμε τα εξής:

// Σύνδεση τυπικών κεφαλίδων

#συμπεριλαμβάνω

#συμπεριλαμβάνω

Στη συνέχεια συνδέουμε το GLEW

// Δεν πρέπει να το ξεχνάμε αυτό GLEW πρέπει να συνδεθεί πριν gl . η ή glfw . η

#συμπεριλαμβάνω

Στη συνέχεια συνδέουμε το GLFW. Αυτή η βιβλιοθήκη θα κάνει όλη τη μαγική διαχείριση παραθύρων.

#συμπεριλαμβάνω

Δεν χρειαζόμαστε αυτήν τη βιβλιοθήκη σε αυτό το στάδιο, αλλά περιέχει μαθηματικές συναρτήσεις και θα τη χρειαστούμε σύντομα. Δεν υπάρχει μαγεία στο GLM, και αν το θέλετε πραγματικά, μπορείτε να χρησιμοποιήσετε οποιαδήποτε άλλη βιβλιοθήκη για εργασία με πίνακες και διανύσματα. Περιλαμβάνουμε "χρήση χώρου ονομάτων" για να γράψουμε "vec3" και όχι "glm::vec3"

#συμπεριλαμβάνω

χρήση χώρου ονομάτων glm.

Εάν αντιγράψετε αυτά τα κομμάτια κώδικα στο playground.cpp, ο μεταγλωττιστής θα αρχίσει να παραπονιέται ότι δεν υπάρχει συνάρτηση main(). Ας προσθέσουμε λοιπόν:

int main())(

Θα ήταν καλύτερα να αρχικοποιήσετε πρώτα το GLFW:

// Αρχικοποίηση GLFW

if(!glfwInit())

{

fprintf(stderr, "Απέτυχε η προετοιμασία του GLFW\n");

επιστροφή -1;

}

Τώρα ας δημιουργήσουμε το παράθυρο OpenGL μας:

glfwOpenWindowHint( GLFW_ FSAA_ ΔΕΙΓΜΑΤΑ, 4); // 4 xεξομάλυνση

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); //μας χρειάζεται OpenGL 3.3

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);

glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // μας Δεν χρειάζεται παλιός OpenGL

// Ας ανοίξουμε ένα παράθυρο και ας δημιουργήσουμε ένα πλαίσιο

if(!glfwOpenWindow(1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW))

{

fprintf(stderr, "Αποτυχία ανοίγματος παραθύρου GLFW\n");

Εργαστηριακή εργασία Νο 2.

1. Εισαγωγή

OpenGL – Open Graphics Library, ανοιχτή βιβλιοθήκη γραφικών. Ο όρος "ανοιχτό" σημαίνει ανεξάρτητος από τους κατασκευαστές. Υπάρχει μια προδιαγραφή (πρότυπο) για το OpenGL, όπου όλα τεκμηριώνονται και περιγράφονται ξεκάθαρα. Οποιοσδήποτε μπορεί να δημιουργήσει μια βιβλιοθήκη OpenGL. Το κύριο πράγμα είναι ότι η βιβλιοθήκη πληροί τις προδιαγραφές OpenGL και μια σειρά από δοκιμές. Ως αποτέλεσμα, δεν υπάρχουν σκοτεινά μέρη, μυστικά, μη τεκμηριωμένα χαρακτηριστικά κ.λπ. Η βιβλιοθήκη παράγεται από εταιρείες όπως η Microsoft, η Silicon Graphics, καθώς και απλά ομάδες προγραμματιστών. Ένα τέτοιο παράδειγμα είναι η υλοποίηση Mesa. Αυτή η βιβλιοθήκη γράφτηκε μια ολόκληρη σειράπρογραμματιστές, κύριος συγγραφέας είναι ο Brian Paul. Η βιβλιοθήκη Mesa διανέμεται στο κείμενα πηγήςσε γλώσσα C και μπορεί να συναρμολογηθεί για σχεδόν οποιαδήποτε λειτουργικό σύστημα. Το πρότυπο OpenGL εξελίσσεται από το 1992. Αναπτύχθηκε από τη Silicon Graphics. Από τότε, η βιβλιοθήκη έχει αποκτήσει τεράστια δημοτικότητα και έχει ενσωματωθεί με πολλές γλώσσες και συστήματα ανάπτυξης εφαρμογών. Μπορείτε να γράψετε ένα πρόγραμμα με χρησιμοποιώντας OpenGLσε C, C++, Pascal, Java και πολλές άλλες γλώσσες. Κύριος σκοπός Προγραμματισμός OpenGL 3D γραφικά.

Η βιβλιοθήκη OpenGL είναι μια διεπαφή προγραμματισμού 3D γραφικών. Η μονάδα πληροφοριών είναι η κορυφή που αποτελούνται από περισσότερα σύνθετα αντικείμενα. Ο προγραμματιστής δημιουργεί τις κορυφές, καθορίζει τον τρόπο σύνδεσης τους (με γραμμές ή πολύγωνα), ορίζει τις συντεταγμένες και τις παραμέτρους της κάμερας και των λαμπτήρων και η βιβλιοθήκη OpenGL αναλαμβάνει τη δημιουργία της εικόνας στην οθόνη. Το OpenGL είναι ιδανικό για προγραμματιστές που πρέπει να δημιουργήσουν μια μικρή τρισδιάστατη σκηνή χωρίς να ανησυχούν για τις λεπτομέρειες υλοποίησης των αλγορίθμων τρισδιάστατων γραφικών. Για τους επαγγελματίες που ασχολούνται με τον προγραμματισμό τρισδιάστατων γραφικών, η βιβλιοθήκη θα είναι επίσης χρήσιμη, καθώς αντιπροσωπεύει τους βασικούς μηχανισμούς και εκτελεί ορισμένους αυτοματισμούς. Χρησιμοποιώντας το OpenGL, μπορείτε εύκολα να δημιουργήσετε τρισδιάστατες επιφάνειες, να εφαρμόσετε υφές σε αυτές, να τις φωτίσετε με πηγές φωτός, να δημιουργήσετε εφέ ομίχλης, διαφάνειας, ανάμειξης χρωμάτων, καθώς και να εφαρμόσετε ένα στένσιλ, να μετακινήσετε αντικείμενα σκηνής, λάμπες και κάμερες σε συγκεκριμένες τροχιές. δημιουργώντας έτσι κινούμενα σχέδια. Το OpenGL δεν υποστηρίζει άμεσα συσκευές εισόδου, όπως ποντίκι ή πληκτρολόγιο, επειδή είναι μια βιβλιοθήκη ανεξάρτητη από την πλατφόρμα. Μπορείτε όμως να χρησιμοποιήσετε τις λειτουργίες του συγκεκριμένου λειτουργικού συστήματος για το οποίο γράφετε το πρόγραμμά σας ή να χρησιμοποιήσετε πρόσθετα για το OpenGL, όπως οι βιβλιοθήκες GLUT ή GLAUX.

2. Πρώτο πρόγραμμα

Το απλούστερο αντικείμενο με το οποίο μπορείτε να δείτε την πλήρη ισχύ του OpenGL είναι μια σφαίρα. Μπορείτε να προσπαθήσετε να το απεικονίσετε. Για να γίνει αυτό πρέπει να δημιουργήσετε νέο έργοστο VisualC++ κάνοντας επόμενα βήματα:

— εκκίνηση του Visual C++.

— εκτελέστε την εντολή Αρχείο | Νέος...;

— στο παράθυρο διαλόγου που ανοίγει, επιλέξτε τον τύπο έργου Win32 Application, στο πεδίο Όνομα έργου, καθορίστε το όνομα του έργου και στο πεδίο Θέση, τον φάκελο στον οποίο θα βρίσκεται το έργο.

— πατήστε το κουμπί OK. Στη συνέχεια, χωρίς να αλλάξετε τίποτα, κάντε κλικ στο κουμπί Τέλος και ξανά OK.

— αντιγράψτε δύο δείγματα αρχείων στο φάκελο του έργου. cpp και Sample. η (εκδίδεται από τον δάσκαλο)·

— συνδέστε αυτά τα δύο αρχεία στο έργο εκτελώντας την εντολή Project | Προσθήκη στο έργο | Αρχεία...;

— εισάγετε τον ακόλουθο κώδικα στη λειτουργία Εμφάνιση:

GlColor3d(1,0,0);

AuxSolidSphere(1);

— δημιουργήστε μια λειτουργική μονάδα exe (F7).

Ας εξηγήσουμε τον σκοπό των δύο εισαγόμενων συναρτήσεων. Η συνάρτηση glColor3d ορίζει το τρέχον χρώμα με το οποίο θα σχεδιάζονται τα σχήματα. Εδώ πρέπει να εξηγήσουμε πώς ορίζεται το χρώμα και τη γενική φιλοσοφία στην ονομασία συναρτήσεων OpenGL. Το χρώμα ορίζεται από τέσσερις παραμέτρους: κόκκινο, μπλε, πράσινο και διαφάνεια. Αυτές οι παράμετροι κυμαίνονται από μηδέν έως ένα. Δεν χρειαζόμαστε ακόμα την τέταρτη παράμετρο, οπότε καλέσαμε το glColor με τρεις παραμέτρους. Σε αυτήν την περίπτωση, λαμβάνεται υπόψη η προεπιλεγμένη τιμή της τέταρτης παραμέτρου, η διαφάνεια ίσο με ένα, δηλαδή απολύτως αδιαφανές, το μηδέν θα είναι απολύτως διαφανές. Χρησιμοποιείται η ακόλουθη σύνταξη κλήσης συνάρτησης: FuncionName[τύπος παραμέτρου].

Οι παρακάτω τύποι είναι διαθέσιμοι:

B – GLbyte byte.

S – Σύντομος ακέραιος GL.

I – GLint ακέραιος αριθμός;

F – GLfloat κλασματικό;

D – GLdouble fractional με διπλή ακρίβεια.

Ub – GLubyte ανυπόγραφο byte.

Us – GLushort ανυπόγραφος σύντομος ακέραιος αριθμός.

Ui – GLuint ανυπόγραφος ακέραιος.

V – πίνακας n παραμέτρων καθορισμένο τύπο;

Στην περίπτωσή μας, το glColor3d σημαίνει ότι τρεις παράμετροι τύπου GLdouble μεταβιβάζονται στη συνάρτηση. Ήταν επίσης δυνατό να καλέσετε το glColor3i, δηλαδή τρεις παραμέτρους τύπου GLint. Εάν ο τύπος παραμέτρου είναι σύντομος ακέραιος, ακέραιος, byte ή μακρύς, τότε το στοιχείο χρώματος μεταδίδεται στο εύρος. Η μείωση σε αυτό το εύρος πραγματοποιείται από ακολουθώντας τους κανόνες. Στην περίπτωση ενός ανυπόγραφου τύπου, η μεγαλύτερη δυνατή τιμή μειώνεται σε ένα, μηδέν σε μηδέν. Σε περίπτωση εικονικής μέγιστη αξίαμειώνεται σε ένα ή σε μείον ένα, και μείον ένα θα μειωθεί σε ένα. Στην πράξη, συνήθως χρησιμοποιείται μία από τις τρεις περιπτώσεις που συζητούνται ως παράδειγμα παρακάτω. Για παράδειγμα, για ένα χωρίς υπογραφή byte, η μετάδοση θα πραγματοποιηθεί χρησιμοποιώντας τον ακόλουθο τύπο: variable_value_stored_in_byte/255, καθώς το 255 είναι ο μέγιστος αριθμός που είναι αποθηκευμένος σε ένα byte. Η συνάρτηση glColor3dv σημαίνει ότι ένας πίνακας τριών στοιχείων τύπου GLdouble μεταβιβάζεται ως παράμετρος. Για παράδειγμα:

Διπλός πίνακας = (0,5, 0,75, 0,3);

GlColor3dv(πίνακας);

GlColor3ub(200,100,0); // μειώνεται σε

// 200/256, 100/256, 0,256

GlColor3d(0,25,0,25,0); // σκούρο κίτρινο

GlColot3ub(0,100,0); // σκούρο πράσινο

GlColor3ub(0,0,255); // μπλε

3. Απλά αντικείμενα. Γενικές διατάξεις

Σημεία, ευθείες, τρίγωνα, τετράπλευρα, πολύγωνα – απλά αντικείμενα, από το οποίο συντίθενται τυχόν σύνθετα σχήματα. Το OpenGL δεν υποστηρίζει άμεσα λειτουργίες για τη δημιουργία τέτοιων σύνθετα αντικείμεναόπως μια σφαίρα, ο κύλινδρος κ.λπ., δηλαδή τέτοιες συναρτήσεις δεν είναι στο opengl32.dll. Αυτές οι λειτουργίες βρίσκονται στη βιβλιοθήκη του βοηθητικού προγράμματος glu32.dll και είναι διατεταγμένες ως εξής. Για να σχεδιάσει μια σφαίρα, η συνάρτηση auxSolidSphere χρησιμοποιεί συναρτήσεις από τη βιβλιοθήκη glu32.dll, οι οποίες με τη σειρά τους χρησιμοποιούν τη βασική βιβλιοθήκη opengl32.dll και κατασκευάζουν μια σφαίρα από γραμμές ή πολύγωνα. Τα πρωτόγονα δημιουργούνται ως εξής:

GlBegin(λειτουργία); // υποδείξτε τι θα σχεδιάσουμε

glVertex(...); // πρώτη κορυφή

... // εδώ είναι οι υπόλοιπες κορυφές

glVertex(...); // τελευταία

//κορυφή

GlEnd(); // τελείωσε το σχέδιο του πρωτόγονου

Πρώτα πρέπει να καθορίσετε την έναρξη του σχεδίου - glΞεκινήστε με την κατάλληλη παράμετρο.

Οι πιθανές τιμές λειτουργίας παρατίθενται στον παρακάτω πίνακα. Στη συνέχεια, υποδεικνύονται οι κορυφές που ορίζουν αντικείμενα του καθορισμένου τύπου. Συνήθως μια κορυφή καθορίζεται με έναν από τους τέσσερις τρόπους.

GlVertex2d(x, y); // δύο μεταβλητές τύπουδιπλό

GlVertex3d(x, y,z); // τρεις διπλές μεταβλητές

GlVertex2dv(πίνακας); // πίνακας μεταβλητών δύο τύπων

GlVertex3d(πίνακας); // πίνακας τριών μεταβλητών τύπων

Void glEnd(void);

Υποδεικνύει το τέλος των αντικειμένων σχεδίασης του τύπου που καθορίζεται στο glBegin. Στη συνέχεια, θα αναλύσουμε λεπτομερώς τη δημιουργία όλων των πρωτόγονων.

Πίνακας 1.

Λειτουργία πιθανών τιμών

Εννοια

Περιγραφή

Κάθε κλήση στο glVertex καθορίζει ένα διαφορετικό σημείο.

Κάθε ζεύγος κορυφών ορίζει ένα τμήμα.

Τραβιέται μια διακεκομμένη γραμμή.

Τραβιέται μια διακεκομμένη γραμμή και είναι τελευταίο σημείοσυνδέεται με το πρώτο.

Κάθε τρεις κλήσεις στο glVertex ορίζουν ένα τρίγωνο.

GL_TRIANGLE_STRIP

Σχεδιάζονται τρίγωνα με κοινή πλευρά.

Το ίδιο πράγμα, αλλά οι κορυφές συνδέονται σύμφωνα με διαφορετικό κανόνα.

Κάθε τέσσερις κλήσεις στο glVertex ορίζουν ένα τετραπλό.

Τετράπλευρα με κοινή πλευρά.

Πολύγωνο.

3.1. Πόντοι

Μπορείτε να σχεδιάσετε όσους πόντους θέλετε καλώντας το glVertex3d και, ως εκ τούτου, ρυθμίζοντας νέο σημείο. Κατά τη δημιουργία σημείων, μπορείτε να αλλάξετε τις ακόλουθες παραμέτρους. Μπορείτε να καλέσετε το glColor3d μέσα στο glBegin/glEnd. Το μέγεθος του σημείου μπορεί να ρυθμιστεί χρησιμοποιώντας τη συνάρτηση:

Void glPointSize(Μέγεθος GLfloat);

Η λειτουργία εξομάλυνσης μπορεί να ρυθμιστεί καλώντας τη λειτουργία

GlEnable(GL_POINT_SMOOTH);

Απενεργοποιείται αναλόγως καλώντας το glDisable(GL_POINT_SMOOTH). Οι τελευταίες συναρτήσεις - glPointSize και glEnable/glDisable πρέπει να καλούνται εκτός του glBegin/glEnd, διαφορετικά θα αγνοηθούν. Οι λειτουργίες glEnable/glDisable ενεργοποιούν/απενεργοποιούν πολλές επιλογές, αλλά έχετε κατά νου ότι ορισμένες επιλογές περιλαμβάνουν μεγάλους υπολογισμούς και, επομένως, επιβραδύνουν σημαντικά την εφαρμογή, επομένως δεν πρέπει να τις ενεργοποιήσετε εκτός εάν είναι απαραίτητο.

// τραβήξτε πόντους

GlBegin(GL_POINTS);

glColor3d(1,0,0);

glVertex3d(-4,5,4,0); // πρώτο σημείο

glColor3d(0,1,0);

glVertex3d(-4,4,0); // δεύτερο σημείο

glColor3d(0,0,1);

glVertex3d(-3,5,4,0); // τρίτο

GlBegin(GL_POINTS);

glColor3d(1,0,0);

glVertex3d(-2,4,0); // πρώτο σημείο

glColor3d(0,1,0);

glVertex3d(-1,4,0); // δεύτερο σημείο

glColor3d(0,0,1);

glVertex3d(0,4,0); // τρίτο

GlPointSize(10);

GlEnable(GL_POINT_SMOOTH);

GlBegin(GL_POINTS);

glColor3d(1,0,0);

glVertex3d(2,4,0); // πρώτο σημείο

glColor3d(0,1,0);

glVertex3d(3,4,0); // δεύτερο σημείο

glColor3d(0,0,1);

glVertex3d(4,4,0); // τρίτο

GlDisable(GL_POINT_SMOOTH);

3.2. Γραμμές

Για τις γραμμές μπορείτε επίσης να αλλάξετε το πλάτος, το χρώμα, το μέγεθος και την εξομάλυνση. Αν ορίσετε διαφορετικά χρώματα για την αρχή και το τέλος μιας γραμμής, το χρώμα της θα είναι ιριδίζον. Το OpenGL κάνει παρεμβολή από προεπιλογή. Μπορείτε επίσης να σχεδιάσετε σπασμένες γραμμές, αυτό γίνεται με την εφαρμογή μιας μάσκας χρησιμοποιώντας την ακόλουθη λειτουργία:

Void glLineStipple (παράγοντας GLint, μοτίβο GLushort);

Η δεύτερη παράμετρος καθορίζει την ίδια τη μάσκα. Για παράδειγμα, εάν η τιμή του είναι 255(0x00FF), τότε για να υπολογίσουμε την καθορισμένη μάσκα θα χρησιμοποιήσουμε μια αριθμομηχανή. Σε δυαδική μορφή, αυτός ο αριθμός μοιάζει με αυτό: 0000000011111111, δηλαδή μόνο 16 bit. Οι υψηλότερες οκτώ ορίζονται στο μηδέν, πράγμα που σημαίνει ότι δεν θα υπάρχει γραμμή εδώ. Τα δευτερεύοντα έχουν οριστεί σε ένα, θα τραβηχτεί μια γραμμή εδώ. Η πρώτη παράμετρος καθορίζει πόσες φορές επαναλαμβάνεται κάθε bit. Ας πούμε, εάν το ορίσετε στο 2, τότε η μάσκα επικάλυψης θα μοιάζει με αυτό:

GlLineWidth(1); // πλάτος γραμμής

// σύνολο 1

GlBegin(GL_LINES);

glColor3d(1,0,0); // κόκκινο χρώμα

glVertex3d(-4,5,3,0); // πρώτη γραμμή

glVertex3d(-3,3,0);

glColor3d(0,1,0); // πράσινο

glVertex3d(-3,3,3,0); // δεύτερη γραμμή

glVertex3d(-4,3.4,0);

GlLineWidth(3); // πλάτος 3

GlBegin(GL_LINE_STRIP); // δείτε παρακάτω

glColor3d(1,0,0);

glVertex3d(-2,7,3,0);

glVertex3d(-1,3,0);

glColor3d(0,1,0);

glVertex3d(-1,5,3,3,0);

glColor3d(0,0,1);

glVertex3d(-1,3,5,0);

GlEnable(GL_LINE_SMOOTH);

GlEnable(GL_LINE_STIPPLE); // επιτρέψτε το σχέδιο

// διακεκομμένη γραμμή

GlLineStipple(2.58360); // ορίστε τη μάσκα

// δείτε παρακάτω για επεξηγήσεις

GlBegin(GL_LINE_LOOP);

glColor3d(1,0,0);

glVertex3d(1,3,0);

glVertex3d(4,3,0);

glColor3d(0,1,0);

glVertex3d(3,2.7,0);

glColor3d(0,0,1);

glVertex3d(2.5,3.7,0);

GlDisable(GL_LINE_SMOOTH);

GlDisable(GL_LINE_STIPPLE);

3.3. Τρίγωνα

Για ένα τρίγωνο μπορείτε να ορίσετε τις ίδιες παραμέτρους όπως για μια γραμμή, καθώς και μια ακόμη συνάρτηση

Void glPolygonMode(

Ορίζει επιλογές για τη σχεδίαση του πολυγώνου. Οι πιθανές τιμές των παραμέτρων συνάρτησης δίνονται στον Πίνακα 2.

Πίνακας 2.

Τιμές παραμέτρων συνάρτησης glPolygonMode

Η πρώτη παράμετρος καθορίζει για ποια μέρη ισχύει η επιλογή που καθορίζεται από τη δεύτερη παράμετρο. Τα τρίγωνα μπορούν να σχεδιαστούν περνώντας το GL_TRIANGLE_STRIP ή το GL_TRIANGLE_FAN στο glBegin. Στην πρώτη περίπτωση, η πρώτη, η δεύτερη και η τρίτη κορυφή ορίζουν το πρώτο τρίγωνο. Η δεύτερη, η τρίτη και η τέταρτη κορυφή είναι το δεύτερο τρίγωνο. Η τρίτη, η τέταρτη και η πέμπτη κορυφή είναι το τρίτο τρίγωνο, κ.λπ. Οι κορυφές n, n+1 και n+2 θα ορίσουν το ντο τρίγωνο. Στη δεύτερη περίπτωση, η πρώτη, η δεύτερη και η τρίτη κορυφή ορίζουν το πρώτο τρίγωνο. Η πρώτη, η τρίτη και η τέταρτη κορυφή ορίζουν το δεύτερο τρίγωνο κ.λπ. Οι κορυφές 1, n+1, n+2 ορίζουν το ντο τρίγωνο. Ακολουθεί ένα παράδειγμα με σχόλια.

GlPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // βλέπε παραπάνω

GlBegin(GL_TRIANGLES);

glColor3d(1,0,0); // σχεδιάστε ένα τρίγωνο

glVertex3d(-4,2,0);

glVertex3d(-3,2.9,0);

glVertex3d(-2,2,0);

//σχεδιάστε συρμάτινα τρίγωνα

GlBegin(GL_TRIANGLE_STRIP); // προσέξτε

// σειρά κορυφής

glColor3d(0,1,0);

glVertex3d(1,2,0);

glVertex3d(0,2.9,0);

glVertex3d(-1,2,0);

glVertex3d(0,1.1,0);

GlEnable(GL_LINE_STIPPLE);

GlPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

GlBegin(GL_TRIANGLE_FAN);

glColor3d(0,0,1);

glVertex3d(4,2,0);

glVertex3d(2.6,2.8,0);

glVertex3d(2,2,0);

glVertex3d(3,1.1,0);

GlDisable(GL_LINE_STIPPLE);

3.4. Τετράπλευρα και πολύγωνα

Τα τετράπλευρα σχεδιάζονται καλώντας τη συνάρτηση glBegin με την παράμετρο GL_QUADS ή GL_QUAD_STRIP. Για την πρώτη περίπτωση, κάθε τέσσερις κορυφές ορίζουν το δικό τους τετράπλευρο. Στη δεύτερη περίπτωση σχεδιάζονται συνδεδεμένα τετράπλευρα. Η πρώτη, η δεύτερη, η τρίτη και η τέταρτη κορυφή ορίζουν το πρώτο τετράπλευρο. Η τρίτη, τέταρτη, πέμπτη και έκτη κορυφή ορίζουν το δεύτερο τετράπλευρο κ.λπ. Τα πολύγωνα καθορίζονται καλώντας το glBegin με την παράμετρο GL_POLYGON. Όλες οι κορυφές ορίζουν ένα πολύγωνο. Για πολύγωνα, μπορείτε να ορίσετε στυλ χρησιμοποιώντας τη συνάρτηση glPolygonMode που περιγράφεται παραπάνω, πάχος γραμμής, πάχος σημείου και χρώμα.

4. Μετακίνηση σε νέες συντεταγμένες

Στην προηγούμενη ενότητα, μάθατε πώς να σχεδιάζετε πρωτόγονα τρισδιάστατα αντικείμενα. Αλλά το πρόβλημα είναι ότι σχεδιάζονται μόνο στην αρχή, δηλαδή στο σημείο (0,0,0). Για να απεικονίσετε ένα αντικείμενο στο σημείο (x0,y0,z0), πρέπει να μετακινήσετε την αρχή των συντεταγμένων σε αυτό το σημείο, δηλαδή πρέπει να μετακινηθείτε σε νέες συντεταγμένες. Αυτή η διαδικασία είναι αρκετά συνηθισμένη κατά τον προγραμματισμό γραφικών και κινούμενων εικόνων. Συχνά, είναι πολύ βολικό να μετατοπίσετε τις συντεταγμένες σε ένα νέο σημείο και να τις περιστρέψετε στην απαιτούμενη γωνία και οι υπολογισμοί σας θα απλοποιηθούν πολύ. Για να μετακινηθείτε σε νέες συντεταγμένες, το OpenGL έχει δύο λειτουργίες:

Void glTranslated(Dx, Dy, Dz);

Void glRotated(j, x0,y0,z0);

Η πρώτη συνάρτηση μετατοπίζει την αρχή του συστήματος συντεταγμένων κατά (Dx, Dy, Dz). Το δεύτερο περιστρέφεται κατά γωνία j αριστερόστροφα γύρω από το διάνυσμα (x0,y0,z0). Τώρα, αξίζει να αναφέρουμε δύο ακόμη πολύ σημαντικές λειτουργίες:

Void glPushMatrix();

Void glPopMatrix();

Έχουν σχεδιαστεί για να αποθηκεύουν και να επαναφέρουν τις τρέχουσες συντεταγμένες. Συχνά είναι άβολο να μετακινηθείτε από το ένα σύστημα συντεταγμένων στο άλλο και να θυμάστε όλες τις μεταβάσεις. Είναι πολύ πιο βολικό να χρησιμοποιήσετε το glPushMatrix() για να αποθηκεύσετε τις τρέχουσες συντεταγμένες, στη συνέχεια να μετακινήσετε, να περιστρέψετε, όπως θέλετε και μετά να επιστρέψετε στις παλιές συντεταγμένες καλώντας το glPopMatrix. Τώρα μπορείτε να πειραματιστείτε. Ας εξετάσουμε μια μετατόπιση συντεταγμένων. Επικολλήστε τον ακόλουθο κώδικα στη λειτουργία εμφάνισης:

GlTranslated(1.4,0,0);// μετατόπιση κατά μήκος του άξονα Χ κατά 1.4

GlColor3d(0,1,0);

AuxSolidSphere(0.5); // σχεδιάστε μια σφαίρα στο (1,4,0,0)

// σε απόλυτες συντεταγμένες

GlTranslated(1,0,0); // μετακίνηση ξανά

GlColor3d(0,0,1);

AuxSolidSphere(0.3);

GlPopMatrix(); // επιστροφή στο παλιό σύστημα

// συντεταγμένες

GlColor3d(1,0,0);

AuxSolidSphere(0,75); // σχεδιάστε μια σφαίρα στο σημείο (0,0,0)

// σε απόλυτες συντεταγμένες

5. Περιστροφή συντεταγμένων

Τώρα εξετάστε την περιστροφή των συντεταγμένων. Στη λειτουργία εμφάνισης, επικολλήστε τον ακόλουθο κώδικα:

GlColor3d(1,0,0);

AuxSolidCone(1, 2); // σχεδιάστε έναν κώνο στο κέντρο των συντεταγμένων

GlPushMatrix(); // αποθήκευση των τρεχουσών συντεταγμένων

glTranslated(1,0,0); // μετακίνηση στο σημείο (1,0,0)

glRotated(75,1,0,0); // περιστρέψτε το σύστημα

// συντεταγμένες στις 75 μοίρες

glColor3d(0,1,0);

auxSolidCone(1, 2); // σχεδιάστε έναν κώνο

GlPopMatrix(); // επιστροφή στις παλιές συντεταγμένες

Όπως μπορείτε να δείτε, ο κώνος έχει περιστραφεί σε απόλυτες συντεταγμένες. Έτσι, για να σχεδιάσετε μια φιγούρα όχι στην αρχή, πρέπει:

· move(glTranslated), rotate(glRotated);

· Σχεδιάστε αυτό που θέλατε.

· επιστροφή στις παλιές συντεταγμένες.

Οι κλήσεις glPushMatrix/PopMatrix μπορούν να είναι ένθετες, π.χ.

Φυσικά, ο αριθμός των κλήσεων προς το glPopMatrix πρέπει να αντιστοιχεί στον αριθμό των κλήσεων προς το glPushMatrix, διαφορετικά η σκηνή θα πετάξει προς άγνωστη κατεύθυνση. Το μέγιστο επιτρεπόμενο βάθος ένθεσης του glPushMatrix/glPopMatrix προσδιορίζεται ως εξής:

GlGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &n);

Printf("n=%d ",n);

Η προδιαγραφή OpenGL εγγυάται ότι το βάθος στοίβας δεν μπορεί να είναι μικρότερο από 32.

6. Κατασκευή επιφανειών

Υπάρχει ένα σύνολο λειτουργιών για την κατασκευή σφαιρών, κυλίνδρων και δίσκων. Αυτές οι λειτουργίες παρέχουν πολύ ισχυρό έλεγχο κατασκευής τρισδιάστατα αντικείμενα. Οι ακόλουθες λειτουργίες χρησιμοποιούνται για τη σχεδίαση επιφανειών:

GLUquadricObj * qobj,

GL διπλή ακτίνα,

Κενός γλυκοκύλινδρος (

GLUquadricObj *qobj,

GLRadius διπλής βάσης,

GLdouble topRadius,

GL διπλό ύψος,

GLUquadricObj *qobj,

GL διπλή εσωτερική ακτίνα,

GL διπλή εξωτερική ακτίνα,

Void gluPartialDisk(

GLUquadricObj *qobj,

GL διπλή εσωτερική ακτίνα,

GL διπλή εξωτερική ακτίνα,

GLdoble startAngle,

GLdouble sweepAngle

Στην αρχή αυτού του μαθήματος, μάθατε πώς να κατασκευάζετε τρισδιάστατα αντικείμενα χρησιμοποιώντας συναρτήσεις από τη Βοηθητική Βιβλιοθήκη. Οι συναρτήσεις auxSphere, auxCylinder και auxCone καλούν απλώς gluSphere και gluCylinder. Το auxCylinder και το auxCone της Microsoft έχουν σφάλματα. Εδώ θα συζητηθεί αναλυτικά η κατασκευή σφαιρών και κυλίνδρων, έτσι ώστε να μην είναι πλέον απαραίτητη η ανάγκη για auxCylinder και auxCone.

Η πρώτη παράμετρος για τα gluSphere, gluCylinder, gluDisk και gluPartialDisk είναι ένας δείκτης σε ένα αντικείμενο του τύπου GLUquadricObj. Ακολουθούν οι παράμετροι του άμεσα δημιουργημένου σχήματος. Για μια σφαίρα, αυτή είναι η ακτίνα. για έναν κύλινδρο – ακτίνα της κάτω βάσης, ακτίνα της άνω βάσης και ύψος. για δίσκο - εσωτερική ακτίνα, εξωτερική ακτίνα και για μερικό δίσκο - εσωτερική ακτίνα, εξωτερική ακτίνα, γωνία από την οποία ξεκινά η σχεδίαση, μήκος τόξου σε μοίρες προς σχεδίαση. Οι δύο τελευταίες παράμετροι είναι ίδιες για όλες αυτές τις συναρτήσεις. Αυτός είναι ο αριθμός των διαμερισμάτων γύρω από τον άξονα Z και ο αριθμός των διαμερισμάτων κατά μήκος του άξονα Z Όπως γνωρίζετε, όλα τα σύνθετα αντικείμενα αποτελούνται από απλά: σημεία, γραμμές και πολύγωνα. Είναι σαφές ότι είναι αδύνατο να σχεδιάσουμε (δημιουργήσουμε) μια τέλεια λεία σφαίρα ή κύλινδρο. Επομένως, δημιουργείται μια προσέγγιση από επίπεδα. Για να το κάνετε αυτό, πρέπει να καθορίσετε τον αριθμό των διαχωρισμών. Όσο μεγαλύτερο είναι το σχίσιμο, τόσο καλύτερα θα φαίνεται το αντικείμενό σας. Ωστόσο, δεν πρέπει να καθορίσετε έναν αριθμό με έξι μηδενικά εδώ. Αυτό δεν έχει κανένα νόημα. Ο βέλτιστος αριθμός είναι από 10 έως 20. Όσο μεγαλύτερο είναι το αντικείμενο, τόσο περισσότερα διαμερίσματα χρειάζονται. Είναι καλύτερο να ρυθμίσετε τον αριθμό των κατατμήσεων (κατά μήκος και κατά μήκος) ίδιο.

Πρώτα πρέπει να δημιουργήσετε ένα αντικείμενο τύπου GLUquadricObj χρησιμοποιώντας τη συνάρτηση

GLUquadricObj * gluNewQuadric(void);

Στη συνέχεια, πρέπει να ορίσετε τις ιδιότητες χρησιμοποιώντας τη συνάρτηση

Void gluQuadricDrawStyle(

GLUquadricObj *qobj,

Glenum drawStyle

Διαθέσιμα στυλ:

GLU_FILL – σχεδιάζεται ένα στερεό αντικείμενο.

GLU_LINE – συρμάτινο αντικείμενο.

GLU_POINT – κληρώνονται μόνο σημεία.

Μπορείτε να διαγράψετε ένα δημιουργημένο αντικείμενο χρησιμοποιώντας τη συνάρτηση

Void gluDeleteQuadric(GLUquadricObj * κατάσταση);

Τώρα μπορείτε να πειραματιστείτε. Αλλάξτε τη λειτουργία εμφάνισης ως εξής.

Κενή οθόνη (κενή)

GLUquadricObj * quadObj;

// δημιουργία νέο αντικείμενογια τη δημιουργία σφαιρών και κυλίνδρων

quadObj = gluNewQuadric();

glColor3d(1,0,0);

// στυλ σετ: συμπαγής

gluQuadricDrawStyle(quadObj, GLU_FILL);

// σχεδιάστε μια σφαίρα με ακτίνα 0,5

gluSphere(quadObj, 0,5, 10, 10);

glTranslated(-2,0,0); // μετακίνηση αριστερά

glRotated(45, 1,0,0); // περιστροφή

glColor3d(0,1,0);

// στυλ σετ: σύρμα

gluQuadricDrawStyle(quadObj, GLU_LINE);

gluCylinder(quadObj, 0,5, 0,75, 1, 15, 15);

gluDeleteQuadric(quadObj);

auxSwapBuffers();

7. Αεροπλάνα κοπής

Εάν θέλετε να σχεδιάσετε μια σφαίρα ή οποιοδήποτε άλλο αντικείμενο κομμένο, μπορείτε να το κάνετε χρησιμοποιώντας ένα επίπεδο αποκοπής. Μπορεί να υπάρχουν έξι αεροπλάνα κοπής. Από προεπιλογή είναι όλα απενεργοποιημένα. Το επίπεδο αποκοπής ενεργοποιείται με την εντολή glEnable(GL_CLIP_PLANE0). Το μηδέν στο τέλος του GL_CLIP_PLANE σημαίνει το επίπεδο γείωσης. μπορείτε να καθορίσετε ένα, δύο, τρία κ.λπ. Το ίδιο το επίπεδο ορίζεται από τη συνάρτηση

Void glClipPlane(

const GLdouble *εξίσωση

Το πρώτο όρισμα αυτής της συνάρτησης είναι το επίπεδο, το δεύτερο είναι ένας πίνακας τεσσάρων στοιχείων που αποθηκεύει τους συντελεστές (A, B, C, D) της εξίσωσης επιπέδου: A*x + B*y + C*z + D = 0. Αλλάξτε την οθόνη λειτουργίας όπως φαίνεται παρακάτω.

Κενή οθόνη (κενή)

GLδιπλή εξίσωση = (-1,-0,25,0,2);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_CLIP_PLANE0);

glClipPlane(GL_CLIP_PLANE0, εξίσωση);

glColor3d(1,0,0);

auxSolidSphere(3);

glDisable(GL_CLIP_PLANE0);

auxSwapBuffers();

8. αποστολές

1. Σχεδιάστε έναν κύβο που αντιπροσωπεύει Χώρος RGB. Οι κορυφές του κύβου έχουν χρώματα: R - κόκκινο, G - πράσινο, B - μπλε, C - κυανό, M - ματζέντα, Y - κίτρινο, W - λευκό, K - μαύρο. Το χρώμα κάθε άκρης αλλάζει ομαλά από το χρώμα μιας κορυφής στο χρώμα μιας άλλης.

Αφού σχεδιαστεί ο κύβος, μετακινήστε τον έτσι ώστε η αρχή να συμπίπτει με το κέντρο του κύβου και, στη συνέχεια, περιστρέψτε τον γύρω από τον άξονα OX υπό γωνία 30° και γύρω από τον άξονα OZ υπό γωνία -20°.

2. Σχεδιάστε μια σκηνή στην οποία απεικονίζεται μια σφαίρα ακτίνας r στην αρχή. Σε απόσταση R1 από την πρώτη σφαίρα σε κάποιο σημείο (x1, y1, 0), απεικονίζεται μια σφαίρα με ακτίνα r1. Από αυτό σε απόσταση R2 σε κάποιο σημείο (x2, y2, 0) απεικονίζεται μια σφαίρα ακτίνας r2.

Αφού σχεδιαστεί η σκηνή, είναι απαραίτητο να την «αναβιώσουμε», δηλαδή να κάνουμε τη σφαίρα r1 να περιστρέφεται γύρω από τη σφαίρα r και τη σφαίρα r2 γύρω από τη r1. Για να γίνει αυτό, είναι απαραίτητο να δηλωθούν οι καθολικές μεταβλητές f1 και f2 - οι γωνίες περιστροφής του r1 γύρω από το r και του r2 γύρω από το r1, αντίστοιχα. Στη συνέχεια, πριν από κάθε έξοδο, αυξήστε το f1f2 κατά σταθερές τιμές και υπολογίστε τα x1, y1, x2, y2 χρησιμοποιώντας τους ακόλουθους τύπους.

Το OpenGL είναι ενεργοποιημένο αυτή τη στιγμήμια από τις πιο δημοφιλείς διεπαφές προγραμμάτων (API) για την ανάπτυξη εφαρμογών στον τομέα των δισδιάστατων και τρισδιάστατων γραφικών. Το πρότυπο OpenGL αναπτύχθηκε και εγκρίθηκε το 1992 από κορυφαίες εταιρείες ανάπτυξης λογισμικού και βασίζεται στη βιβλιοθήκη IRIS GL που αναπτύχθηκε από τη Silicon Graphics.

Προς το παρόν, η υλοποίηση του OpenGL περιλαμβάνει αρκετές βιβλιοθήκες (περιγραφή των βασικών λειτουργιών του OpenGL, GLU, GLUT, GLAUX και άλλων), ο σκοπός των οποίων θα περιγραφεί παρακάτω.

Τα χαρακτηριστικά γνωρίσματα του OpenGL που εξασφάλισαν τη διάδοση και την ανάπτυξη αυτού του προτύπου γραφικών είναι:

Σταθερότητα - οι προσθήκες και οι αλλαγές στο πρότυπο υλοποιούνται με τέτοιο τρόπο ώστε να διατηρείται η συμβατότητα με το λογισμικό που έχει αναπτυχθεί προηγουμένως.

Αξιοπιστία και φορητότητα - οι εφαρμογές που χρησιμοποιούν OpenGL εγγυώνται το ίδιο οπτικό αποτέλεσμα ανεξάρτητα από τον τύπο του λειτουργικού συστήματος που χρησιμοποιείται και την οργάνωση της εμφάνισης πληροφοριών. Επιπλέον, αυτές οι εφαρμογές μπορούν να εκτελούνται σε προσωπικούς υπολογιστές, σταθμούς εργασίας και υπερυπολογιστές.

Ευκολία στη χρήση - Το πρότυπο OpenGL έχει μια καλά μελετημένη δομή και μια διαισθητική διεπαφή, η οποία σας επιτρέπει να δημιουργείτε αποτελεσματικές εφαρμογές με λιγότερες γραμμές κώδικα από τη χρήση άλλων βιβλιοθηκών γραφικών με χαμηλότερο κόστος. Απαιτούμενα χαρακτηριστικά για συμβατότητα με διάφορα είδη εξοπλισμούυλοποιούνται σε επίπεδο βιβλιοθήκης και απλοποιούν σημαντικά την ανάπτυξη εφαρμογών.

Βασικές δυνατότητες OpenGL

    Ένα σύνολο βασικών πρωτόγονων: σημεία, γραμμές, πολύγωνα κ.λπ.

    Προβολή και συντονισμός μετασχηματισμών

    Μετακίνηση αόρατες γραμμέςκαι επιφάνειες (z-buffer)

    Χρήση splines για την κατασκευή γραμμών και επιφανειών

    Εφαρμογή χαρτογράφησης υφής και φωτισμού

    Προσθήκη ειδικών εφέ: ομίχλη, αλλαγή διαφάνειας, ανάμειξη χρωμάτων, εξάλειψη του αλιάζ (anti-aliasing).

Όπως αναφέρθηκε ήδη, υπάρχουν υλοποιήσεις OpenGL για διαφορετικές πλατφόρμες, για τις οποίες ήταν βολικό να διαχωριστούν οι βασικές λειτουργίες του συστήματος γραφικών και οι λειτουργίες για την εμφάνιση πληροφοριών γραφικών και την αλληλεπίδραση με τον χρήστη. Οι βιβλιοθήκες δημιουργήθηκαν για να εμφανίζουν πληροφορίες χρησιμοποιώντας το υποσύστημα window για λειτουργικά συστήματα συστήματα Windowsκαι Unix (WGL και GLX, αντίστοιχα), καθώς και οι βιβλιοθήκες GLAUX και GLUT, οι οποίες χρησιμοποιούνται για τη δημιουργία των λεγόμενων εφαρμογών κονσόλας.

Η βιβλιοθήκη GLAUX είναι κατώτερη σε δημοτικότητα από τη βιβλιοθήκη GLUT που γράφτηκε λίγο αργότερα, αν και παρέχουν περίπου τις ίδιες δυνατότητες. Η βιβλιοθήκη GLU περιλαμβάνει την υλοποίηση πιο περίπλοκων συναρτήσεων, όπως ένα σύνολο δημοφιλών γεωμετρικών πρωτόγονων (κύβος, μπάλα, κύλινδρος, δίσκος), λειτουργίες για την κατασκευή splines, υλοποίηση πρόσθετων πράξεων σε πίνακες κ.λπ. Όλα αυτά υλοποιούνται μέσω βασικών λειτουργιών OpenGL.

Αρχιτεκτονικά και συντακτικά χαρακτηριστικά

Από αρχιτεκτονικής άποψης, το σύστημα γραφικών OpenGL είναι ένας αγωγός που αποτελείται από διάφορα στάδια επεξεργασίας δεδομένων:

    Προσέγγιση καμπυλών και επιφανειών

    Επεξεργασία Vertex και πρωτόγονη συναρμολόγηση

    Ραστεροποίηση και επεξεργασία θραυσμάτων

    Λειτουργίες σε pixel

    Προετοιμασία της υφής

    Μεταφορά δεδομένων στο Frame Buffer

Γενικά, το OpenGL μπορεί να συγκριθεί με μια μηχανή κατάστασης, η κατάσταση της οποίας καθορίζεται από ένα σύνολο τιμών ειδικών μεταβλητών (τα ονόματά τους συνήθως ξεκινούν με τους χαρακτήρες GL_) και τις τιμές του τρέχοντος κανονικού, χρώματος και συντεταγμένες υφής. Όλες αυτές οι πληροφορίες θα χρησιμοποιηθούν κατά την εισαγωγή του συστήματος συντεταγμένων κορυφής για την κατασκευή του σχήματος στο οποίο περιλαμβάνεται. Οι αλλαγές κατάστασης πραγματοποιούνται χρησιμοποιώντας εντολές, οι οποίες εκδίδονται ως κλήσεις συναρτήσεων.

ΑΡΧΙΚΟΠΟΙΗΣΗ ΤΗΣ ΒΙΒΛΙΟΘΗΚΗΣ OpenGL ΣΕ C++

Πρώτα απ 'όλα, πρέπει να συμπεριλάβετε τα αρχεία κεφαλίδας:

#συμπεριλαμβάνω

#συμπεριλαμβάνω

#συμπεριλαμβάνω

· Τα gl.h και glu.h περιέχουν πρωτότυπα των κύριων λειτουργιών OpenGL που ορίζονται στα opengl32.dll και glu32.dll.

· Το glaux.h περιέχει βοηθητικές λειτουργίες (glaux.dll).

Αφού συνδέσετε τα αρχεία κεφαλίδας, πρέπει να ορίσετε τη μορφή pixel. Για το σκοπό αυτό χρησιμοποιείται η ακόλουθη συνάρτηση:

BOOL bSetupPixelFormat (HDC hdc)

PIXELFORMATDESCRIPTOR pfd, *ppfd;

int μορφή pixel;

ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);

ppfd->nΈκδοση = 1;

ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

ppfd->dwLayerMask = PFD_MAIN_PLANE;

ppfd->iPixelType = PFD_TYPE_RGBA;

ppfd->cColorBits = 16;

ppfd->cDepthBits = 16;

ppfd->cAccumBits = 0;

ppfd->cStencilBits = 0;

if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)

MessageBox(NULL, "ChoosePixelFormat απέτυχε", "Σφάλμα", MB_OK);

εάν (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)

MessageBox(NULL, "SetPixelFormat απέτυχε", "Σφάλμα", MB_OK);

Πρέπει να ειπωθεί η δομή του PIXELFORMATDESCRIPTOR.

cColorBits - βάθος χρώματος

cDepthBits - μέγεθος buffer βάθους (Z-Buffer)

cStencilBits - μέγεθος buffer στένσιλ (δεν το χρησιμοποιούμε ακόμα)

iPixelType - μορφή προδιαγραφής χρώματος. Μπορεί να λάβει τις τιμές PFD_TYPE_RGBA (το χρώμα υποδεικνύεται από τέσσερις παραμέτρους RGBA - κόκκινο, πράσινο, μπλε και άλφα) και PFD_TYPE_COLORINDEX (το χρώμα υποδεικνύεται από ένα ευρετήριο στην παλέτα).

Η συνάρτηση ChoosePixelFormat() επιλέγει μια μορφή pixel και επιστρέφει τη λαβή της και η SetPixelFormat() την ορίζει στο περιβάλλον της συσκευής (dc).

Αφού οριστεί η μορφή pixel στο περιβάλλον της συσκευής, πρέπει να δημιουργήσετε ένα περιβάλλον αναπαραγωγής (Πλαίσιο απόδοσης) για αυτό, οι ακόλουθες λειτουργίες ορίζονται στο OpenGL:

HGLRC wglCreateContext(HDC hdc);

BOOL wglMakeCurrent(HDC hdc, HGLRC hglrc);

Στη δήλωση κλάσης φόρμας, στην ιδιωτική περιοχή, πρέπει να προσθέσετε τα εξής:

ghRC - δείκτης στο περιβάλλον απόδοσης (Πλαίσιο απόδοσης)

Το ghDC είναι μια λαβή συσκευής (για εμάς είναι απλώς ένας δείκτης σε ένα παράθυρο)

Η διαδικασία της κλήρωσης θα είναι υπεύθυνη για την κλήρωση.

void __fastcall TForm1::FormCreate(TObject *Sender)

ghDC = GetDC(Handle);

if (!bSetupPixelFormat(ghDC))

ghRC = wglCreateContext(ghDC);

wglMakeCurrent(ghDC, ghRC);

glClearColor(0,0, 0,0, 0,0, 0,0);

FormResize(Αποστολέας);

glEnable(GL_COLOR_MATERIAL);

glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

float p=(3,3,3,1),

glLightfv(GL_LIGHT0,GL_POSITION,p);

glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d);

glViewport(0, 0, Πλάτος, Ύψος);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-5.5, -5.5, 2.12);

gluLookAt(0,0,5, 0,0,0, 0,1,0);

glMatrixMode(GL_MODELVIEW);

Η glClearColor() ορίζει το χρώμα που θα γεμίσει την οθόνη κατά την εκκαθάριση. Αυτή η διαδικασία έχει 4 παραμέτρους, οι οποίες αντιστοιχούν σε RGBA. Αντίθετα, μπορείτε να γράψετε glClearIndex(0.0) . Αυτή η διαδικασία ορίζει τον χρωματικό δείκτη στην παλέτα.

Η glViewport() ορίζει την περιοχή εξόδου - την περιοχή στην οποία το OpenGL θα εξάγει την εικόνα.

Η glMatrixMode() ορίζει τη λειτουργία του πίνακα μετασχηματισμού προβολής.

Η glLoadIdentity() αντικαθιστά την τρέχουσα μήτρα μετασχηματισμού προβολής με μια ταυτότητα.

Η glOrtho() ορίζει την ορθογώνια (ορθογώνια) λειτουργία προβολής. Αυτό σημαίνει ότι η εικόνα θα σχεδιαστεί όπως στην ισομετρία. 6 παράμετροι του τύπου GLdouble (ή απλά διπλό): αριστερά, δεξιά, κάτω, πάνω, κοντά, μακριά ορίζουν τις συντεταγμένες των επιπέδων αποκοπής αριστερά, δεξιά, κάτω, πάνω, κοντά και μακριά, αντίστοιχα, δηλ. οτιδήποτε είναι εκτός αυτών των ορίων δεν θα κληρωθεί. Στην πραγματικότητα, αυτή η διαδικασία απλώς ορίζει την κλίμακα των αξόνων συντεταγμένων. Για να ορίσετε την προοπτική προβολή, χρησιμοποιούνται οι διαδικασίες glFrustum() και gluPerspective().

Η gluLookAt() ορίζει τις παραμέτρους της κάμερας: οι τρεις πρώτες είναι οι συντεταγμένες της, το δεύτερο είναι το διάνυσμα κατεύθυνσης, το τρίτο είναι η κατεύθυνση του άξονα Υ.

Στο OpenGL, τα πάντα ενεργοποιούνται και απενεργοποιούνται (ενεργοποιούνται και απενεργοποιούνται) από τις διαδικασίες glEnable() και glDisable().

Η glLightfv() ορίζει τις ιδιότητες των "λαμπών": τη θέση και την κατεύθυνση του φωτός.

Αφού ολοκληρώσετε την εργασία με το OpenGL, πρέπει να το απελευθερώσετε πολυάσχολους πόρους: Απελευθερώστε το περιβάλλον καλώντας το wglMakeCurrent με παράμετρο μηδέν για το αναγνωριστικό περιβάλλοντος OpenGL και καταστρέψτε αυτό το περιβάλλον με το wglDeleteContext. Επιπλέον, πρέπει να αφαιρέσετε τη λαβή ghDC. Δεδομένου ότι η εργασία με το OpenGL συνήθως τελειώνει με την έξοδο της εφαρμογής, ο αντίστοιχος κώδικας πρέπει να τοποθετηθεί στο FormClose:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

wglMakeCurrent(ghDC,0);

wglDeleteContext(ghRC);

ReleaseDC(Handle, ghDC);

ΣΥΝΑΨΗ

Κατά τη διάρκεια της πρακτικής μου από 5 Ιουλίου έως 31 Ιουλίου 2011 στο ZAO Transas, Aviation Division στο τμήμα προγραμματισμού, εξοικειώθηκα με τις εργασίες του τμήματος προγραμματισμού. Γνώρισα τον σχεδιασμό και τη λειτουργία πολύπλοκων προσομοιωτών πτήσης που αναπτύχθηκαν στην JSC Transas. Έμαθα για ένα σύστημα οπτικοποίησης τοπίων και διαφόρων αντικειμένων που ονομάζεται Aurora. Απέκτησα τις αρχικές πρακτικές δεξιότητες και ικανότητες που απαιτούνται για την ανάπτυξη εφαρμογών και λογισμικού χρησιμοποιώντας μια σύγχρονη γλώσσα προγραμματισμού υψηλού επιπέδου και βιβλιοθήκη γραφικών.

Η υποβολή της καλής σας δουλειάς στη βάση γνώσεων είναι εύκολη. Χρησιμοποιήστε την παρακάτω φόρμα

επιτυχίαστον ιστότοπο">

Φοιτητές, μεταπτυχιακοί φοιτητές, νέοι επιστήμονες που χρησιμοποιούν τη βάση γνώσεων στις σπουδές και την εργασία τους θα σας είναι πολύ ευγνώμονες.

Δημοσιεύτηκε στις http://www.allbest.ru/

Το OpenGL είναι μια διεπαφή λογισμικού με το υλικό γραφικών. Αυτή η διεπαφή αποτελείται από περίπου 250 ατομικές ομάδες(περίπου 200 εντολές στο ίδιο το OpenGL και άλλες 50 στη βιβλιοθήκη του βοηθητικού προγράμματος) που χρησιμοποιούνται για τον καθορισμό των αντικειμένων και των λειτουργιών που πρέπει να εκτελεστούν για να επιτευχθεί μια διαδραστική εφαρμογή τρισδιάστατων γραφικών. γραφική διεπαφή προγραμματισμού opengl

Η βιβλιοθήκη OpenGL έχει σχεδιαστεί ως μια γενικευμένη, ανεξάρτητη διεπαφή που μπορεί να εφαρμοστεί σε μια ποικιλία υλικού. Για το λόγο αυτό, το ίδιο το OpenGL δεν περιλαμβάνει λειτουργίες για τη δημιουργία παραθύρων ή για τη λήψη εισαγωγή χρήστη; Για αυτές τις λειτουργίες πρέπει να χρησιμοποιήσετε τα εργαλεία του λειτουργικού συστήματος στο οποίο εργάζεστε. Για τους ίδιους λόγους, το OpenGL δεν διαθέτει λειτουργίες υψηλού επιπέδου για την περιγραφή μοντέλων τρισδιάστατων αντικειμένων. Τέτοιες εντολές θα σας επιτρέψουν να περιγράψετε σχετικά πολύπλοκα σχήματα, όπως αυτοκίνητα, μέρη ανθρώπινου σώματος ή μόρια. Όταν χρησιμοποιείτε τη βιβλιοθήκη OpenGL, πρέπει να δημιουργήσετε τα απαραίτητα μοντέλα χρησιμοποιώντας μικρό σετγεωμετρικά πρωτόγονα - σημεία, γραμμές και πολύγωνα (πολύγωνα).

Ωστόσο, μια βιβλιοθήκη που παρέχει τις περιγραφόμενες δυνατότητες μπορεί να κατασκευαστεί πάνω από το OpenGL. Η OpenGL Utility Library (GLU) παρέχει πολλά εργαλεία μοντελοποίησης, όπως τετραγωνικές επιφάνειες, καμπύλες και επιφάνειες NURBS. Το GLU είναι ένα τυπικό μέρος οποιασδήποτε εφαρμογής OpenGL. Υπάρχουν επίσης βιβλιοθήκες υψηλότερου επιπέδου, όπως το Fahrenheit Scene Graph (FSG), οι οποίες κατασκευάζονται με χρήση OpenGL και διανέμονται ξεχωριστά για πολλές από τις υλοποιήσεις του.

Η ακόλουθη λίστα περιγράφει εν συντομία τις βασικές λειτουργίες γραφικών που εκτελεί το OpenGL για την εμφάνιση εικόνων στην οθόνη.

1. Κατασκευάζει σχήματα από γεωμετρικά πρωτόγονα, δημιουργώντας μια μαθηματική περιγραφή αντικειμένων (τα πρωτόγονα στο OpenGL είναι σημεία, γραμμές, πολύγωνα, bitmaps και εικόνες).

2. Τοποθετεί αντικείμενα σε τρισδιάστατο χώρο και επιλέγει ένα σημείο παρατήρησης για να προβάλει τη σύνθεση που προκύπτει.

3. Υπολογίζει τα χρώματα για όλα τα αντικείμενα. Τα χρώματα μπορούν να καθοριστούν από την εφαρμογή, που προέρχονται από συνθήκες φωτισμού, που υπολογίζονται χρησιμοποιώντας υφές που εφαρμόζονται σε αντικείμενα ή οποιονδήποτε συνδυασμό αυτών των παραγόντων.

4. Μετατρέπει μια μαθηματική περιγραφή αντικειμένων και τις σχετικές πληροφορίες χρώματος σε pixel στην οθόνη. Αυτή η διαδικασία ονομάζεται ραστεροποίηση (ή ραστεροποίηση).

Κατά τη διάρκεια όλων αυτών των σταδίων, το OpenGL μπορεί να εκτελέσει άλλες λειτουργίες, όπως αφαίρεση τμημάτων αντικειμένων που είναι κρυμμένα από άλλα αντικείμενα. Επιπλέον, μετά την ραστεροποίηση της σκηνής αλλά προτού αποδοθεί στην οθόνη, μπορείτε να εκτελέσετε ορισμένες λειτουργίες στα δεδομένα pixel εάν είναι απαραίτητο.

Γενική διαδικασία για την εργασία με Βιβλιοθήκη OpenGlείναι:

1. Αρχικοποιήστε το παράθυρο (λάβετε την περιοχή για την εμφάνιση της εικόνας)

2. Εγκαταστήστε την κάμερα

3. Ανάψτε το φως (αν χρειάζεται)

4. Ξεκινήστε να σχεδιάζετε πρωτόγονα (σημεία, γραμμές, πολύγωνα) στον βρόχο, καθαρίζοντας πρώτα το παράθυρο από το προηγούμενο σχέδιο.

Αρχικοποίηση του παραθύρου.

Εάν εργάζεστε σε Visual C++, τότε το παράθυρο δημιουργείται χρησιμοποιώντας τις συναρτήσεις

auxInitDisplayMode

Ο κύριος βρόχος σχεδίασης πλαισίου δημιουργείται στη συνάρτηση Draw και καταχωρείται χρησιμοποιώντας τη συνάρτηση

auxMainLoop(Draw);

static void CALLBACK Draw(void) // δημιουργήθηκε από χρήστη

// θέση του παραθύρου OpenGL στην οθόνη

auxInitPosition(100, 100, windowW, windowH);

// ρύθμιση βασικών παραμέτρων για τη λειτουργία OpenGL

// λειτουργία χρώματος RGB | ενεργοποίηση του buffer Z για ταξινόμηση βάθους

// |Διπλή προσωρινή αποθήκευση

auxInitDisplayMode(AUX_RGB | AUX_DEPTH | AUX_DOUBLE);

// αρχικοποιήστε το παράθυρο OpenGL με τίτλο

if(auxInitWindow("Παράδειγμα1") ==GL_FALSE) auxQuit();

// καταχωρήστε μια συνάρτηση που καλείται κατά την επανασχεδίαση

// και ξεκινήστε τον βρόχο συμβάντος

// Draw() - συνάρτηση χρήστη

auxMainLoop(Draw);

Εάν εργάζεστε στο Borland C++ Builder, τότε για να αρχικοποιήσετε το παράθυρο, πρέπει να λάβετε ένα Handle (ένα μοναδικό αναγνωριστικό Windows παράθυρα) του παραθύρου στο οποίο θα σχεδιάσετε. Το Handle είναι διαθέσιμο για όλα τα παράθυρα εφαρμογών ανώτατου επιπέδου και για τα περισσότερα θυγατρικά παράθυρα. Στα παραδείγματά μας θα σχεδιάσουμε ένα θυγατρικό παράθυρο StaticText.

Στη συνέχεια πρέπει να δημιουργήσουμε ένα πλαίσιο σχεδίασης (πλαίσιο συσκευής) και να ορίσουμε τη μορφή του. Για να γίνει αυτό, αρχικοποιείται η δομή PIXELFORMATDESCRIPTOR (μορφή περιγραφής pixel). Αυτό το πλαίσιο περιγράφει εάν χρειαζόμαστε υποστήριξη buffer βάθους, διπλή αποθήκευσηκαι τα λοιπά.).

Στη συνέχεια, ακολουθήστε τις λειτουργίες:

ΕπιλέξτεPixelFormat

Δημιουργείται ένα πλαίσιο σχεδίασης OpenGL:

wglCreateContext(hdc);

Και στη συνέχεια συνδέονται τα περιβάλλοντα OpenGL και Windows:

wglMakeCurrent(hdc, hrc)

void __fastcall TFormMain::FormCreate(TObject *Sender)

// πάρτε το HANDLE του παραθύρου StaticText

στατικό HWND Handle=a->Handle;

// δημιουργήστε μια λαβή θέσης σχεδίασης για το παράθυρο StaticText

hdc = GetDC(Handle);

// ορίστε τις κατάλληλες ρυθμίσεις περιβάλλοντος συσκευής

PIXELFORMATDESCRIPTOR pfd = (

sizeof(PIXELFORMATDESCRIPTOR),

PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,

// επιλέξτε την κατάλληλη μορφή

PixelFormat = ChoosePixelFormat(hdc, &pfd);

SetPixelFormat(hdc, PixelFormat, &pfd);

// δημιουργήστε ένα περιβάλλον συσκευής για το OpenGL

// χρησιμοποιώντας τη λαβή θέσης σχεδίασης

hrc = wglCreateContext(hdc);

ShowMessage(":-)~ hrc == NULL");

if(wglMakeCurrent(hdc, hrc) == false)

ShowMessage ("Δεν ήταν δυνατή η δημιουργία ρεύματος");

Εγκατάσταση κάμερας

Από προεπιλογή, η κάμερα είναι τοποθετημένη στην αρχή (0, 0, 0), στραμμένη κατά μήκος της κατεύθυνσης του αρνητικού άξονα z και το διάνυσμα κατεύθυνσης προς τα επάνω είναι (0, 1, 0).

Για να εγκαταστήσετε την κάμερα, είναι βολικό να χρησιμοποιήσετε τη λειτουργία gluLookAt(). Αν και έχει 9 παραμέτρους, είναι εύκολα κατανοητές. Χωρίζονται σε τρεις παραμέτρους, αντίστοιχα για τρία σημεία: Eye (Eye), Center, Up.

Το μάτι καθορίζει το σημείο από το οποίο κοιτάμε, το Κέντρο καθορίζει πού κοιτάμε και το διάνυσμα της κορυφής καθορίζει πού πρέπει να έχουμε την κορυφή (φανταστείτε έναν πιλότο σε ένα αεροπλάνο να πετάει με το κεφάλι κάτω). Είναι βολικό να περικλείονται διανύσματα σε κλάσεις με παρακαμφθείσες πράξεις.

gluLookAt(e.x,e.y,e.z, c.x,c.y,c.z, u.x,u.y,u.z);

Ο κύριος βρόχος περιλαμβάνει τα ακόλουθα βήματα σχεδίασης πλαισίου:

1. Διαγραφή buffer από τη σχεδίαση της προηγούμενης εικόνας

2. Λειτουργίες σχεδίασης πρωτόγονων

3. Λειτουργίες για την ολοκλήρωση της σχεδίασης και την αναμονή απάντησης από την κάρτα βίντεο

4. Λειτουργίες για την αντιγραφή εικόνων από τη μνήμη στην οθόνη

Ο κύριος βρόχος δεν περιλαμβάνει χειρισμό συμβάντων, όπως πάτημα πλήκτρων και αλλαγή μεγέθους παραθύρου. Για την επεξεργασία συμβάντων, δημιουργούνται ξεχωριστές λειτουργίες και επισυνάπτονται επιπλέον στην εφαρμογή.

Εάν εργάζεστε σε Visual C, τότε αυτό γίνεται χρησιμοποιώντας συναρτήσεις των οποίων τα πρωτότυπα περιγράφονται στο αρχείο glaux.h:

auxReshapeFunc()

Εάν εργάζεστε στο Borland C, τότε η επεξεργασία συμβάντων πραγματοποιείται με παραδοσιακό τρόπο για όσους δημιουργούνται από αυτό το περιβάλλον λογισμικού: απλά επιλέγετε ένα στοιχείο (για παράδειγμα, Button1), δημιουργείτε έναν χειριστή (για παράδειγμα, ένα πάτημα πλήκτρων) και περιγράψτε το σώμα της συνάρτησης.

Σχεδιάζοντας πρωτόγονα

Η σχεδίαση πρωτόγονων γίνεται με τις εντολές glBegin() και glEnd().

Η σταθερά που μεταβιβάζεται στη συνάρτηση glBegin καθορίζει τον τύπο του αρχέγονου που θα σχεδιαστεί

Οι συντεταγμένες των σημείων καθορίζονται από ένα τρισδιάστατο χωρικό διάνυσμα. Τα χρώματα καθορίζονται από τρεις (RGB) ή τέσσερις (RGBA) παραμέτρους. Στο παράδειγμά μας, η τιμή του στοιχείου χρώματος κάθε χρώματος μπορεί να ποικίλει από 0 έως 1. Εάν έχετε συνηθίσει στην τιμή του στοιχείου χρώματος από 0 έως 255 (MsPaint), τότε χρησιμοποιήστε το glColor3ub(255,0,0 ) λειτουργία. Το επίθημα ub σημαίνει ανυπόγραφο byte.

Φωτισμός μέσα Γραφικά υπολογιστώνέχει 3 εξαρτήματα

Η ακτινοβολία υποβάθρου είναι φως που κατανέμεται τόσο από το περιβάλλον (αντικείμενα, τοίχοι κ.λπ.) που δεν μπορεί να προσδιοριστεί η κατεύθυνσή του - φαίνεται να προέρχεται από παντού. Λυχνία φως ημέραςέχει ένα μεγάλο στοιχείο φόντου, επειδή το μεγαλύτερο μέρος του φωτός που φτάνει στο μάτι σας αντανακλάται πρώτα από πολλές επιφάνειες. Ένα φως του δρόμου έχει μια μικρή συνιστώσα φόντου: το μεγαλύτερο μέρος του φωτός του έρχεται προς μία κατεύθυνση, και εφόσον είναι σε εξωτερικό χώρο, πολύ λίγο φως χτυπά το μάτι σας αφού αναπηδήσει από άλλα αντικείμενα. Όταν το φως του φόντου χτυπά μια επιφάνεια, κατανέμεται εξίσου προς όλες τις κατευθύνσεις.

Η διάχυτη συνιστώσα είναι το φως που προέρχεται από μία κατεύθυνση, επομένως φαίνεται πιο φωτεινό εάν προσκρούσει σε μια επιφάνεια σε ορθή γωνία και εμφανίζεται αμυδρό εάν την ακουμπήσει μόνο για λίγο. Ωστόσο, όταν προσκρούει σε μια επιφάνεια, κατανέμεται εξίσου προς όλες τις κατευθύνσεις, που σημαίνει ότι η φωτεινότητά του είναι η ίδια ανεξάρτητα από την πλευρά που κοιτάξετε την επιφάνεια. Είναι πιθανό ότι οποιοδήποτε φως προέρχεται από μια συγκεκριμένη κατεύθυνση ή θέση έχει μια διάχυτη συνιστώσα.

Το κατοπτρικό φως προέρχεται από μια συγκεκριμένη κατεύθυνση και ανακλάται από μια επιφάνεια σε μια συγκεκριμένη κατεύθυνση. Όταν αντανακλάται μια καλά εστιασμένη ακτίνα λέιζερΈνας υψηλής ποιότητας καθρέφτης παράγει σχεδόν 100 τοις εκατό κατοπτρική ανάκλαση. Το γυαλιστερό μέταλλο ή πλαστικό έχει ένα υψηλό κατοπτρικό συστατικό, αλλά ένα κομμάτι χαλί ή ένα βελούδινο παιχνίδι δεν έχει. Μπορείτε να σκεφτείτε την κερδοσκοπία ως το πόσο γυαλιστερό εμφανίζεται ένα υλικό.

Εκτός από τα χρώματα του φόντου, τα διάχυτα και τα κατοπτρικά χρώματα, τα υλικά μπορούν επίσης να έχουν ένα εκπεμπόμενο χρώμα που προσομοιώνει το φως που προέρχεται από το ίδιο το αντικείμενο. Στο μοντέλο φωτισμού OpenGL, το εξερχόμενο επιφανειακό φως προσθέτει ένταση σε ένα αντικείμενο, αλλά δεν επηρεάζεται από οποιεσδήποτε πηγές φωτός και δεν παράγει επιπλέον φως στη σκηνή στο σύνολό της.

Αν και η πηγή φωτός εκπέμπει μια ενιαία κατανομή συχνότητας, τα στοιχεία φόντου, διάχυσης και κατοπτρισμού μπορεί να είναι διαφορετικά. Για παράδειγμα, αν το δωμάτιό σας έχει κόκκινους τοίχους και λευκό φως, τότε αυτό το φως, που αντανακλάται από τους τοίχους, θα είναι περισσότερο κόκκινο παρά λευκό (παρά το γεγονός ότι το φως που πέφτει στον τοίχο είναι λευκό). Το OpenGL σάς επιτρέπει να ορίσετε τις τιμές του κόκκινου, του πράσινου και του μπλε ανεξάρτητα για κάθε φωτεινό στοιχείο.

Οι εντολές που χρησιμοποιούνται για τη ρύθμιση του υλικού είναι:

// περιπτώσεις για φως και υλικό

// Ενεργοποίηση πηγής φωτός με αριθμό μηδέν

glEnable(GL_LIGHT0);

// ορίστε τη θέση και τα στοιχεία χρώματος της πηγής φωτός

glLightfv(GL_LIGHT0, GL_POSITION, LL.pos);

glLightfv(GL_LIGHT0, GL_AMBIENT, LL.amb);

glLightfv(GL_LIGHT0, GL_DIFFUSE, LL.dif);

glLightfv(GL_LIGHT0, GL_SPECULAR, LL.spec);

// ενεργοποίηση λειτουργίας σκίασης/φωτισμού

glEnable(GL_LIGHTING);

// ορίστε τις παραμέτρους του υλικού του αντικειμένου

// στα μπροστινά πρόσωπα --- GL_FRONT για τα πίσω GL_BACK και για τα δύο - GL_FRONT_AND_BACK

// δεύτερη παράμετρος - ποιο συστατικό του υλικού

// πιθανά GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, GL_SHININESS

// αντιστοίχως ΚΑΤΑΝΟΜΕΝΑ, ΑΝΑΠΤΥΛΑΣΜΕΝΟ, ΚΑΘΡΕΦΤΗΣ, ΑΥΤΟΕΚΠΟΜΠΗ, κατοπτρική ένδειξη έκλαμψης

glMaterialfv(GL_FRONT,GL_AMBIENT,MM.amb);

glMaterialfv(GL_FRONT,GL_DIFFUSE,MM.dif);

glMaterialfv(GL_FRONT,GL_SPECULAR,MM.spec);

glMaterialf(GL_FRONT,GL_SHININESS,MM.pos);

glNormal3f(0,0,1);

glBegin(GL_QUADS);

για(i=-10; i<20;i++)

for(j=-10;j<20;j++)

glVertex3f(i,j,0);

glVertex3f(i+1,j,0);

glVertex3f(i+1,j+1,0);

glVertex3f(i,j+1,0);

Σύναψη

Το σύστημα OpenGL είναι μια ευέλικτη διαδικαστική διεπαφή που επιτρέπει στον προγραμματιστή να αναπτύξει διάφορες εφαρμογές χρησιμοποιώντας τρισδιάστατα γραφικά. Το πρότυπο δεν περιέχει κανονισμούς για την περιγραφή της δομής των γραφικών αντικειμένων, η κύρια προσοχή δίνεται στην περιγραφή της διαδικασίας οπτικοποίησης τους. Χάρη σε αυτό, η απόδοση του υπάρχοντος εξοπλισμού αυξάνεται: από απλές συσκευές που χρησιμοποιούν μόνο buffer πλαισίων έως σύγχρονα συστήματα γραφικών ικανά να αποδίδουν τρισδιάστατα αντικείμενα σε επίπεδο υλικού. Το OpenGL παρέχει μόνο δυνατότητες για έξοδο εικόνας, η οργάνωση της εισαγωγής επαφίεται εξ ολοκλήρου στο συγκεκριμένο σύστημα παραθύρων, το οποίο επιτρέπει την πρόσθετη ανεξαρτησία του υλικού των εφαρμογών.

Λόγω της ελάχιστης χρήσης πολύπλοκων δομών για την αναπαράσταση τρισδιάστατων αντικειμένων, είναι δυνατό να χρησιμοποιηθεί το OpenGL ως βάση για τη δημιουργία βιβλιοθηκών για τη διαχείριση δομημένων αντικειμένων. Παραδείγματα τέτοιων βιβλιοθηκών περιλαμβάνουν αντικειμενοστραφή πακέτα εργαλείων που χρησιμοποιούνται για την απεικόνιση και τη μοντελοποίηση πολύπλοκων γραφικών δομών

Δημοσιεύτηκε στο Allbest.ru

Παρόμοια έγγραφα

    Κωδικός OpenGL. Σύνταξη εντολής OpenGL. Το OpenGL ως κρατική μηχανή. Σωλήνας απόδοσης OpenGL. Βιβλιοθήκες που σχετίζονται με το OpenGL. Βιβλιοθήκη OpenGL. Συμπεριλαμβανόμενα αρχεία. GLUT, μια εργαλειοθήκη βοηθητικών προγραμμάτων βιβλιοθήκης OpenGL.

    εργασία μαθήματος, προστέθηκε 06/01/2004

    Προγραμματισμός εφαρμογής με χρήση της βιβλιοθήκης OpenGL και συναρτήσεων σχεδίασης γεωμετρικών αντικειμένων. Ανάπτυξη διαδικασίας απεικόνισης τρισδιάστατης σκηνής και διεπαφής χρήστη. Λογική δομή και λειτουργική αποσύνθεση του έργου.

    εργασία μαθήματος, προστέθηκε 23/06/2011

    Εξοικείωση με τη διεπαφή, τα κύρια χαρακτηριστικά και τα πλεονεκτήματα της χρήσης του προγράμματος OpenGL - μια δημοφιλής βιβλιοθήκη για εργασία με γραφικά 2D και 3D. Εξέταση του σκοπού, των βασικών στοιχείων και των κανόνων αρχικοποίησης της μηχανής λογισμικού DirectX.

    παρουσίαση, προστέθηκε 14/08/2013

    Δημιουργία προγράμματος σε C++ χρησιμοποιώντας βιβλιοθήκες γραφικών OpenGL στο Microsoft Visual Studio. Κατασκευή δυναμικής εικόνας τρισδιάστατου μοντέλου του αντικειμένου «Oil platform». Λογική δομή και λειτουργική αποσύνθεση του έργου.

    εργασία μαθήματος, προστέθηκε 23/06/2011

    Η ουσία του προγραμματισμού χρησιμοποιώντας τη βιβλιοθήκη OpenGL, ο σκοπός, η αρχιτεκτονική, τα πλεονεκτήματα και οι βασικές δυνατότητες. Ανάπτυξη εφαρμογής για την κατασκευή δυναμικής εικόνας τρισδιάστατου μοντέλου αντικειμένου Υπολογιστή, εγχειρίδιο χρήσης.

    εργασία μαθήματος, προστέθηκε 22/06/2011

    Εργασία με χρώμα χρησιμοποιώντας τη βιβλιοθήκη γραφικών OpenGL. Ένα πρόγραμμα που εμφανίζει ένα τετράγωνο με μεταβαλλόμενο χρώμα ανάλογα με τις αλλαγές στις διαβαθμίσεις (R, G, B), ένα τρίγωνο, οι κορυφές του οποίου έχουν διαφορετικά χρώματα, μια ορθογώνια λωρίδα σε μορφή φάσματος.

    δοκιμή, προστέθηκε στις 21/01/2011

    Σκοπός και πρότυπα υλοποίησης του OpenGL για Windows, σειρά σύνδεσης της βιβλιοθήκης γραφικών. Βασικές συναρτήσεις και σύνταξη εντολών. Σχεδίαση πρωτόγονων, ειδών και μετασχηματισμών συγγενών. Μοντελοποίηση δισδιάστατων γραφικών αντικειμένων και κινούμενων εικόνων.

    εργαστηριακές εργασίες, προστέθηκε 07/04/2009

    Βασικά στοιχεία προγραμματισμού με χρήση της βιβλιοθήκης OpenGL. Εφαρμογή για την κατασκευή δυναμικής εικόνας μοντέλου του αντικειμένου Bathyscaphe: ανάπτυξη διαδικασίας οπτικοποίησης τρισδιάστατου διαγράμματος, διεπαφής χρήστη και υποσυστήματος διαχείρισης συμβάντων.

    εργασία μαθήματος, προστέθηκε 26/06/2011

    Κατανοήστε αυτή τη σφαίρα των γραφικών vikoristannya trivimirnoy. Περιγραφή των δυνατοτήτων της βιβλιοθήκης OpenGL. Μια λεπτομερής περιγραφή της διεπαφής προγραμματισμού Borland C++, μια λίστα προγραμμάτων που καταδεικνύουν τις δυνατότητές της. Έργο Rozrakhunok vitrat na vikonannya.

    διατριβή, προστέθηκε 24/06/2015

    Ανάπτυξη συστατικού για μαθηματικούς υπολογισμούς (πράξεις σε πίνακες) με χρήση τεχνολογίας OpenGL (πρόσθεση, αφαίρεση, πολλαπλασιασμός, μεταφορά, ορίζουσα, αντίστροφος πίνακας). Βασικές δεξιότητες εργασίας με τεχνολογία στο περιβάλλον .Net.



Συνιστούμε να διαβάσετε

Κορυφή