Computergraphik Grundlagen XI. Rasterung Füllen von Polygonen Prof. Stefan Schlechtweg Hochschule nhalt Fachbereich Informatik
Inhalt Lernziele 1. Zu lösendes Problem 2. Füllen von Pixelmengen 1. Rekursiver lgorithmus 3. Füllen von Polygonen 1. Einstieg: Füllen von Rechtecken 2. Begriffe und Definitionen 3. Iterativer lgorithmus 4. Zusammenfassung 4. Füllen mit Mustern Füllen als computergraphisches Grundproblem kennenlernen lgorithmus zum Füllen auf Pixelbasis kennenlernen Iterativen lgorithmus zum Füllen von Polygonen, die durch Kanten gegeben sind, verstehen Probleme beim Füllen auch mit Mustern identifizieren können 2
Lokale Koordinaten Modellierung der Geometrie einzelner Objekte lokal Welt Plazierung der Objekte Weltkoordinaten Plazierung der Lichtquellen Plazierung der Kamera Beleuchtungsberechnung Transformation in Kamerakoordinaten Kamerakoordinaten Entfernen verdeckter Rückseiten Viewing-Transformation Normalisierte Projektionskoordinaten Clipping gegen Sichtkörper Entfernen verdeckter Modellteile Projektion (Normalisierte) Bildschirmkoordinaten Rastertransformation Rasterung Rasterkoordinaten Shading Entfernen verdeckter Modellteile 3
1. Zu lösendes Problem Polygon gegeben durch Geometrische Beschreibung (Ecken, Kanten) Pixelmenge (entsteht durch Rasterung der Kanten) Fragen: Welche Pixel bilden das Innere der Fläche und sind daher einzufärben, wenn die Fläche gefüllt werden soll? Womit (welche Farbe) sind die Pixel zu füllen? Füllalgorithmen für: Polygone, deren Rand als Pixelmenge gegeben ist, Polygone, die durch Kanten gegeben sind 4
2. Füllen von Pixelmengen Gegeben: gerasterte Polygone als Rand- Pixelmenge Startpunkt, der festlegt, wo innen ist Gesucht: alle Pixel innerhalb des Randes Begriff: Nachbarschaften 4-Nachbarschaft (von-neumann-nachbarschaft) 8-Nachbarschaft 5
2. Füllen von Pixelmengen 2.1. Rekursiver lgorithmus Bestimmung der Zugehörigkeit zum Rand erfolgt über Pixelfarbe, daher einfarbiger Rand Beginne mit einem Startpixel Teste, ob das aktuelle Pixel auf dem Rand liegt (getpixel(x,y)) wenn ja, dann ist nichts zu füllen wenn nein, dann fülle die {4er, 8er}-Nachbarschaft 6
2. Füllen von Pixelmengen 2.1. Rekursiver lgorithmus void floodfill( int x, int y, int fillcolor, int border) { if ((getpixel(x, y) == border) (getpixel(x, y) == fillcolor)) {return;} setpixel( x, y, fillcolor); // 4-Nachbarschaft floodfill( x, y+1, fillcolor, border); floodfill( x, y-1, fillcolor, border); floodfill( x+1, y, fillcolor, border); floodfill( x-1, y, fillcolor, border); } 7
2. Füllen von Pixelmengen 2.1. Rekursiver lgorithmus Probleme: Rekursion hoher Berechnungsaufwand mehrfaches Testen von Pixeln spill-out bei Lücken in den Rändern Rand bei Verwendung der 8-Nachbarschaft muss auch diagonal dicht definiert sein Vorteile: Es muss nichts über die Geometrie des zu füllenden Gebietes bekannt sein! Keine langwierigen Berechnungen 8
3. Füllen von Polygonen Füllalgorithmen auf Basis einer geometrischen Beschreibung Füllen von Polygonen, die definiert sind durch Liste von Eckpunkten {V} und dazwischen liegenden Kanten {E} Kante von v i zu Eckpunkt vi +1 für i: 1 < i < n Kante von v n nach v 1 schließt das Polygon Konvexe Polygone: Wenn P 1 und P 2 zum Polygon gehören, gehören auch alle Punkte auf der Verbindung zwischen P 1 und P 2 zum Inneren des Polygons Konkave Polygone:... uch mit Selbstüberschneidungen 9
3. Füllen von Polygonen 3.1. Einstieg: Füllen von Rechtecken Füllen mit einheitlicher Farbe Rechteck definiert durch zwei Ecken (x min, y min ) und (x max, y max ) lgorithmus: for (y=y min ; y<=y max ; y++) for (x=x min ; x<=x max ; x++) setpixel (x, y, color); 10
3. Füllen von Polygonen 3.2. Begriffe und Definitionen Definition: Pixel auf einer Kante gehören nicht zum Primitiv, wenn die durch die Kante definierte Halbebene, die das Primitiv enthält, unter dieser Kante oder links von ihr liegt. Pixel auf einer Kante gehören zum Primitiv, wenn die Halbebene, die das Primitiv enthält, oberhalb oder rechts liegt. gehört nicht zum Primitiv gehört zum Primitiv 11
3. Füllen von Polygonen 3.2. Begriffe und Definitionen Kante: Verbindung zweier Eckpunkte Scanlinie: horizontale Linie auf Höhe einer Rasterzeile Spanne: bschnitt auf einer Scanlinie zwischen zwei Schnittpunkten mit Polygonkanten 12
3. Füllen von Polygonen 3.3. Iterativer lgorithmus btasten (Scannen) des Polygons Pixelzeile (Scanline) für Pixelzeile von unten nach oben Suche alle Schnittpunkte der Scanlines mit Polygonkanten Sortiere die Schnittpunkte nach wachsenden x-koordinaten Fülle alle Pixel zwischen Schnittpunkten nach Parität: Parität ist anfangs 0 und wechselt bei jedem Schnittpunkt. Gezeichnet wird bei Parität 1. 13
3. Füllen von Polygonen 3.3. Iterativer lgorithmus 11 10 9 8 7 6 5 4 3 2 1 D F a b E c d C B Scanline 1 2 3 4 5 6 7 8 9 10 11 12 13 14 14
3. Füllen von Polygonen 3.3. Iterativer lgorithmus Überlegungen/Sonderfälle Wie bestimmt man für einen nicht-ganzzahligen Schnittpunkt, welches der beiden Nachbarpixel innen liegt? Erreicht man den Schnittpunkt, während man innen ist, wird abgerundet, während man außen ist, wird aufgerundet. Wie verfährt man mit Schnittpunkten an ganzzahligen Pixelkoordinaten? Ein ganzzahliger Schnittpunkt wird am Beginn einer Spanne als innen ; am Ende einer Spanne als außen betrachtet. Wie verfährt man mit doppelt belegten Schnittpunkten? Der y min -Wert einer Kante wird als zugehörig, der y max -Wert einer Kante als nicht zugehörig betrachtet. Wie verfährt man mit horizontalen Kanten? Untere Kanten werden dargestellt, obere nicht. 15
3. Füllen von Polygonen 3.3. Iterativer lgorithmus Voraussetzungen: ufbau einer Kantentabelle (edge table, ET) für alle Kanten Pro Kante wird notiert: y min = unterer y-wert x start = x-wert an dem Punkt mit y min (kann größerer x-wert sein!) y max = oberer y-wert t=dx/dy=horizontaler Versatz zwischen zwei Scanlines (entspricht 1/nstieg) y 11 9 7 5 3 1 D F E C B 2 7 13 x B 1 7 3-5/2 BC 1 7 5 6/4 F 3 2 9 0 CD 5 13 11 0 EF 7 7 9-5/2 DE 7 7 11 6/4 (2-7)/(3-1) (13-7)/(5-1) 0/6 0/6 (2-7)/(9-7) (13-7)/11-7) 16
3. Füllen von Polygonen 3.3. Iterativer lgorithmus lgorithmus iteriert über Scanlinien und baut eine ktivkantentabelle (active edge table, ET) auf. ET enthält nach wachsenden x-werten sortierte Schnittpunkte von Scanlinien mit Polygonkanten. Spannen zwischen Paaren von solchen Schnittpunkten (Einträge in der ET) werden gefüllt. ET wird beim Übergang zur nächsten Scanlinie aktualisiert. lgorithmus endet, wenn ET leer ist 17
3. Füllen von Polygonen 3.3. Iterativer lgorithmus 1. Weise y den kleinsten in der ET vorkommenden Wert zu 2. Initialisiere die ET mit dem nfangszustand leer 3. Wiederhole bis ET und ET leer sind a) Überführe aus der ET diejenigen Einträge in die ET, für die y min =y ist und sortiere die ET nach x b) Fülle die Pixel in der Scanlinie y durch Nutzung von Koordinatenpaaren der ET c) Entferne aus der ET alle die Einträge mit y max =y d) Inkrementiere y (nächste Scanlinie) e) ktualisiere für jede nicht vertikale Kante (dx/dy!=0) der ET den x start -Wert für das neue y 18
Kantentabelle (ET) ET (Scanline 1) 11 D 9 7 5 3 1 F E C B 2 7 13 x B 1 7 3-5/2 BC 1 7 5 3/2 F 3 2 9 0 CD 5 13 11 0 EF 7 7 9-5/2 DE 7 7 11 3/2 B 1 7 3-5/2 BC 1 7 5 3/2 Beide Male ist 1 der y min -Wert einer Kante, daher zeichnen ET (Scanline 2) 11 9 7 5 F E D C Kantentabelle (ET) B 1 9/2 3-5/2 BC 1 17/2 5 3/2 Füllen zwischen den beiden Einträgen - (9/2, 2) aufrunden (außen) (5,2) - (17/2, 2) abrunden (innen) (8,2) 3 1 2 7 13 x F 3 2 9 0 CD 5 13 11 0 EF 7 7 9-5/2 DE 7 7 11 3/2 ET (Scanline 3) B 1 4/2 3-5/2 BC 1 20/2 5 3/2 19
y 11 D ET (Scanline 3) 9 7 5 3 1 y 11 9 7 5 3 1 F E C 2 7 13 x D F E C F 3 2 9 0 CD 5 13 11 0 EF 7 7 9-5/2 DE 7 7 11 3/2 CD 5 13 11 0 EF 7 7 9-5/2 DE 7 7 11 3/2 F 3 2 9 0 B 1 4/2 3-5/2 BC 1 20/2 5 3/2 - Kante F in die ET überführen - Füllen zwischen den beiden letzten Einträgen, dabei ist erster Punkt als innen, letzter als außen betrachtet - Kante B entfernen ET (Scanline 4) F 3 2 9 0 BC 1 23/2 5 3/2 - Füllen zwischen beiden Einträgen, (23/2) auf (11) abrunden 2 7 13 x 20
y ET (Scanline 5) 11 D 9 7 5 3 1 F E C 2 7 13 x CD 5 13 11 0 EF 7 7 9-5/2 DE 7 7 11 3/2 F 3 2 9 0 BC 1 26/2 5 3/2 CD 5 13 11 0 - Kante CD in die ET überführen - Füllen zwischen den ersten beiden Einträgen, dabei wird (26/2, 5) als außen betrachtet - Kante BC entfernen ET (Scanline 6) D F F 3 2 9 0 CD 5 13 11 0 E Füllen zwischen den beiden Einträgen, dabei wird (13, 6) als außen betrachtet EF 7 7 9-5/2 DE 7 7 11 3/2 21
y 11 9 7 5 3 1 y 11 9 7 5 3 1 D F E 2 7 13 x D F E 2 7 13 x Kante y min x start y max dx/dy EF 7 7 9-5/2 DE 7 7 11 3/2 Kante y min x start y max dx/dy -- -- -- -- -- ET (Scanline 7) Kante y min x start y max dx/dy F 3 2 9 0 EF 7 7 9-5/2 DE 7 7 11 3/2 CD 5 13 11 0 - Kanten DE und EF in die ET überführen - Füllen zwischen den ersten beiden Einträgen. (7, 7) wird als außen betrachtet. - Füllen zwischen den letzten beiden Einträgen. (13, 7) wird als außen betrachtet. ET (Scanline 8) Kante y min x start y max dx/dy F 3 2 9 0 EF 7 9/2 9-5/2 DE 7 17/2 11 3/2 CD 5 13 11 0 - Füllen zwischen den ersten beiden Einträgen, (9/2, 8) zu (4, 8) abgerundet - Füllen zwischen den letzten beiden Einträgen, (17/2, 8) wird zu (9, 8) aufgerundet 22
y 11 9 7 5 3 1 D F E 2 7 13 x -- -- -- -- -- ET (Scanline 9) Kante y min x start y max dx/dy F 3 2 9 0 EF 7 4/2 9-5/2 DE 7 20/2 11 3/2 CD 5 13 11 0 - Füllen zwischen den ersten beiden Einträgen, dabei wird (2, 9) nicht gesetzt, da er y max zweier Kanten ist. - Füllen zwischen den letzten beiden Einträgen, dabei wird (13, 9) als außen betrachtet - Entfernen von F und EF y 11 9 7 5 3 1 D E 2 7 13 x -- -- -- -- -- ET (Scanline 10) DE 7 23/2 11 3/2 CD 5 13 11 0 - Füllen zwischen beiden Einträgen, dabei wird (23/2, 10) zu (12, 10) aufgerundet und (13, 10) als außen betrachtet 23
y 11 9 7 5 3 1 E D -- -- -- -- -- ET (Scanline 11) DE 7 26/2 11 3/2 CD 5 13 11 0 - Der Pixel (13, 11) wird nicht gesetzt, da er y max zweier Kanten ist - Kanten DE und CD entfernen 2 7 13 x y 11 9 D ET (Scanline 12) 7 E 5 3 1 2 7 13 x Sowohl ET als auch ET sind leer -- ENDE 24
E 25
3. Füllen von Polygonen 3.4. Zusammenfassung Eigenschaften: Effizienter lgorithmus Beliebige Polygone (auch konkave) Vereinfachung für konvexe Polygone möglich (immer nur eine Spanne) Performance-Gewinn durch Schnelles Sortieren Integer-rithmetik (beim ddieren von dx/dy) Wird häufig angewendet, u.a. beim Shading in der 3D- Computergraphik 26
4. Füllen mit Mustern Muster als Bitmap (Textur = 2D Bild) gegeben, soll in das Innere eines Polygons übertragen werden Keine einheitliche Farbe, daher direkte Zuordnung zu füllendes Pixel auf Texturpixel notwendig 27
4. Füllen mit Mustern Verankerung der linken unteren Textur-Ecke in einer Polygonecke Muster ist mit Polygon verbunden, bewegt sich bei nimationen mit dem Polygon Verankerung der Textur auf dem Hintergrund Muster nicht mit Polygon verbunden, Polygon bewegt sich über der Textur Belegen der Polygonpixel mit dem Wert 1 und logische UND- Verknüpfung mit dem Muster 28
4. Füllen mit Mustern Einfache Erweiterung der Füllalgorithmen Keine einheitliche Farbe stattdessen: Lookup der Pixelfarbe in der Textur Verknüpfen der Texturfarbe mit der Hintergrundfarbe in verschiedenen Modi: Farben verknüpfen (Interpolation, verschiedene Verfahren) Textur-Farbwert für weitere Berechnungen verwenden Verwendung beim Rendering: Shading in Verbindung mit Texturierung Texture Mapping, Bump Mapping, etc. 29