Während ein geometrisches Primitiv gezeichnet wird, wird jeder seiner Eckpunkte durch die aktuellen OpenGL-Zustandsvariablen beeinflußt. Diese Zustandvariablen spezifizieren Informationen wie Linienbreite, Linienmuster, Farbe, Schattierungsmethode, Nebel, usw...
Einige Zustandvariablen beziehen sich auf OpenGL-Fähigkeiten, die entweder "Off" (setzen sie auf den Wert GL_FALSE ) oder "On" sind (setzen sie auf den Wert GL_TRUE). Andere Zustandvariablen beziehen sich auf einen bestimmten Modus (setzen sie auf einen Wert vom Typ GLenum), der von einem definierten Satz an Modi gewählt wird. Zuletzt gibt es Zustandvariablen, die auf bestimmte Werte gesetzt werden (GLfloat, GLint, usw...).
Jede Zustandvariable hat einen Standardwert. Die Werte der Zustandvariablen, ob Standardwert oder durch den Programmierer gesetzt, bleiben bis zur Änderung bestehen.
Dieses Kapitels beschreibt einige der am meisten verwendeten Zustandvariablen. Leider ist es nicht möglich innerhalb dieses Tutorials umfassend auf alle Zustandvariablen einzugehen.
Anfänglich sind die meisten dieser Zustände, durch Voreinstellung, inaktiv gesetzt. Diese Zustände sind vielleicht zu kostspielig; zum Beispiel, wird das Einschalten des Texturen-Mapping sicherlich die Geschwindigkeit des Rendern eines Primitive verringern. Jedoch, wird sich die Qualität des Bildes verbessern und realistischer erscheinen, zurückzuführen auf die erhöhten graphischen Fähigkeiten. Um diese Zustandsvariablen ein und auszuschalten, benutzt man die zwei einfachen Befehle:
glEnable(Glenum cap); glDisable(Glenum cap); |
glEnable() schaltet den Zustand ein, und glDisable() schaltet ihn aus. Es gibt über 40 numerische Werte, die als Argument an glEnable() oder glDisable() übergeben werden können. Einige Beispiele für diese sind GL_BLEND (welches das Mischen der RGB-Werte steuert), GL_DEPTH_TEST (welches die Tiefenvergleiche steuert und den Tiefenpuffer aktualisiert), GL_FOG (welches den Nebel steuert), GL_LINE_STIPPLE (Linienmuster), GL_LIGHTING und so weiter.
Man kann auch Überprüfen ober der Zustand gegenwärtig gesetzt ist oder nicht.
GlIsEnabled(Glenum cap) |
Gibt GL_TRUE oder GL_False zurück, abhängig davon ob der erfragte Zustand gegenwärtig aktiviert ist. Die Zustände die Sie gerade gesehen haben, haben zwei Einstellungen: "on" und "off". Jedoch, setzen die meisten OpenGL Routinen Werte für kompliziertere Zustandsvariablen. Zum Beispiel, setzt die Routine glColor3f() drei Werte, welche Teil des GL_CURRENT_COLOR Zustands sind. Dies sind fünf Abfrageroutinen, die verwendet werden um herauszufinden, welche Werte für viele Zustände gesetzt sind: glGetBooleanv(), glGetIntegerv(),.glGetFloatv(), glGetDoublev() oder glGetPointerv(). Erhalten Boolean, Ganzzahl, Fließkomma, Fließkomma mit doppelter Genauigkeit oder Zeiger Zustandsvariablen. Eine Typenumwandlung wird wenn nötig durchgeführt um die gewünschte Variable als ersuchten Datentyp zurückzugeben.
Um eine Farbe zu definieren, benutzen Sie den Befehl glColor3f(). Er erwartet drei Argumente, die alle Fließkommazahlen zwischen 0.0 und 1.0 sind. Die Argumente sind, in dieser Reihenfolge, der Rot, Grün und Blau Bestandteil der Farbe. Man kann sich diese drei Werte als "mischen" der Farben vorstellen: 0.0 bedeutet nichts von diesem Bestandteil zu verwenden, und 1.0 bedeutet verwende soviel wie möglich von diesem Bestandteil. Folglich, erzeugt der Code
glColor3f(1.0, 0.0, 0.0); |
das leuchtendste Rot, daß das System darstellen kann, ohne Grün oder Blau Bestandteile. Alle Null erzeugt Schwarz; im Gegensatz erzeugt alle Eins Weiß. Anschließend acht Befehle und die Farben, die sie definieren würden:
Tabelle 18-4. OpenGL Farbbefehle
| Befehl | Farbe |
|---|---|
| glColor3f(0,0, 0,0, 0,0); | Schwarz |
| glColor3f(1,0, 0,0, 0,0); | Rot |
| glColor3f(0,0, 1,0, 0,0); | Grün |
| glColor3f(0,0, 0,0, 1,0); | Blau |
| glColor3f(1,0, 1,0, 0,0); | Gelb |
| glColor3f(0,0, 1,0, 1,0); | Kobaltblau |
| glColor3f(1,0, 0,0, 1,0); | Violett |
| glColor3f(1,0, 1,0, 1,0); | Weiß |
Um die Größe eines gerenderten Punktes zu steuern, verwenden Sie glPointSize() und übergeben die gewünschte Größe in Pixel als Argument.
glPointSize(GLfloat size); |
Setzt die Breite in Pixel für gerenderte Punkte; size muß größer sein als 0.0 und ist per Voreinstellung 1.0. Die tatsächliche Ansammlung von Pixel auf dem Bildschirm, die für verschiedene Punktbreiten gezeichnet werden, hängen davon ab, ob Antialiasing aktiviert ist.
Mit OpenGL können Sie Linien mit verschiedenen Breiten spezifizieren und Linien die auf unterschiedliche Weise gemustert sind - punktiert, gestrichelt, Strichpunkte usw.
glLineWidth(GLfloat width); |
Setzt die Breite in Pixel für gerenderte Linien; width muß größer sein als 0.0 und ist per Voreinstellung 1.0. Das tatsächliche Rendern von Linien wird durch den Antialiasing Modus beeinflußt, auf die gleiche Weise wie bei Punkten.
Um Linienmuster zu erzeugen (punktiert oder gestrichelt), verwendet man den Befehl glLineStipple() um ein Muster zu definieren, und dann aktiviert man das Linienmuster mit glEnable().
glLineStipple(Glint factor, GLushort pattern); glEnable(GL_LINE_STIPPLE); |
Setzt das gegenwärtige Muster für Linien. Das pattern Argument ist eine 16 Bit Folge von 0 und 1, und wird wenn notwendig wiederholt um eine gegebene Linie darzustellen. Eine 1 deutet darauf hin, daß gezeichnet wird, und 0, daß nicht. Dies Pixelweise, beginnend mit dem niederwertigen Bit des Musters. Das Muster kann durch die Verwendung von factor gestreckt werden, welcher eine aufeinanderfolgende Reihe von 0 und 1 multipliziert. Somit, wenn drei aufeinanderfolgende 1 in einem Muster erscheinen, werden sie zu sechs gestreckt wenn factor 2 ist. factor ist angelegt um zwischen 1 und 255 zu liegen. Linienmuster müssen durch die Übergabe von GL_LINE_STIPPLE an glEnable() aktiviert werden; sie werden durch die Übergabe des gleichen Arguments an glDisable() deaktiviert.