Rasterisierung
Rasterisierung und die damit verbundene Diskretisierung ist allgemein weder eindeutig noch perfekt möglich
- Häufig entstehen dabei Aliasing-Artefakte (“Treppenstufen”), die mit Antialiasing-Methoden abgeschwächt werden können

OpenGL-Pipeline

Midpoint-Algortihmus
Pixel als auf der Linie gegeben ansehen Steigung der Linie sei o.B.d.A (andernfalls und tauschen) es kommen nur noch zwei Pixel für die nächste Spalte in Frage: East (E) und North-East (NE)
Auswahlkriterium: Wir betrachten den Mittelpunkt zwischen und . Liegt die Linie über oder unter ?
Liniengleichung:
Implizite Form ():
Eigenschaften: Für gilt
- falls auf der Linie
- falls unterhalb der Linie
- falls oberhalb der Linie
Entscheidungsvariable:
- Es wurde gewählt: also
- Es wurde gewählt: also
, da allerdings nur das Vorzeichen relevant ist, betrachten wir nachfolgend und entsprechend
Ablauf
Initialwerte: | |
- Falls E gewählt wird:
- Falls NE gewählt wird:

const rasterizeLine = (x0: number, y0: number, x1: number, y1: number): void => {
const dx = x1 - x0;
const dy = y1 - y0;
const dE = 2 * dy;
const dNE = 2 * dy - 2 * dx;
writePixel(x0, y0);
let [x, y, d] = [x0, y0, 2 * dy - dx];
while (x < x1) {
if(d <= 0) {
d += dE;
} else {
d += dNE;
y ++;
}
x ++;
writePixel(x, y);
}
};Midpoint-Algorithmus für Primitive
Das Primitiv sei vollständig durch eine implizite Funktion definiert:
- : Kreis mit Mittelpunkt im Ursprung und Radius
- : Diagonale
- etc.
Weiter sei die Rasterisierung von dadurch vereinfacht, dass Symmetrien (z. B. 8-fache Symmetrie des Kreises) ausgenutzt sowie degenerierte Primitive (z. B. Linien, deren Anfangs- und Endpunkt übereinstimmen) und Sonderformen (z. B. horizontale Linien) separat behandelt werden
Arbeitsweise:
- Berechnung erfolgt inkrementell von einem Pixel zum nächsten (z.B. entlang einer Hauptachse wie der -Achse mit
- Bei jedem Schritt wird die Kandidatenpixelmenge möglichst klein gehalten (z.B. nur )
- Entscheidungsvariable wird inkrementell berechnet und mitgeführt (z.B. , wobei bzw. im Mindpoint-Linienalgorithmus Konstanten sind)
Midpoint-Circle-Algorithmus
- Kreis ist 8-fach symmetrisch nur ein Oktant muss berechnet werden
- Wir betrachten oberen rechten Oktanten
- Wir nehmen einen Pixel als gegeben an
- Kandidatenpixel in -Richtung sind und
- Entscheidungsvariable ist
- Falls , wähle ( unterhalb des Kreisbogens)
- Falls , wähle ( oberhalb des Kreisbogens)
- Falls , wähle konsistent entweder oder
- (aufgrund von eliminiertem Bruch eigentlich statt , doch wir betrachten nur ganze Zahlen)


Dreiecksrasterisierung
- Scanline-Verfahren: horizontale / vertikale Pixellinien durch Dreieck durchgehen
- Rasterisierung im Anschluss an perspektivische Projektion (3D 2D)
Algorithmus
- Sortiere Ecken des Dreiecks anhand der -Koordinate: (
- mit
- Rasterisiere untere Hälfte
- das heißt zwischen und
- Rasterisiere obere Hälfte
- das heißt zwischen und
- Ziel: je Hälfte genau 2 Kanten mit 1 Segment pro Scanline

Für jede Kante: Berechnung von
Für jede Hälfte: Anzahl der Scanlines berechnen:

Segment-Rasterisierung
- Aus einem Segment entstehen Fragmente
- Fragmente werden in der Rendering-Pipeline in der Rasterisierungsstufe ausgewertet
- d.h. es werden Werte für Farbe, Beleuchtung, Texturen etc. ermittelt
- am Ende werden i.d.R. ein Farbwert und ein Tiefenwert berechnet, die in den Framebuffer bzw. den Tiefenbuffer geschrieben werden


Tiefenwerte
Rasterisierung ermöglicht Fragment-Berechnung mit -Wert
- dazu zweifache lineare Interpolation:
- entlang der Kanten
- in der Scanline
Neben Tiefenwerte können auch andere allgemeine Eckwerte (z.B. Farben, Texkturkoordinaten, etc.) auf diese Weise interpoliert werden

Inkrementelle Berechnung
Ebenengleichung für das Dreieck:
- stellen Normalenvektor dar
Ebenenkoeffizienten:
(Veränderung von bei horizontaler Bewegung, Schrittweite 1) (Veränderung von bei vertikaler Bewegung, Schrittweite 1)
Vermutlich irrelevant
Baryzentrischen Koordinaten
mit nennen wir baryzentrische Koordinaten
- für Punkte innerhalb des Dreiecks gilt
- zwei Koeffizienten bestimmten den dritten:
Bayzentrische Koordinaten sind proportional zu Größe der Dreiecke, in die ein Punkt im Inneren eines Dreiecks dieses zerlegt
- Können ebenfalls verwendet werden, um Eckwerte zu interpolieren
- Anwendung: erst Bounding Box berechnen, und dann für jedes Fragment innerhalb dieser die Baryzentrischen Koordinaten berechnen und das Vorzeichen prüfen () Dreiecksrasterisierung

Edged Function Testing
Benötigen Funktion mit folgenden Eigenschaften:
- wenn auf der rechten Seite der Kante
- wenn exakt auf der Kante
- wenn auf der linken Seite der Kante
Edge Function in Bezug auf die Kante ist:
Herleitung über Kreuzprodukt und dessen Orientierung
- entspricht der vorzeichenbehafteten Länge des Vektors, der durch das Kreuzprodukt zwischen und definiert wird
Herleitung zum Verständnis des Kreuzprodukts nochmal anschauen, aber irrelevant
Winding Order: Die Reihenfolge, in der die Vertices ein Dreieck bilden, beeinflusst das Ergebnis der Kantenfunktion sowie die Ausrichtung der Oberflächennormale!