Einsteigerpfad
Inhaltsverzeichnis
Der Einsteigerpfad
Einführung
Willkommen auf dem Einsteigerpfad des DelphiGL-Wikis. Dieser Pfad soll euch das DGL-Wiki näherbringen und dabei Euch einen Einblick in die Welt von OpenGL bieten.
Wie funktioniert der Trampelpfad? Im nachfolgenden Abschnitt findet ihr einen Text der euch etwas über OpenGL erzählen soll. Dieser Text ist durchsetzt mit Schlagwörtern welche Links auf andere Artikel im Wiki sind. Wenn ihr diesen Links folgt, erfahrt ihr mehr zu den entsprechenden Themen.
Sinn des Trampelpfades ist es euch die Artikel aufzuzeigen, welche ihr gelesen haben solltet und welche nützlich für den Einstieg in OpenGL sind. Am Ende dieses Trampelpfades findet ihr noch Links zu OpenGL-Tutorials die euch die Materie OpenGL genauer erklären werden.
Der Trampelpfad
Am Beginn steht bei den meisten OpenGL Anfängern die Frage "Wie verwende ich OpenGL?". Welche Möglichkeiten es gibt OpenGL zu verwenden erfahrt ihr im OpenGL Verwendungspfad.
Wesentlicher Bestand von fast jeder OpenGL Anwendung ist eine Routine, welche regelt, was wie gezeichnet wird. Oft wird sie mit "DrawScene" oder "Render" bezeichnet. In eine solche Funktion kommen die Aufrufe der OpenGL-Befehle rein. Das Wiki verfügt über eine Übersicht aller OpenGL-, GLU-, WGL-, GLX- und GLUT-Funktionen.
Um nicht völlig aus dem Nichts OpenGL erklären zu müssen, gibts hier einen kleinen OpenGL-Codeschnipsel.
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45.0, ClientWidth/ClientHeight, 1, 1000); glTranslatef(0,0,-5); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glBegin(GL_QUADS); glColor3f(1,0,0); glVertex3f(0,0,0); glColor3f(0,1,0); glVertex3f(1,0,0); glColor3f(0,0,1); glVertex3f(1,1,0); glColor3f(1,1,0); glVertex3f(0,1,0); glEnd; SwapBuffers(DC);
Dieser kleine Schnipsel (welcher den kompletten Inhalt einer kleinen Renderprocedure darstellt) zeigt schon mehr von OpenGL als im Ramen des Einsteigerpfades erklärt werden soll. Zu aller erst etwas allgemeines. Was die einzelnen OpenGL bzw. GLU Befehle wirklich machen kann man ganz einfach herausfinden. Das Wiki enthält zu allen Befehlen (na gut, im Moment fehlen noch ein paar) Erklärungen. Unter anderem auch zu glBegin, glVertex, glColor und glTranslate. Die Erklärungen findet ihr in der OpenGL-Funktionsübersicht.
Was macht aber nun der obige Code?
Zu aller erst wird der Tiefenpuffer und der Farbpuffer gelöscht. Hier nur soviel dazu: Der Farbpuffer speichert für jedes Pixel die Farbkomponenten und der Tiefenpuffer die Tiefe des Pixels im Bildraum.
Anschließend wird etwas sehr wichtiges gemacht: Es wird die aktuelle Matrix gewählt. OpenGL kennt 3 verschiedene Matrizen. Je nachdem was man machen will, kann man mittels glMatrixMode die entsprechende Matrix auswählen.
Zuerst wird die "Kamera" postiert. Dazu wechselt man in die Projektionsmatrix. Dort angekommen setzt man diese erst einmal zurück. Danach wird festgelegt wie man auf die Scene schauen will und dann bestimmt man noch mittels glTranslate wie weit man vom Koordinatenursprung weg sein will.
Anschließend möchte man den eigentlichen Inhalt der Szene zeichnen. Dazu wird die Modelviewmatrix benutzt. Auch diese wird ersteinmal zurückgesetzt. Doch dann kommt der eigentlich interessante Teil.
Durch glBegin teilen wir der OpenGL mit, dass wir Vierecke zeichnen wollen. Dann kommt ein Aufruf von glColor mit dem wir OpenGL sagen welche Farbe alle nachfolgenden Punkte haben sollen. Dann wird der erste Punkt an OpenGL übergeben. Nachdem alle Punkte übergeben wurde teilt man OpenGL mit, dass die Punktdefinition beendet ist sorgt dafür, dass der Inhalt der Puffer auf den Monitor kommt.
Das hätte man sich auch denken können oder? Stimmt deshalb hier noch einige Informationen, die Ihr wissen solltet:
- OpenGL ist eine Statemachine. Das bedeutet, dass man durch die einzelnen Befehle OpenGL in einen neuen Status bringt. Zum Beispiel ist der Farbstatus nach der Initialisierung (1,1,1) (=Weiß). Durch glColor setzt man einen neuen Farbstatus. D.h. alle nachfolgenden Vertices werden in dieser Farbe gezeichnet. Genauso ist es mit all den Eigenschaften die man mittels glEnable an- und mit glDisable ausschalten kann. Ein Status ist solange gültig bis er durch neue Werte ersetzt wird.
- Um dem Anwender keine unfertigen Bilder zu präsentieren läßt man OpenGL meißt mit Doppelpufferung arbeiten. Hat man sich für Doppelpfferung entschieden so muss man unter Windows am Ende des Zeichenvorgangs SwapBuffers aufrufen.
- OpenGL unterscheidet zwischen Vorder- und Rückseiten. Das klingt auf den ersten Blick etwas seltsam aber schaut euch nocheinmal den obigen Code an. OpenGL zeichnet nicht ein, sondern zwei Vierecke. Einmal die Vorder- und einmal die Rückseite. Solange man sicher ist, dass man eh nur die Vorderseite sehen will kann man durch Backfaceculling die unnötigen Polygone vom Zeichenvorgang ausschließen.
- Die Reihenfolge der Eckpunkte ist wichtig. Durch glVertex übergebt ihr OpenGL ja Punktkoordinaten im Raum. Um daraus ein Polygon zu machen werden diese Punkte in einer bestimmten reihenfolge Verbunden (Wie bei glBegin beschrieben). Wenn die Eckpunkte in Uhrzeigerrichtung übergeben wurden ist die entstehende Fläche für OpenGL eine Rückseite. Die Richtung kann mittels glFrontFace eingestellt werden, sollte aber nach Möglichkeit auf dem standard bleiben um nicht in Fremdcode plötzlich durcheinander zu kommen.
Tutorials
Auf DelphiGL.com findet man eine Vielzahl Tutorials.
Für den Anfänger sind vorallem die Einsteiger Tutorials zu empfehlen.