Dieses Skript wurde im Rahmen des Moduls „Seminar“ für den technischen Informatik - Studiengang „Computer Engineering „ auf der Hochschule Furtwangen University erstellt und enthält eine Einführung in die openSource API „OpenGL“ (Open Graphics Library).
Es werden überwiegend grundlegende Themen erklärt und teilweise fortgeschrittene Themen kurz aufgeführt. Diese werden anhand geeigneter Codebeispiele und knapp 30 Bildern erläutert. Hierbei wird zugunsten der Modularität und Übersicht auch auf Hilfsmittel wie das OpenGL Utility Toolkit „GLUT“, die OpenGL Utility Library (GLU), sowie für das Laden realistischer Texturen auf SDL zurückgegriffen.
Auf sämtliche Details, OpenGL-Befehle oder Konzepte kann hier in diesem Rahmen leider nicht eingegangen werden. Eher handelt es sich hierbei um ein praxisnahes und beispielorientiertes Einführungswerk, welches mit einer passenden Zweitlektüre optimal für den Einstieg in die Materie „OpenGL“ geeignet ist.
Bei den „Codesnippets“ handelt es sich um ein interaktives 3D – Programm welches unser Sonnensystem und deren Planeten versucht realistisch darzustellen. Es könnte somit der Lehre sowie Jedermann dienen, der mehr über unser Universum bzw. Sonnensystem erfahren möchte.
Entwickelt wurde dieses Projekt unter WindowsXP mit VS 2005, C++, OpenGL und SDL.
Welche Themen enthält dieses Skript
Dieses Skript enthält 8 Kapitel
• Kapitel 1 „Was ist OpenGL“ erklärt und gibt einen groben Überblick was OpenGL alles kann. Ausserdem werden essentielle Programmierdetails für die folgenden Kapitel erläutert.
• Kapitel 2 „Geometrische Objekte zeichnen“ erklärt Schritte um ein 3-dimensionales Objekt zu beschreiben und zu zeichnen.
• Kapitel 3 „Sichten“ beschreibt wie 3-dimensionale Objekte transformiert werden bevor sie auf dem 2-dimensionalen Bildschirm angezeigt werden.
• Kapitel 4 „Farben“ beschreibt wie man bei OpenGL Farbe ins Spiel bringt.
• Kapitel 5 „Licht“ beschreibt wie man Lichtverhältnisse geeignet einsetzen kann.
• Kapitel 6 „Laden von Texturen“ beschreibt in diesem Rahmen wie man ein – und zweidimensionale Texturen lädt.
• Kapitel 7 „Nebel“ beschreibt eine Technik um eine noch realistischere Umgebung zu schaffen.
• Kapitel 8 „Framebuffer“ gibt einen groben Überblick über die möglichen OpenGL – Buffer.
Inhaltsverzeichnis
KAPITEL 1 - WAS 1ST OPENGL ?
OpenGL - Syntax
OPENGL als ,,State MACHINE“
ZUS ATZLICHE OPENGL BIBLIOTHEKEN
Callback - funktionen
Animation
KAPITEL 2 - GEOMETRISCHE OBJEKTE ZEICHNEN
PUNKTE, LINIEN UND POLYGONE
Poly gondetails
KAPITEL 3 - SICHTEN
MATRIZEN IN OPENGL
VIEWING UND MODELING TRANSFORMATIONS
Modeling Transformations
Viewing Transformations
projection Transformations
MANIPULATION DER MATRIX STACKS
KAPITEL 4 - FARBEN
RGBA - MODUS
KAPITEL 5 - LICHT
NORMALENVEKTOREN
Ambient, diffuse, Specular und emissive light
KAPITEL 6 - LADEN VON TEXTUREN
KAPITEL 7 - NEBEL
KAPITEL 8 - FRAMEBUFFER
TIEFENPUFFER/ DEPTH BUFFER
TIEFENTEST
FRAGMENT
Stencil buffer /Schablonenpuffer
farbpuffer / Color buffer
DOPPELPUFFERUNG/ DOUBLE BUFFERING
LITERATURVERZEICHNIS
Vorwort
Dieses Skript wurde im Rahmen des Moduls „Seminar“ fur den technischen Informatik - Studiengang „Computer Engineering „ auf der Hochschule Furtwangen University erstellt und enthalt eine Einfuhrung in die openSource API „OpenGL“ (Open Graphics Library).
Es werden uberwiegend grundlegende Themen erklart und teilweise fortgeschrittene Themen kurz aufgefuhrt. Diese werden anhand geeigneter Codebeispiele und knapp 30 Bildern erlautert. Hierbei wird zugunsten der Modularitat und Ubersicht auch auf Hilfsmittel wie das OpenGL Utility Toolkit „GLUT“, die OpenGL Utility Library (GLU), sowie fur das Laden realistischer Texturen auf SDL zuruckgegriffen.
Auf samtliche Details, OpenGL-Befehle oder Konzepte kann hier in diesem Rahmen leider nicht eingegangen werden. Eher handelt es sich hierbei um ein praxisnahes und beispielorientiertes Einfuhrungswerk, welches mit einer passenden Zweitlekture optimal fur den Einstieg in die Materie „OpenGL“ geeignet ist.
Als Literaturquelle (und Bilderquelle) verwende ich den ,,OpenGL Programming Guide - 6th Edition“ alias „Redbook“ (1). Dieses Buch ist momentan ausschlieBlich in Englischer Sprache vorhanden (auch als kostenloses ebook (2) ). Nicht zuletzt aus diesem Grand kann dieses Werk deshalb als eine gute deutsche beispielorientierte Einfuhrung und komprimierte Version - auf die wesentlichen Grundlagen und Methoden beschrankt - angesehen werden. Als wertvolle Zusatzliteratur dient auch das „DelphiGL-Wiki“ (3).
Bei den „Codesnippets“ handelt es sich um eine von mir selbst entwickelte Softwareapplikation. Es geht um ein interaktives 3D - Programm welches unser Sonnensystem und deren Planeten versucht realistisch darzustellen. Es konnte somit der Lehre sowie Jedermann dienen, der mehr uber unser Universum bzw. Sonnensystem erfahren mochte.
Entwickelt wurde dieses Projekt unter WindowsXP mit VS 2005, C++, OpenGL und SDL.
Welche Themen enthalt dieses Skript
Dieses Skript enthalt 8 Kapitel
- Kapitel 1 ,,Was ist OpenGL“ erklart und gibt einen groben Uberblick was OpenGL alles kann. Ausserdem werden essentielle Programmierdetails fur die folgenden Kapitel erlautert.
- Kapitel 2 ,,Geometrische Objekte zeichnen“ erklart Schritte um ein 3-dimensionales Objekt zu beschreiben und zu zeichnen.
- Kapitel 3 „Sichten“ beschreibt wie 3-dimensionale Objekte transformiert werden bevor sie auf dem 2-dimensionalen Bildschirm angezeigt werden.
- Kapitel 4 „Farben“ beschreibt wie man bei OpenGL Farbe ins Spiel bringt.
- Kapitel 5 „Licht“ beschreibt wie man Lichtverhaltnisse geeignet einsetzen kann.
- Kapitel 6 ,,Laden von Texturen“ beschreibt in diesem Rahmen wie man ein - und zweidimensionale Texturen ladt.
- Kapitel 7 „Nebel“ beschreibt eine Technik um eine noch realistischere Umgebung zu schaffen.
- Kapitel 8 „Framebuffer“ gibt einen groben Uberblick uber die moglichen OpenGL - Buffer.
Welche Themen dieses Skript nicht behandelt
Auf weiterfuhrende, groBere Themen wie beispielsweise ,,Blending und Antialiasing^ ,,Tesselators & Quadrics“, „Evaluators and NURBS“ oder die ,,OpenGL - Shading Language“ wird teilweise nur grob oder gar nicht eingegangen.
Kapitel 1 - Was ist OpenGL ?
OpenGL ist eine Software - Schnittstelle zur Grafikhardware. Diese Schnittstelle besteht aus uber 700 unterschiedlichen Befehlen in der Version 2.1. Diese Befehle konnen allesamt verwendet werden um die notwendigen Objekte bzw. Operationen zu spezifizieren und um interaktive 3-dimensionale Programme zu erstellen.
OpenGL wurde als hardwareunabhangige Schnittstelle entworfen um auf vielen verschiedenen Hardware - Plattformen implementiert werden zu konnen. Um dies erreichen zu konnen werden dafur keinerlei „High-Level“-Befehle zur Verfugung gestellt um schon vorgefertigte 3D-Modelle zu erzeugen. Hiermit sind kompliziertere Objekte wie Autos, Teile des menschlichen Korpers, Flugzeuge oder Molekule gemeint. Mit OpenGL mussen die gewunschten Modelle mithilfe von kleinen geometrischen Primitiven gezeichnet werden. Hierzu gehoren Punkte, Linien und Polygone.
Eine oft gebrauchte Bibliothek, welche teilweise solche „Higher-Level“ Features wie z.B. „Quadrics“ oder „NURBS“ - Kurven und Oberflachen besitzt ist GLU - OpenGL Utility Library. GLU ist mittlerweile ein Standard Teilbereich jeder OpenGL - Implementierung.
Wir werden uns von nun an aber damit beschaftigen was OpenGL kann und weniger mit den Teilen die es nicht kann.
OpenGL - Syntax
OpenGL Befehle benutzen das Prafix „gl“ und einen weiteren GroBbuchstaben fur den darauffolgenden Befehlsnamen. (z.B. glColor3f( ... ) )
Ebenfalls hat OpenGL Konstanten mit „GL_“ gekennzeichnet. Man sieht, dass Konstanten ausschliesslich aus GroBbuchstaben bestehen und Underscores („_“) verwenden um Worter zu trennen. (z.B. GL_C OLOR_B UFFER_B IT)
Wie vielleicht auch schon bemerkt wurde besitzen manche Befehle eine Zahl mit Buchstaben (siehe oben) als Suffix. Diese Zahlen und Buchstaben konnen je nach Menge der Parameter und Typ der Parameter variieren (z.B. glColor3f( ... ) ):
Abbildung in dieser Leseprobe nicht enthalten
Bemerkung:
Einige Befehle enden auch mit dem Buchstaben „v“. Dies zeigt, dass der Befehl einen Pointer auf einen Vektor (Array) erwartet und nicht eine Serie von einzelnen Argumenten.
Beispiel:
Abbildung in dieser Leseprobe nicht enthalten
Dieses Beispiel dient an dieser Stelle als einfuhrendes Syntaxbeispiel und muss semantisch noch nicht verstanden werden.
AbschlieBend sei noch der Typ GLvoid aufgrund von Vollstandigkeit zu erwahnen.
OpenGL als ,, State Machine “
OpenGL ist als eine State Machine zu betrachten. Man setzt und bestimmt einen Zustand, der dann solange existiert bis man ihn wieder verandert. Beispielsweise ist der Farbzustand eine solche „State Variable^ Man setzt eine Farbe wie z.B. Rot und zeichnet danach verschiedene Objekte, die alle nun in rot erscheinen werden, da die Farbe zwischen dem Zeichnen der verschiedenen Objekte nicht mehr verandert oder deaktiviert wurde. Es gibt naturlich auch noch andere ,,State Variablen“ wie z.B. der Licht-Modus, Material-Eigenschaften, etc. Viele dieser ,,State Variablen“ werden mit dem OpenGL - Befehl „glEnable()“ aktiviert und mit „glDisable“ wieder deaktiviert.
Jede „State Variable“ bzw.jeder Modus hat einen Default-Wert, den man zu jedem Zeitpunkt auch vom System abfragen kann. Dafur gibt es spezielle Abfragebefehle. Typischerweise benutzt man dazu je nach Kontext einen der folgenden Befehle:
glGetBooleanv(), glGetDoublev(), glGetFloatv(), glGetIntegerv(), glGetPointerv()
oder glIsEnabled()
Einige State Variablen haben spezifischere Abfragebefehle wie z.B.: glGetLight*(), glGetError() oder glGetPolygonStipple()
Zusatzlich gibt es naturlich eine Moglichkeit die State Variable auf einem sogenannten „Attribute Stack“ (Attribut Stapel) zu speichern. Die Steuerung des Attribute Stacks wird mit folgenden Befehlen ermoglicht:
glPushAttrib() und glPushClientAttrib()
um etwas auf dem Attribute Stack zu speichern und glPopAttrib() und glPopClientAttrib()
um spater den Stack wieder „abzubauen“. Dies soll uns hier aber nur am Rande beschaftigen.
Zusatzliche OpenGL Bibliotheken
Es wird hier lediglich auf die zwei wichtigsten und am meisten verwendeten Bibliotheken eingegangen.
- Die OpenGL Utility Library (GLU) enthalt verschiedene Routinen die sogenannte „Low-Level“ Befehle von OpenGL verwenden um komplexe „Higher-Level“ Befehle zur Verfugung stellen zu konnen. Diese Bibliothek ist Teil einer jeden OpenGL Implementierung.
Da unsere Beispiele nicht explizit fur den Embedded Kontext entwickelt wurden (und es hier nicht auf evtl. performance Lacks“ ankommt) wird in diesem Skript ebenfalls auf GLU zuruckgegriffen.
GLU Befehle beginnen standardmaBig mit dem Prafix „glu“.
- Das OpenGL Utility Toolkit (GLUT) ist ein plattformunabhangiges Toolkit, geschrieben von Mark Kilgard um samtliche komplexen, platformspezifischen Befehle hinter weniger aufwandigeren plattformunabhangigen zu verstecken. AuBerdem ermoglicht es wie teilweise auch GLU komplexere Modelle mit nur einem Aufruf zu zeichnen. (Beispielsweise eine Kugel, ein Zylinder oder Wurfel) Es wird in den Beispielen ebenfalls dieses Toolkit verwendet um Zeichenfenster zu offnen oder um einfache Benutzereingaben zu verarbeiten (z.B. von der Tastatur oder Maus) , da hier sonst zu sehr auf Betriebssystemspezifische Eigenschaften eingegangen werden musste. Wenn Sie sich selbst auch dazu entscheiden sollten GLUT zu verwenden, beachten Sie bitte folgendes:
Wenn Sie glut.h inkludieren ist schon garantiert, dass der OpenGL Standard - Header „gl.h“ und der GLU-Header „glu.h“ inkludiert sind! glu.h und gl.h nochmals extra zu inkludieren ware also vollkommen redundant.
GLUT umfasst Routinen um folgende 3D Objekte zu zeichnen - sowohl aus Drahtmodell(Wired) als auch mit fester Oberflache(Solid):
- Kegel
- Wurfel
- Dodecahedron
- Icosahedron
- Octahedron
- Kugel
- Teekanne
- Tetrahedron
- Zylinder
Ein Wurfelaufruf konnte beispielsweise so aussehen: void glutWiredCube(...) oder void glutSolidCube(...)
Beispiel 1 - Anzeigen eines einfachen schwarzen Fensters mit Hilfe von GLUT: #include <windows.h>
Abbildung in dieser Leseprobe nicht enthalten
In diesem Minimalbeispiel wird ein kleines schwarzes Fenster mit Hilfe von verschiedenen GLUT - Befehlen gezeichnet und auf dem Bildschirm angezeigt.
In die init-Methode sollte man als Programmierer alles schreiben, was nur einmalig und initial defined; wird. Hier soll beispielsweise der Fenster-Hintergrund auf Schwarz gesetzt werden. Die init( ) - Methode wird spater in der main - Methode aufgerufen.
In der display ( ) - Callbackfunktion (siehe Abschnitt Callbackfunktionen) wird mit glClear(GL_Color_BUFFER_BIT) festgelegt, dass die Pixel des Color Buffers auf die vorher mit glClearColor(0.0, 0.0, 0.0, 0.0) festgelegte Clearing-Color geloscht/geandert werden (auf die verschiedenen Buffer wird in Kapitel 8 - „Framebuffer“ noch genauer eingegangen). AuBerdem wird mit glFlush( ) festgelegt, dass die Zeichenroutinen alle sofort und ohne Verzogerung ausgefuhrt werden sollen.
Abbildung in dieser Leseprobe nicht enthalten
Um ein solches Fenster zu initialisieren sind folgende 5 GLUT-Routinen (wie in der main - Methode zu sehen) notwendig:
- glutInit( ) sollte immer der erste GLUT-Aufruf sein. Es wird nun GLUT initialisiert und es konnen auch Kommandozeilenparameter ubergeben und verarbeitet werden.
- glutInitDisplayMode(unsigned int mode) legt fest ob der RGBA - Modus oder der Farbindex - Modus verwendet wird. (siehe Kapitel Farben) Ebenso kann festgelegt werden ob man mit einem Single - oder Doublebuffered Fenster arbeiten mochte. Double Buffer werden meist bei Animationen verwendet. (siehe Kapitel 1 - Abschnitt „Animation“) Die Parameter werden alle miteinander verODERt.
- glutInitWindowPosition(int x, int y) legt die Bildschirmposition fur das anzuzeigende Fenster fest. X und Y sind dabei die obere linke Ecke des Fensters.
- glutInitWindowSize(int width, int size) legt die GroBe des Fensters in Pixeln fest.
- glutCreateWindow(char* string) erstellt ein OpenGL - Fenster mit dem Namen string. Es wird eine eindeutige ID fur das neue Fenster zuruckgegeben. Allerdings wird das Fenster nicht angezeigt bis die Funktion glutMainLoop( ) aufgerufen wird, die erkennt, welche (Callback bzw. Handler) Funktionen aufgerufen werden mussen.
Callback - Funktionen
Display Callback
Callbackfunktionen sind Ereignisgesteuert. Immer wenn ein bestimmtes Ereignis eintritt wird diese Funktion automatisch von OpenGL bzw. GLUT aufgerufen in sofern sie vorher registriert wurde. In Beispiel 1 wurde eine solche Funktion mit glutDisplayFunc registriert. glutDisplayFunc(void ([1] func)void)) ist wohl die wichtigste Ereignis-Callbackfunktion. Sie wird immer von glutMainLoop( ) aufgerufen wenn GLUT entdeckt, dass ein Bereich oder Teil des angezeigten Fensters neu gezeichnet werden muss.
Input Handling
Die folgenden Routinen sind dazu da um geeignete Callbackfunktionen zu registrieren, die auf die Eingaben des Programmbenutzers reagieren bzw. diese verarbeiten sollen.
glutReshapeFunc(void(*func)(int w, int h)) legt fest was zu tun ist wenn die FenstergroBe verandert oder gar das Fenster bewegt/vrschoben wird.
Animation
Da unser Beispielprogramm spater auch einmal animiert sein soil wird an dieser Stelle kurz und knapp das Thema Animation behandelt.
Das Grundprinzip von Animation ist:
Bewegung = (Neu)zeichnen und Tauschen
Die meisten OpenGL Implementierungen unterstutzen „double-buffering“ - Hardware oder Software, die zwei komplette Farbbuffer zur verfugung stellt. Ein Buffer (siehe Kapitel 8 - „Framebuffer“) wird ausgewertet und gezeichnet wahrend der andere auf dem Bildschirm angezeigt wird. Im Colorbuffer (Farbpuffer) wird also das Bild, welches auf dem Bildschirm angezeigt wird gespeichert. Wenn das Zeichnen eines „Frames“ bzw. Fensterinhaltes vollstandig erledigt ist werden die beiden Buffer einfach getauscht, sodass der Buffer, der vorher angezeigt wurde nun fur das Zeichnen des nachsten Frames im „Hintergrund“ verwendet werden kann.
Kapitel 2 - Geometrische Objekte zeichnen
Beginnen wollen wir mit einem 2D - Objekt. In folgendem Beispiel soil deshalb ein einfaches weiBes Polygon auf schwarzem Hintergrund gezeichnet und angezeigt werden.
Beispiel 2 - Zeichnen eines weissen Vierecks auf schwarzem Hintergrund:
Abbildung in dieser Leseprobe nicht enthalten
Erklarung:
Im Grande wurde das Beispiel 1 nur um vier unterschiedliche Basisbefehle in der display( ) - Methode erweitert, die nun erklart werden sollen:
Mit glColor3f(1.0, 1.0, 1.0) wird eine neue „State Variable“ gesetzt um von nun an mit der Farbe „WeiB“ zu zeichnen. Dies bedeutet, dass alles nachfolgende von nun an weiB gezeichnet wird bis dieser „Farbstatus“ wieder verandert oder zuruckgesetzt wird. AuBerdem ist hier am Rande zu erwahnen, dass es sich hier um RGB(A) Werte handelt. R=Rot, G=Grun und B=Blau. Die RGB - Werte konnen sich zwischen [0... 1] befinden. Der hochste Wert dabei ist 1.0. Und 0.0 deutet darauf hin, dass sich hier die wenigsten Farbanteile befinden - bei 1.0 die meisten. Somit ist auch klar warum R,G,B,(A)= (0.0, 0.0, 0.0) schwarz und R,G,B,(A)= (1.0,1.0,1.0) weiB ergibt (Details in Kapitel 4 - „Farben“). Auf den Alpha-Wert, der beispielsweise bei dem glClearColor* -Befehl zu sehen ist wird hier nicht weiter eingegangen.
Nun beginnt der eigentliche Zeichenvorgang, der nun mit glBegin(GL_POLYGON) begonnen wird und mit glEnd() aufhort. Die OpenGL-Konstante GL_POLYGON bestimmt hier was fur ein geometrisches Objekt aus den Vertex/Eck-Punkten zwischen glBegin* und glEnd* erstellt werden soll. Was OpenGL auBer GL_POLYGON noch fur Moglichkeiten und Alternativen bietet, wird in diesem Kapitel noch genauer erlautert. Wie schon zu erahnen ist, werden die notwendigen Vertex/Eck - Punkte mit glVertex3f(...) definiert und gezeichnet.
Abbildung in dieser Leseprobe nicht enthalten
Bild 1: WeiBes Viereck auf schwarzem Hintergrund
Aus dem Ergebnis aus Beispiel 2 ist zu sehen, dass sich das Standard - Koordinatensystem mit dem Ursprung in der Mitte des angezeigten Fensters befindet. Durch die GLUT -Methode glutReshapeFunc(...) (siehe Abschnitt „Bibliotheken“ - Kapitel 1) konnen bei solch einem Koordinatensystem noch zusatzliche Einstellungen gemacht werden. Eine Mogliche reshape( ) - Funktion mit den grundlegendsten Einstellungen konnte beispielsweise so aussehen:
Beispiel 3 - Reshape Funktion:
Abbildung in dieser Leseprobe nicht enthalten
Der Funktion werden 2 Parameter w(width) und h(height) vom GLUT - Kernel ubergeben. Diese Parameterangaben sind als PixelgroBe des neu zu zeichnenden oder verschobenen Fensters zu verstehen.
glViewport( ) beschreibt dabei das aktuelle Betrachtungsfenster.
Advanced:
glViewport gibt die affine Transformation von X und Y von normalisierten Geratekoordinaten in Fensterkoordianten an. Wenn (xnd, ynd) normalisierte Geratekoordinaten sind, dann werden die Fensterkoordinaten (xw, yw) wie folgt ermittelt:
Abbildung in dieser Leseprobe nicht enthalten
Die Hohe und Breite des Betrachtungsfenster werden an eine implementationsabhangige Reichweite angepasst, die via glGet und dem Argument GL_MAX_VIEWPORT_DIMS ermittelt werden kann.
Auf glMatrixMode(...) wird erst in Kapitel 3 - „Sichten“ eingegangen. glLoadIdentity( ) ersetzt die aktuelle Matrix durch die Identitatsmatrix. Man kann also schon erahnen, dass intern mit Matrizenmultiplikation gearbeitet wird. Dies sollte auch fur die folgenden Kapitel im Hinterkopf behalten werden. gluOrtho2D(...) gibt zum Schluss noch die 2- dimensionale <= orthogonale Projektionsmatrix an. Fur genauere Details verweise ich hier auf geeignete Lekture, da es den Rahmen sprengen wurde die gesamte OpenGL API detailliert zu E beschreiben.
Abbildung in dieser Leseprobe nicht enthalten
Punkte, Linien und Polygone
Wie schon erwahnt ist OpenGL beim Zeichnen auf Punkte, Linien und Polygone beschrankt.
Punkte
Ein Punkt wird von einem Satz floating - Point Zahlen reprasentiert. Man nennt einen solchen Punkt auch Vertex. Alle internen Berechnungen werden immer und standardmaBig so durchgefuhrt als ob dieser Vertex 3 - dimensional ware. Wenn der Programmierer den Z-Wert bei einer 2 - dimensionalen Zeichnung weglasst wird trotzdem standardmaBig 0.0 als Z-Wert verwendet.
Abbildung in dieser Leseprobe nicht enthalten
Bild 2: Linien in OpenGL
Polygone
Unter einem Polygon versteht man den Bereich, der von mehreren Liniensegmenten umschlossen wird. Doch bei Polygonen kann es zu Komplikationen kommen weshalb OpenGL auch sehr strenge Auflagen erhebt was bei einem Polygon erlaubt ist und was nicht.
Beispielsweise durfen sich die Kanten eines Polygons nicht uberschneiden. AuBerdem muss ein Polygon konvex sein, was bedeutet, dass in dem Polygon keine „Einkerbungen“ sein durfen. Bei Nichtbeachtung dieser Dinge konnen unkontrollierte und unerwartete Effekte das Ergebnis sein.
Abbildung in dieser Leseprobe nicht enthalten
Mit einer der wichtigsten Grunde dafur, dass OpenGL sich nicht um diese Ausnahmefalle kummert ist, dass es besser und vor allem einfacher ist schnelleres Polygon-zeichnen hardwaremaBig zu realisieren. Einfache Polygone konnen schneller gezeichnet werden als komplizierte Polygone. Die Losung ist, dass man nichtkonvexe in konvexe Polygone unterteilt. Dafur gibt es Befehle wie glEdgeFlag(...) mit welchen man zusatzliche Eckpunkte definieren kann.
Abbildung in dieser Leseprobe nicht enthalten
Bild 3: nichtkonvexe und konvexe Polygone
Fur maximalen Performance-Support setzt OpenGL „einfache“ und laut OpenGL valide Polygone voraus:
Abbildung in dieser Leseprobe nicht enthalten
Fur den 3D - Bereich sei hier kurz aber explizit erwahnt, dass es bei OpenGL keine „Nichtplanaren“ - Polygone geben darf.
Abbildung in dieser Leseprobe nicht enthalten
Vorhin haben wir gesehen, dass mit glBegin(...) das Zeichnen geometrischer Primitiven beginnt. Doch welche Primitiven sind uberhaupt moglich?
Abbildung in dieser Leseprobe nicht enthalten
Bild 6: OpenGL Zeichenkonstanten
Abbildung in dieser Leseprobe nicht enthalten
- GL_POINTS zeichnet einen Punkt anjeden der n „Vertices“ (angegebene Eckpunkte).
- GL_LINES zeichnet eine Serie von nicht verbundenen Liniensegmenten.
- GL_LINE_STRIP zeichnet ein Liniensegment. Beachten sollte man hier, dass das letzte Liniensegmentende nicht mit dem Anfangsvertex des ersten Liniensegments verbunden wird.
- GL_LINE_LOOP ist dasselbe wie GL_LINE_STRIP auBer dass eine Schlussverbindung vom letzten zum ersten Liniensegment gezeichnet wird.
- GL_TRIANGLES zeichnet eine Serie von Dreiecken. Zuerst das Dreieck v0, v1, v2, dann das Dreieck v3, v4, v5 usw.(Wobei v0 der erste Vertex sein soil, v1 der zweite etc.)
- GL_TRIANGLE_STRIP zeichnet ebenfalls Dreiecke. Allerdings wird hier erst das Dreieck v0, v1, v2 gezeichnet und dann das zweite anschlieBende Dreieck mit v2, v1, v3, dann das nachste mit v2, v3, v4 usw.
- GL_TRIANGLE_FAN ist dasselbe wie GL_TRIANGLE_STRIP. Hier wird aber v0, v1, v2, dann v0, v2,v3, dann v0, v3, v4 usw.
- GL_QUADS zeichnet eine Reihe von Rechtecken. Zuerst v0, v1, v2, v3 dann v4, v5, v6, v7 usw. Wenn die Vertices nicht ein Vielfaches von 4 ist werden die Ubrigbleibenden Eckpunkte einfach ignoriert.
- GL_QUAD_STRIP zeichnet eine Reihe von Rechtecken beginnend mit v0, v1, v3, v2, dann v2, v3, v5, v4 dann v4, v5, v7, v6 usw. Falls die Anzahl der Eckpunkte ungerade sein sollte wird der letzte Eckpunkt/Vertex einfach ignoriert.
- GL_POLYGON zeichnet ein Polygon mit den Eckpunkten vO,.. ,.vn-1. n muss mindestens 3 sein oder es wird einfach nichts gezeichnet.
Polygondetails
Wie schon erwahnt muss ein Polygon konvex sein und darf sich nicht in anderen Kanten schneiden. Aber es gibt noch ein paar kleine Details, die auch fur unser folgendes Solarsystem-Beispiel sehr hilfreich sind.
Ein Polygon hat 2 Seiten - eine Vorder- und eine Ruckseite. Nun kann der Programmierer entscheiden ob er beide Seiten oder nur eine der beiden zeichnen mochte. So ist es nun moglich z.B. die AuBenwande eines Hauses zu zeichnen aber die Innenseite der Wande, welche dem Betrachter je nach dem sowieso verborgen bleiben sollen, nicht. Dies ist mit dem OpenGL - Befehl glPolygonMode(GLenum face, GLenum mode) moglich. Parameter face c kann hierbei GL_FRONT_AND_BACK, GL_FRONT oder GL_BACK sein. Parameter mode o kann GL_POINT, GL_LINE oder GL_FILL sein. DefaultmaBig werden Polygone aber immer beidseitig und gefullt gezeichnet.
[...]
[1] glutKeyboardFunc(void(*func)(unsigned char key, int x, int y)) und glutMouseFunc(void(*func)(int button, int state, int x, int y)) erlaubt dem Programmierer eine Methode mit einer Tastatur- oder Maustaste zu verknupfen. Diese Methode wird dann aufgerufen wann immer eine solche Taste gedruckt wird. - glutMotionFunc(void(*func)(int x, int y)) registriert eine Callbackfunktion, die sich zuruckmeldet wenn sich die Maus bewegt wahrend gleichzeitig eine Maustaste gedruckt wird.
- Quote paper
- Oliver Charles (Author), 2008, OpenGL. Einführung und Überblick, Munich, GRIN Verlag, https://www.grin.com/document/93381
-
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X. -
Upload your own papers! Earn money and win an iPhone X.