www.codeworx.org/opengl-tutorials/Tutorial 3: Farben und Formen


Lektion 3"Farben und Formen"

- Download des Arbeitsbereiches

In dieser Lektion wird es um drei wichtige Grundformen gehen, Dreiecke, Vierecke und Polygone. Und da es ziemlich eintönig ohne wäre, kommt auch gleich etwas Farbe ins Spiel ;)

In diesem und in allen weiteren Tutorials dieser Reiher wird der Quelltext der ersten Lektion das Grundgerüst bilden. Jetzt wird besonders die Prozedur DrawGLScene() erweitert werden, in der alle auf dem Bildschirm letztendlich sichtbaren Formen und Farben stehen. Die betreffenden Zeilen des letzten Tutorials können einfach durch die neuen ersetzt werden.

int DrawGLScene(GLvoid) 
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
  // Die vorherige Szene wird vom Bildschirm gelöscht, 
  // damit die neuen nicht einfach über die alten    
  // Objekte gezeichnet werden

  glLoadIdentity(); 
  // modelview-Matrix wird zurückgesetzt
Um eine Form am Koordinatenursprung (0.0f, 0.0f, 0.0f) (Die "Kreuzung" der drei Achsen) ausgeben zu können, wird mit Hilfe von glLoadIdentity() auf diesen Punkt zurückgesetzt, der genau in der Mitte des Fensters liegt. (Das Koordinatensystem in OpenGL wird im Glossar erläutert)
  glTranslatef(-1.5f,0.0f,-6.0f)
  // Auf der X-Achse 1.5 Punkte zurück (Nach links)
  // Auf der Z-Achse 6 Punkte zurück (In den Bildschirm hinnein.)
Mit glTranslatef() läßt sich der Zeichner bewegen. Wenn der Zeichner vorher die Position (1.0f, 2.0f, 3.0f) hatte und jetzt glTranslatef(-1.5f,0.0f,-5.0f); aufgerufen wird, ist die Position des Zeichners danach (-0.5, 2.0f, -2.0f).
  // Der Zeichner hat jetzt die Position:
  // (-3.5f,0.0f,-9.0f) 
  // (Vorher (0.0f, 0.0f, 0.0f))
Mit GL_TRIANGLES wird jetzt ein Dreieck ausgegeben. Dabei müssen die Koordinten nacheinander angegeben werden. Die übergebenen Werte sind wieder Koordinaten. Allerdings relativ zu den Koordinaten des Zeichners. (Das häufig und auch in OpenGL verwendete RGB-Farbmodell wird im Glossar erläutert)
  glBegin(GL_TRIANGLES); // Ein Dreieck soll gezeichnet werden
    glColor3f(0.0f,0.0f,1.0f); // es soll soll blau werden
    glVertex3f( 0.0f, 1.0f, 0.0f); // Die obere Ecke des Dreiecks
    glVertex3f(-1.0f,-1.0f, 0.0f); // unten links
    glVertex3f( 1.0f,-1.0f, 0.0f); // unten rechts
  glEnd(); // Zeichenaktion beenden

Die Farbe Blau gilt für alle folgenden Punkte, bis eine andere defeniert wird.
Damit ein Stück weiter die nächste Form gezeichnet werden kann, muss der Zeichner ein Stück verschoben werden

  glTranslatef(3.0f,0.0f,0.0f); 
  // 3 Einheiten entlang der X-Achse nach rechts bewegen
GL_QUADS zeichnet ein Viereck auf den Bildschirm. Dazu müssen wieder alle benötigten Koordinaten übergeben werden.
  glBegin(GL_QUADS); // Ein Viereck zeichnen
glColor3f(1.0f,0.0f,0.0f); // es soll rot werden
glVertex3f(-1.0f, 1.0f, 0.0f); // oben links
glVertex3f( 1.0f, 1.0f, 0.0f); // oben rechts
glVertex3f( 1.0f,-1.0f, 0.0f); // unten rechts
glVertex3f(-1.0f,-1.0f, 0.0f); // unten links
glEnd(); // Zeichenaktion beenden
Damit das folgende Ploygon auch genug Platz hat, wird wieder um einige Schritte verschoben.
  glTranslatef(3.5f,0.0f,0.0f); 
// 3.5 Einheiten entlang der X-Achse nach rechts bewegen
Ein Polygon kann (theoretisch) unendlich viele Ecken haben, diese müssen der Reihenfolge nach übergeben werden. Jede Ecke hat jetzt eine eigene Farbe zugewiesen bekommen, die sich dann in der Mitte mischen.
  glBegin(GL_POLYGON); // Ein Polygon (in diesem Falle ein Achteck.)
    // jede Ecke bekommt eine andere Farbe

    glColor3f(1.0f,0.0f,0.0f); // rot
    glVertex3f(-0.5f, 1.5f, 0.0f); // obere Ecke links
    glVertex3f( 0.5f, 1.5f, 0.0f); // obere Ecke rechts

    glColor3f(0.0f,0.0f,1.0f); // blau
    glVertex3f( 1.5f, 0.5f, 0.0f); // rechte Ecke oben
    glVertex3f( 1.5f,-0.5f, 0.0f); // rechte Ecke unten

    glColor3f(0.0f,1.0f,0.0f); // grün
    glVertex3f( 0.5f,-1.5f, 0.0f); // untere Ecke rechts
    glVertex3f(-0.5f,-1.5f, 0.0f); // untere Ecke links

    glColor3f(1.0f,1.0f,0.0f); // gelb
    glVertex3f(-1.5f,-0.5f, 0.0f); // linke Ecke unten
    glVertex3f(-1.5f, 0.5f, 0.0f); // linke Ecke oben
  glEnd(); // Zeichenaktion beenden

return TRUE; // Alles hat geklappt
}

Da die ganze Sache noch einen neuen Namen braucht, wird dieser noch schnell geändert.

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow)
{
(...) gekürzt   

     if (!CreateGLWindow("Opengl Tutorial 2 - Farben und Formen - 
                        www.codeworx.org",640,480,16,fullscreen))
     {
       return 0; // Falls ein Fehler auftrat, beenden
     }

(...)
 

So schnell lassen sich recht einfache 2D-Grafiken auf den Schirm bringen! Um noch etwas Bewegung in das Ganze zu bringen, wird in der nächsten Lektion die Rotation besprochen. Natürlich sit die Sache auch als Arbeitsbereiches verfügbar.