4 Zeichenprimitive in OpenGL

OpenGL unterstützt nur das Zeichnen einiger weniger grundlegender Graphik - primitive:

Alle primitive setzen sich aus Vertices zusammen. Zu jedem Vertex kann man optional eine Farbe und einen Normal-vektor angeben:

glColor{34}{sifd}[v] (TYPE colors);
glNormal3{bsidf}[v] (TYPE normal);

glVertex{234}{sifd}[v](TYPE coords);

Und aus eben diesen Angaben über die Vertices, bzw. die Farben und Normalvektoren setzt sich dann die Definition eines Zeichenprimitives zusammen.
Jede solche Operation wird durch die Befehle glBegin(GLenum mode) und glEnd() geklammert.

Zulässige Werte für mode:

Nun kann man sich fragen, warum es so viele verschieden Möglichkeiten gibt Polygone zu zeichnen, aber es gibt zwei sehr logische Gründe:

Bei den STRIP und FAN Varianten werden Vertices mehrfach verwendet, dadurch wird der Datentransfer minimiert, und auch der Berechnungsaufwand verringert. Und außerdem ist die Graphikhardware oft auf das zeichnen von 3-Ecken ausgelegt, und kann das besonders schnell.

Darum, wenn man weis, daß das Mesh aus 3-Ecken besteht, sollte man die 3-Ecke als GL_TRIANGLES rendern und nicht als eine Serie von Aufrufen von GL_POLYGON mit jeweils 3 Vertices.

In der Tat ist es sogar so, daß OpenGL einen Aufruf von GL_POLYGON intern in mehrere 3-Ecke aufspaltet, und diese rendert. Wenn, man also Glück hat, kann man mit OpenGL sogar konkave Polygone ausgeben, da die Polygone ja vor der Ausgabe trianguliert werden. Von dieser Methode ist aber stark abzuraten, da man sich ja nicht drauf verlassen kann, daß jede Implementierung von OpenGL nach der selben Methode trianguliert.

Nun aber zu einem konkreten Beispiel:

Wir wollen ein 3-Eck mit farbigen Eckpunkten rendern.

glClearColor (1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_TRIANGLES);
	glColor4f(1.0f, 0.0f, 0.0f, 1.0f);	// Rot
	glVertex2f(100.0f, 50.0f);
	glColor4f(0.0f, 1.0f, 0.0f, 1.0f);	// Grün
	glVertex2f(450.0f, 400.0f);
	glColor4f(0.0f, 0.0f, 1.0f, 1.0f);	// Blau
	glVertex2f(450.0f, 50.0f);
glEnd();

4.1 Backface - Culling

Wie bereits gesagt, muß man in OpenGL die Normalvektoren selber angeben, und zwar pro Vertex. OpenGL hat keine Routine um automatisch für Flächen Normalvektoren zu berechnen.

Darum wird für das Backface - Culling auch nicht der Normalvektor herangezogen, sondern die Orientierung des Poly-gons (Im Uhrzeigersinn, bzw. gegen den Uhrzeigersinn).

Die Befehle dazu:

glEnable (GL_CULL_FACE);	// Culling einschalten
glFrontFace (GL_CCW);		// Gegen den Uhrzeigersinn(counter clockwise)
glFrontFace (GL_CW);		// Im Uhrzeigersinn (clockwise)
glCullFace (GL_FRONT oder GL_BACK oder GL_FRONT_AND_BACK);
Die Befehle selber dürften ziemlich klar sein und keiner weiteren Erklärung bedürfen. Die default Werte die verwendet werden sind:

4.2 Linienstärke, strichlierte Linien, Punktgröße

In OpenGL kann man auch die Größe für einzelne Punkte bzw. die Linienstärke angeben. Bei der Linienstärke ist zu beachten, daß die Stärke nicht korrekt, sondern entweder horizontal oder vertikal aufgetragen wird.

D.h., daß bei einer Stärke von 3 Linien mit Winkel von 0° bis 45° 3 Pixel hoch gezeichnet werden, und Linien von 45° bis 90° 3 Pixel breit gezeichnet werden.
Außerdem kann man angeben, ob und wie Linien strichliert gezeichnet werden sollen.

GlPointSize (Glfloat size);                      // Punktgröße

glLineWidth (Glfloat width);                     // Linienstärke
glEnable (GL_LINE_STIPPLE);                      // Strichlieren einschalten
glLineStipple (Glint factor, Glushort pattern);	 // Strichlierung festlegen

Bei dem Befehl glLineStipple definiert pattern das Bitmuster der Strichlierung, und factor definiert die Skalierung:

Pointsize = 8
Pointsize = 6
Pointsize = 4
Pointsize = 1
Pattern = 0x0f0f, Factor = 3
Pattern = 0x0f0f, Factor = 2
Pattern = 0x0f0f, Factor = 1
_