Rasterisierung von Dreiecken


Der Pixel

Bevor wir nun mit der Rasterisierung von Dreiecken anfangen können müssen wir erst einmal den Unterschied zwischen einem Punkt und einem Pixel klären. Wenn wir das folgende Bild betrachten

wird uns schnell klar, was nun genau der Unterschied ist. Der blaue Punkt ist der durch Projektion entstandene Punkt aus dem 3D – Raum in die Ebene. Das rote Kästchen ist der Pixel Mittelpunkt. Es dürfte klar sein, dass wenn wir Dreiecksflächen nun Rastern wollen, es ohne Füllkonvention dazu führt das wir unter Umständen Pixel doppelt ausfüllen oder überhaupt gar nicht, obwohl wir das nicht wollen.

Füllkonvention

Eine gängige Füllkonvention ist die Top – Left Füllkonvention, welche durch die Ceiling Funktion realisierbar ist. Dabei runden wir sowohl die x- und y – Koordinate auf den nächst höheren Wert auf. Haben wir nun z.B für eine Zeile die Werte X0 und X1 ermittelt, so werden wir diese Linie von X0 bis X1 – 1 ausfüllen. Analoges gilt für die y – Werte.

Rasterisierung der Kanten

Eine naive Methode wäre es, die Steigung zu bestimmen, welche wieder eine reelle Zahl wäre und diese auf unsere aktuelle x – Position zu addieren. Hierbei würde wieder das Problem entstehen, dass wir wieder auf den nächsten Pixel, welcher der Füllkonvention entspricht, „springen“ müssten und dann ständig die zu interpolierenden Parameter durch ineffiziente Multiplikation mit den Abstand zwischen Pixel und Punkt und den Gradienten zu aktualisieren.

Da wir nun die Anfangs- und Endpunkte als Integer vorzuliegen haben, können wir als erstes den Abstand zwischen dem originalem Punkt und dem Pixel bestimmen und unsere zu interpolierenden Parameter mit Hilfe der Gradienten aktualisieren. Nun stellt sich die Frage, wie wir die Kanten des Dreiecks rastern wollen ? Um den Rahmen der Dokumentation nicht zu sprengen verweisen wir lieber hier auf verschiedene DDA – Algorithmen wie z.B der Bresenham-Scan Algorithmus. Ein weiterer, der Füllkonvention entsprechenden DDA findet man auf der Homepage von Chris Hecker.

Durch Hilfe des DDA ist es uns nun möglich das Dreieck durch Integerarithmetik zu rastern. Pro Zeile gehen wird jeweils um einen Pixel nach unten und um ein gewisses Delta nach links bzw. rechts pro Kante. Da wir die Werte schon vorher kennen, können wir die zu interpolierenden Parameter gleich mit Hilfe der Gradienten anpassen und sparen uns so unnötige Multiplikationen, da wir nun nur noch addieren brauchen. Nun können wir ohne Probleme, Zeile für Zeile eines Dreckes, jeweils von der linken bis zur rechten Kannte rastern.

Index

Interpolation in Dreiecken

Transformation und Projektion