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:

  1. Es wurde gewählt: also
  2. Es wurde gewählt: also

, da allerdings nur das Vorzeichen relevant ist, betrachten wir nachfolgend und entsprechend

Ablauf

Initialwerte: | |

  1. Falls E gewählt wird:
  2. 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

  1. Sortiere Ecken des Dreiecks anhand der -Koordinate: (
    • mit
  2. Rasterisiere untere Hälfte
    • das heißt zwischen und
  3. 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:
    1. entlang der Kanten
    2. 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!