7 2D-Graphik: Rasterkonvertierung
Die Szenenbeschreibung enthält kontinuierliche
geometrische Objekte, wie Strecken, Kurven, Polygone etc.
Bei der Rastergraphik stehen aber nur endlich viele Bildpunkte (Pixel) als
Darstellungselemente zur Verfügung.
Ziel der Rasterkonvertierung ist es also ein geometrisches Objekt
O durch Bildpunkte zu approximieren, so dass diese
bei hinreichend feiner Auflösung wie O aussehen.
Algorithmen zur Rasterkonvertierung
Strecken (naiver Algorithmus)
Voraussetzung:
Zugehörige Gerade in expliziter Darstellung:
y = m * x + b
Betrag der Steigung m liegt zwischen 0 und 1.
Vorgehensweise:
Fortschreiten auf dem Raster in x-Richtung
Rundung des zugehörigen y-Werts auf den nächsten Rasterpunkt mit gleichem
x-Wert.
Nachteil
Gleitkommaarithmetik
Rundungsfunktion ist rechenaufwendig
Strecken (Mittelpunkts-Algorithmus)
Voraussetzungen:
Strecke s[p1,p2] uzugehörige Gerade in impliziter Darstellung:
a*x + b*y+c=0
mit
????
Steigung der Geraden liegt zwischen 0 und 1
Vorgehensweise
Fortschreiten auf dem Raster in x-Richtung Berechnung der Testgröße zur Auswahl
des Rasterpunkts:
d(x) = a * x + b *(y+0.5) + c
Wenn d £ 0, wird der Punkt (x,y) gesetzt, sonst der Punkt (x,y+1)
Nachteil
Gleitkommaarithmetik
Multiplikationen
Strecken (Bresenham-Algorithmus)
Voraussetzungen:
wie bei Mittelpunkts-Algorithmus
Die Endpunkte der Strecke (p1x,p1y) und (p2x,p2y) sind Rasterpunkte.
Inkrementelle Fehlerberechnung
Testgröße für den nächsten Rasterpunkt, wenn (x,y) gesetzt wurde:
d(x+1) = a *(x+1) + b * (y+0.5) + c
Testgröße für den nächsten Rasterpunkt, wenn (x,y+1) gesetzt wurde:
d(x+1) = a *(x+1) + b * (y+1+0.5) + c
Inkrementelle Fehlerberechnung
Differenz zwischen altem und neuem Fehlerwert im Fall (x,y):
d(x+1) – d(x) = a = dy
im Fall (x,y+1):
d(x+1) – d(x) = a + b = dy - dx
d.h. der neue „Fehler“ kann durch Addieren einer Konstanten aus dem alten Wert
berechnet werden.
Initialisierung
Falls der erste Punkt (p1x,p1y) ein Rasterpunkt ist (d(p1x) = 0):
Ganzzahlige Arithmetik
Um ganzzahlig rechnen zu können, wird d(x) mit 2 multipliziert.
Der Vergleich des Testwerts gegen 0 bleibt damit korrekt.
Initialisierung: d := d(px+1) = 2 * dy – dx
Inkrement im ersten Fall: dE := 2 * dy
Inkrement im zweiten Fall: dNE := 2 * (dy – dx) =
Polygone
Die Raster-Konvertierung von Polygonen wird oft auch als Füllen bezeichnet.
Gesucht sind alle Rasterpunkte, die im Inneren eines Polygons oder auf einer
seiner Kanten liegen.
Problem: Da nur Rasterpunkte im Inneren des Polygons gezeichnet werden, können
sich bei spitzen Polygonen Lücken ergeben.
Polygone (Scanline-Algorithmus)
Vorgehensweise
Das Bild wird zeilenweise abgearbeitet.
Für jede Zeile:
1. Bestimme die von ihr geschnittenen Polygonkanten
2. Bestimme die Intervalle auf der Zeile, die durch Schnittpunkte begrenzt
werden
3. Gib die Rasterpunkte in den Intervallen aus, die im Inneren des Polygons
liegen
Bemerkungen
Horizontale Kanten werden ignoriert
Werden die Zeilen nach aufsteigenden y-Koordinaten bearbeitet, werden an den
Polygoneckpunkten die Kanten berücksichtigt, die dort einen y-minimalen Endpunkt
haben, diejenigen mit y-maximalem Endpunkt nicht.
Datenstrukturen
Repräsentation einer Kante
Maximale y-Koordinate
Zu Beginn x-Koordinate des unteren Endpunktes, später aktuelle x-Koordinate
Steigung der Kante für die inkrementelle Berechnung der Intervallgrenze: x = 1/m
* y + b
X-Datenstruktur (engl. active edge table, AET)
Die X-Datenstruktur enthält die von der aktuellen Zeile geschnittenen Kanten,
die sogenannten aktiven Kanten.
Die Kanten sind dabei nach aufsteigenden x-Koordinaten des Schnittpunkts mit der
aktuellen Zeile sortiert.
Wichtige Operationen auf der X-Datenstruktur sind das Einfügen und Entfernen
einer Kante.
Für kleine Kantenzahlen genügt die Implementierung durch eine lineare Liste.
Ablauf
Setze y auf die kleinste y-Koordinate, für die es einen Eintrag in der
Y-Datenstruktur gibt (nicht leeres Fach).
Initialisiere die X-Datenstruktur als leere Liste.
Wiederhole bis die X- und Y-Datenstruktur leer sind:
Füge die Kanten aus der Y-Datenstruktur, die im Fach y enthalten sind, in die
X-Datenstruktur ein.
Fülle die Bildpunkte der aktuellen Zeile y, wobei Paare von x-Koordinaten aus
der X-Datenstruktur als linker und rechter Rand benutzt werden.
Entferne alle Kanten aus der X-Datenstruktur für die y = ymax gilt.
Erhöhe y um 1
Für jede nicht vertikale Kante, berechne die x-Koordinate zur neuen Zeile y
Bemerkungen
Die Intervallgrenzen können ähnlich wie bei der Raster-Konvertierung von
Strecken inkrementell bestimmt werden.
Der Algorithmus muss aber so modifiziert werden, dass nur Intervallgrenzen im
Inneren des Polygons erzeugt werden).
Scanline Algorithmus Beispiel:
Datenstruktur : für Y (edge table, ET)
Ymax= gibt die Gränze an die erreicht wird, wenn zu Xunten der 1/m wert dazu
addiert wird.
Xunten= gibt den Anfangswert an, bei der X-Datenstruktur wird der immer
überschrieben durch die Addition
1/m=gibt die Steigung an. Formel: 1/m=dX/dY= (2-4)/(7-1)=-1/3
Datenstruktur : für X : gibt die Gränzen an.(engl. active edge table, AET)
Für jede Zeile werden die Grenzen für Polygone ausgerechnet die Gefüllt werden
sollen.
bei Unserem Beispiel: Zeile: Y=3
Ymax= gibt die Gränze an die erreicht wird, wenn zu Xunten der 1/m wert dazu
addiert wird.
Xk= gibt den Xpunkt an der stelle y=3 an: Formel: x=1/m*y+b =
-1/3*(3-1)+4=-2/3+12/3=10/3
y=an dieser stelle ist Zeile=y-anfangswert=1also abstand der Faktorisierung.
1/m=gibt die Steigung an. Formel: 1/m=dX/dY= (2-4)/(7-1)=-1/3
aliasing vs antialiasing
stufiges Aussehen von verrasterten Strecken (engl. aliasing)
das Glätten der verrasteten Strecke nennt man auch antialiasing
??
Modelieren
Scanline algorithmus
RasterMittelpunktsalg. wie strecken zeichnen
???
OpenGL- 2D Antialiasing
Antialiasing
Zur Erzeugung runder Punkte,
glatter Strecken und glatter Polygonkanten muss das Antialiasing eingeschaltet
werden.
Dies erfolgt durch die Aufrufe:
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
Zusätzlich kann mit dem Befehl glHint die Qualität der Ausführung
implementierungsabhängig gesteuert werden.
Steuerung von Berechnungen
Qualitätshinweise
void glHint(GLenum target, GLenum mode)
Beschreibung
Definiert die Qualität durchzuführender Berechnungen.
Sofern die OpenGL-Implementierung diese Fähigkeit unterstützt – was sie nicht
muss -, kann angegeben werden, ob bestimmte Berechnungen schnellstmöglich (GL_FASTEST),
schönstmöglich (GL_NICEST) oder ohne Präferenz (GL_DONT_CARE) durchgeführt
werden sollen.
Bemerkung
Für das Antialiasing kann der Parameter target die Werte,
GL_POINT_SMOOTH_HINT, GL_LINE_SMOOTH_HINT und GL_POLYGON_SMOOTH_HINT annehmen.
Ist das Antialiasing aktiviert, dann wird von OpenGL ein Überdeckungsgrad
berechnet, der angibt, wie viel Prozent eines Bildpunktes (Pixels) ein
graphisches Objekt einnimmt. Dieser Überdeckungsgrad wird mit dem Alpha-Wert der
Farbe des Objekts multipliziert.
Farben in OpenGL besitzen vier Komponenten: Rot, Grün, Blau und Alpha-Wert
(siehe auch Beschreibung des Befehls glColor).
Der Alpha-Wert einer Farbe ist ein Transparenzwert und wird beim
Überblenden zwischen zwei Farben benutzt.
Damit der Überdeckungsgrad eines Bildpunkts mit dem schon existierenden Farbwert
verrechnet wird, muss das Überblenden von Farben aktiviert sein. Die Gewichtung
muss dabei auf a für die Quelle und 1-a für das Ziel gesetzt sein:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Beispiel:
Sei Rs der neue Rot-Wert (Quelle) und Rd der bereits vorhandene Rot-Wert
(Ziel) sowie As der Alpha-Wert der Quelle,
dann gilt für den überblendeten Rot-Wert:
Rs * As + Rd (1 – As)