Grafische Datenverarbeitung
4 2D-Graphik: Szenenbeschreibung 1
Mathematische Grundstrukturen eines
Grafiksystems:
Punkt:
(Px,Py)T, Px,PyÎIR
Strecke:
(PunktA, PunktB)
Strecke: s[p1, p2] := {p: p = p1 + t * (p2 – p1), t
Î [0,1]}
Polygonzug:
offener: (Strecke1,Strecke2,. . .,Strecken)
geschlossener (Strecke1,Strecke2,. . .,Strecke[n,1])
Was ist ein Polygon?
Menge von Punkten ***????
Wie bekommt man raus das z.B. die Maus sich
z.Z. innerhalb einem nicht konvexen Polygons befindet?
Was heißt Konvex bei einem Polygon?
Wenn beliebige zwei Punkt in einem Polygon durch eine Strecke verbunden
werden können ohne die Randpunkte zu überschreiten,
dann ist der Polygon Konvex.
oder Konvexes Polygon: einfaches Polygon, bei dem zu je zwei seiner Punkte auch
die auf der Verbindungsstrecke liegenden Punkte innerhalb des Polygons liegen.
Wann ist ein Polygon einfach?
Wenn er sich selbst nicht überschneidet.
OpenGL - 2D Punkt und
Strecke
Löschen eines Fensters
In OpenGL existiert ein spezieller Befehl um die Speicherbereiche (engl.
buffer) eines Fensters zu löschen.
- Der Befehl kann dazu benutzt werden, um gleichzeitig mehrere Speicherbereiche
des Fensters zu löschen.
- Dies ermöglicht eine effiziente Unterstützung durch Graphik-Hardware.
- Setzen der aktuellen Löschfarbe:
Befehl:
void glClearColor(GLclampf red, Glclampf green,
Glclampf blue, Glclampf alpha)
Beschreibung:
setzt den Wert der aktuellen Löschfarbe für Bildspeicher im RBGA-Farbmodus.
Die Parameter red, green, blue und alpha werden auf den Bereich [0..1]
beschränkt.
Die Default-Einstellung ist schwarz (0.0, 0.0, 0.0, 0.0).
Beispiel:
glClearColor(1.0, 1.0, 1.0, 0.0);
// weiß
- Löschen von Speicherbereichen (buffers)
Befehl:
void glClear(Glbitfield mask);
Beschreibung:
Löschen eines oder mehrerer Speicherbereiche (buffers) mit den durch
glClearColor, glClearIndex, glClearDepth, glClearStencil und glClearAccum
eingestellten aktuellen Werten. Der Parameter mask ist eine bitweise
Oder-Verknüpfung der Werte:
- Bildspeicher GL_COLOR_BUFFER_BIT
- Tiefenpuffer GL_DEPTH_BUFFER_BIT
- Schablonenspeicher GL_STENCIL_BUFFER_BIT
- Akkumulationsspeicher GL_ACCUM_BUFFER_BIT
Beispiel
glClearColor(1.0, 1.0, 1.0, 0.0);
glClearDepth(1.0);
// Bildspeicher und Tiefenpuffer löschen
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
Geometrische Grundobjekte
- Achsenparalleles Rechteck
OpenGL besitzt einen speziellen Befehl zur Ausgabe eines achsenparallelen
Rechtecks, da dieses besonders häufig in Graphik-Anwendungen auftritt.
void glRect{s i f d}(TYPE x1, TYPE y1, TYPE x2, TYPE
y2);
void glRect{s i f d}v(TYPE *v1, TYPE *v2);
Beschreibung
Definition eines achsenparallelen Rechtecks mit den Eckpunkten (x1,y1) und
(x2,y2).
- Das Rechteck liegt in der Ebene z = 0.
- In der Vektorform werden die Eckpunkte durch die beiden Felder v1 und v2
definiert, die jeweils (x,y)-Werte enthalten.
- Eckpunkt
Alle anderen geometrischen Grundobjekte werden mit Hilfe von Eckpunkten
(engl. vertex) definiert.
- Ein Eckpunkt legt die Koordinaten eines Punktes fest.
- Alle internen Berechnungen werden von OpenGL ausgeführt, als wenn der
Eckpunkt ein Punkt im dreidimensionalen Raum ist.
- Zweidimensionalen Eckpunkten wird von OpenGL die z-Koordinate 0 zugewiesen.
void glVertex{234}{s i f d}[v](TYPE coords);
Beschreibung
Definition eines Eckpunktes eines geometrischen Grundelements
Es können bis zu vier Koordinaten (x,y,z,w) angegeben werden.
Fehlen die Koordinaten z oder w werden sie mit 0.0 bzw. 1.0 vorbelegt.
Aufrufe von glVertex sind nur zwischen einem Paar der Befehle glBegin() und
glEnd() wirksam.
Beispiel
glVertex2s(2, 3);
- Eckpunktlisten
void glBegin(Glenum mode);
Beschreibung
Anfang einer Eckpunktliste, die geometrische Grundelemente beschreibt
Die Art der Grundelemente wird durch den Parameter mode festgelegt (siehe
folgende Folie).
void glEnd();
Beschreibung
Ende einer Eckpunktliste
Eckpunktlisten
Modus |
Bedeutung |
GL_POINTS
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_QUADS
GL_QUAD_STRIP
GL_POLYGON |
Punkte
Strecken
Offener Polygonzug
Geschlossener Polygonzug
Dreiecke
Dreiecksstreifen
Dreiecksfächer
Vierecke
Vierecksstreifen
Polygon |
OpenGL besitzt einen internen Zustand
(Status), der aus verschiedenen Zustandsvariablen besteht.
Viele dieser Variablen repräsentieren Darstellungsmodi, die ein- und
ausgeschaltet werden können.
- Manipulation des Zustands
void glEnable(Glenum cap);
Beschreibung
Aktivieren eines Modus von OpenGL
Es existieren mehr als 40 Konstanten, die als Parameter an glEnable übergeben
werden können.
void glDisable(Glenum cap);
Beschreibung
Deaktivieren eines Modus von OpenGL
- Statusabfrage
GLboolean glIsEnabled(GLenum cap);
Beschreibung
Erfragen der aktuellen Einstellung eines Modus
Der Rückgabewert gibt an, ob der Modus aktiviert (GL_TRUE) oder deaktiviert (GL_FALSE)
ist.
- Farbe
void glColor3{b s i f d ub us
ui}(TYPE r, TYPE g, TYPE b);
void glColor4{b s i f d ub us ui}(TYPE r, TYPE g, TYPE b, TYPE a);
void glColor3{b s i f d ub us ui}v(const TYPE *v);
void glColor4{b s i f d ub us ui}v(const TYPE *v);
Beschreibung
Setzt die aktuelle Zeichenfarbe im RGBA-Modus.
Wird der Alpha-Wert nicht explizit angegeben, wird er auf 1.0 gesetzt.
- Punktgröße
void glPointSize(Glfloat size);
Beschreibung
Festlegung des Durchmessers von rasterkonvertierten Punkten in
Bildschirmeinheiten (Pixel)
Die resultierende Darstellung hängt von der Aktivierung und Implementierung
des Antialiasing ab.
size muss größer als 0.0 sein.
Der Default-Wert ist 1.0.
- Linienbreite
void glLineWidth(Glfloat width);
Beschreibung
Festlegung der Linienbreite in Bildschirmeinheiten
Die resultierende Darstellung hängt von der Aktivierung und Implementierung
des Antialiasing ab.
width muss größer als 0.0 sein.
Der Default-Wert ist 1.0.
- Linienmuster
void glLineStipple(Glint factor, Glushort pattern);
Beschreibung
Festlegung der Maske (gesetzte und nicht gesetzte Pixel) und eines
Skalierungsfaktors für die gerasterte Darstellung von Linien
Der Parameter pattern ist ein 16-bit Wert von 0 und 1
Eine 1 bedeutet, dass ein Bildpunkt gesetzt wird. Eine 0 bedeutet, dass der
Bildpunkt nicht gesetzt wird.
Der Skalierungsfaktor factor wird auf jede zusammenhängende Folge von Nullen
und Einsen in pattern angewendet.
Der Parameter factor wird auf Werte in [1,256] begrenzt.
Die Anwendung des Linienmusters muss durch Aufruf von
glEnable(GL_LINE_STIPPLE); eingeschaltet
werden.
Pattern Factor
0x00FF 1 ________
________
________
0x00FF 2 ________________
________________
0x0C0F 1 ____
__ ____
__ ___
__
0x0C0F 3 ____________
_____
0xAAAA 1 _ _ _ _
_ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _
0xAAAA 2 __ __ __
__ __ __ __ __ __ __ __ __
__ __ __
- Polygon-Füllmuster
void glPolygonStipple(const GLubyte *mask);
Beschreibung
Festlegung der Maske (gesetzte und nicht gesetzte Pixel) für die gerasterte
Darstellung von Polygonen
Der Parameter mask ist ein Zeiger auf eine 32 x 32 Bitmap, die als Maske von 0
und 1 interpretiert wird.
Eine 1 bedeutet, dass ein Bildpunkt gesetzt wird. Eine 0 bedeutet, dass der
Bildpunkt nicht gesetzt wird.
Die Anwendung des Füllmusters muss durch Aufruf von
glEnable(GL_POLYGON_STIPPLE); eingeschaltet werden.
Das "stipple pattern" muß im Speicher nicht mit der obersten, sondern mit der
untersten Zeile zuerst abgelegt werden, d.h. von unten nach oben und je Zeile
von links nach rechts. Zu beachten ist außerdem, daß mit der Funktion
glPixelStore*() die Reihenfolge der Bits im Muster geändert werden kann.
-