Upload
duongtuong
View
215
Download
0
Embed Size (px)
Citation preview
Rasterung von zweidimensionalen Objekten
Andreas Spillner
Computergrafik, WS 2018/2019
Verortung der Rasterung in der Rendering Pipeline
darzustellende Objekte (z.B. aus Datenbank)
Anordnung der Objekte in einer Szene
Bestimmung des sichtbaren Bereichs der Szene
Berechnung des zweidimensionalen Bildes der Szene
Grundproblem
Kontinuierliche geometrische Objekte müssen durch eineendliche Menge von Pixeln dargestellt werden.
Dabei gibt es oft mehr als nur eine geeignete Darstellung.
Fallunterscheidung
(x0, y0)
(x1, y1)
g(x, y) = (y0 − y1)x+ (x1 − x0)y + x0y1 − x1y0 = 0
x0 ≤ x ≤ x1
y0 ≤ y ≤ y1
y
x
Grundidee
(x0, y0) ??
I Man arbeitet die Spalten von links nach rechts ab.I Man muss in jedem Schritt entscheiden, ob das Pixel in der
gleichen Zeile oder eine Zeile höher gesetzt werden soll.
Der Mittelpunkt-Algorithmus
1 2 3 4 5 6 70 8 1 2 3 4 5 6 70 801234
y
x
1 2 3 4 5 6 70 8
g(3, 1.5) < 0 g(4, 2.5) ≥ 0 g(5, 2.5) ≥ 0
Allgemein: HalbebenentestI Letztes Pixel gesetzt bei Koordinaten (x , y).I Nächstes Pixel bei
I (x + 1, y + 1), falls g(x + 1, y + 0.5) < 0 ist.I (x + 1, y), sonst.
Ein bisschen Tuning
I Die meiste Zeit wir zur Berechnung von g(x + 1, y + 0.5)benötigt.
I Das lässt sich vermeiden, indem man ausnutzt:
g(x + 1, y) = g(x , y) + (y0 − y1)
g(x + 1, y + 1) = g(x , y) + (y0 − y1) + (x1 − x0)
Inkrementelle Version des Mittelpunkt-Algorithmus
y := y0d := g(x0 + 1, y0 + 0.5)for x := x0 to x1 do
Setze Pixel bei (x , y)if d < 0 then
y := y + 1d := d + (y0 − y1) + (x1 − x0)
elsed := d + (y0 − y1)
Etwas unschön ist noch, dass diese Version nicht mitganzzahligen Variablen auskommt.
Inkrementelle Version des Mittelpunkt-Algorithmus
Das lässt sich aber leicht beheben: das Vorzeichen von g(x , y)und 2g(x , y) ist ja gleich:
y := y0d := 2(y0 − y1)(x0 + 1) + (x1 − x0)(2y0 + 1) + 2x0y1 − 2x1y0for x := x0 to x1 do
Setze Pixel bei (x , y)if d < 0 then
y := y + 1d := d + 2(y0 − y1) + 2(x1 − x0)
elsed := d + 2(y0 − y1)
Zusammenfassung zum Mittelpunktalgorithmus
I Der Algorithmus wurde von Pitteway 1967 vorgestellt.I Er lässt sich auch auf andere Kurvenarten (zum Beispiel
Ellipsen) anwenden.I Für Strecken werden beim Mittelpunktalgorithmus die
gleichen Pixel gesetzt wie beim Algorithmus, der 1965 vonBresenham vorgestellt wurde (Bresenham-Algorithmus).
I Der Rechenaufwand ist linear in der Anzahl der gesetztenPixel.
Ausnutzung sich wiederholender Muster
DHDHD
Konstruktion einer geeigneten Folge
Beobachtungen:I Insgesamt braucht man ∆(x) := x1 − x0 Schritte.I Davon sind ∆(y) := y1 − y0 Diagonalschritte.I Die restlichen ∆(x)−∆(y) Schritte sind Horizontalschritte.
Natürlich gibt es eine solche Folge:
H(∆(x)−∆(y))D∆(y)
Aber diese liefert in den meisten Fällen keine brauchbareDarstellung der gegebenen Strecke.
Der Algorithmus von Brons
Wir nehmen an: ∆(x) und ∆(y) sind teilerfremd.
∆(x) = 15
∆(y) = 9
Ansonsten zerlegen wir die Strecke in ggt(∆(x),∆(y))Abschnitte.
Beispiel Anwendung des Algorithmus von Brons
Endpunkte: (x0, y0) = (0,0) und (x1, y1) = (82,34)
1. ∆(x) = 82, ∆(y) = 342. ggt(82,34) = 2, also teilen wir H24D17 auf.3. 24 = 1 · 17 + 7, also teilen wir (HD)10(H2D)7 auf.4. 10 = 1 · 7 + 3, also teilen wir (HDH2D)4((HD)2H2D)3 auf.5. 4 = 1 · 3 + 1, also wird
(HDH2D(HD)2H2D)2((HDH2D)2(HD)2H2D)
ausgegeben.
Zusammenfassung Algorithmus von Brons
I Im Wesentlichen handelt es such um den euklidischenAlgorithmus zur Berechnung des größten gemeinsamenTeilers.
I Bei entsprechend kompakter Speicherung der Ausgabeerreicht man somit theoretisch eine Laufzeit dielogarithmisch in der Anzahl der zu setzenden Pixel ist.
I Praktisch ergeben sich dann aber eine Reihe vonSchwierigkeiten: Wie kommt man z.B. schnell von derkompakt gespeicherten Folge zur gerasterten Strecke?
Pixeldichte einer Strecke
99 = 1 9√
85≈ 0.976 9√
29≈ 0.707
Pixeldichte allgemein:
∆(x)√∆(x)2 + ∆(y)2
Problem unterschiedlicher Pixeldichte
I Eine teilweise Lösung des Problems ist die Verwendungvon verschiedenen Intensitäten für verschiedeneSteigungen.
I Das hat aber auch Nachteile. Zum Beispiel wird dadurchdie Gesamtintensität des Bildes gemindert.
Unterschiedliche Linienstile
Eine sehr einfache Möglichkeit zur Beschreibung vonLinienstilen sind Bitmasken:
1 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1
Dabei treten aber ähnliche Probleme auf wie bei derPixeldichte.
Aliasing
Durch das Rastern entstehen manchmal Strukturen, die imbesten Falle einfach unschön aussehen, im schlimmsten FallMuster vorgaukeln, die es im ungerasterten Objekt gar nichtgab.
Antialiasing
Auch diesem Effekt kann man durch Verwendung von Pixelnunterschiedlicher Intensität entgegenwirken.
Antialiasing durch unweighted area sampling
R
pQ(p)
Die Intensität ist proportional dem Flächeninhalt desDurchschnitts von:
I Sampling-Quadrat Q(p) undI Rechteck R, welches die gegebene Strecke umschließt
Heuristik zum unweighted area sampling
I Die Berechnung des exakten Flächeninhalts ist in derPraxis oft zu aufwendig.
I Heuristik: Überziehe Q(p) mit einem Punktegitter undzähle Gitterpunkte in R.
RQ(p)
Zeichnen breiter Linien durch Pixelreplikation
Einfachster Ansatz: Man setzt oberhalb und unterhalb jedesgesetzten Pixels weitere k Pixel.
Dabei hat man auch mit den schon besprochenen ProblemenPixeldichte und Aliasing zu kämpfen.
Weitere Ansätze zum Zeichnen breiter LinienI Verwendung eines Zeichenstifts (Verallgemeinerung der
Pixelreplikation).Die Spitze des Zeichenstifts, insbesondere seine Breite,sind beliebig wählbar.Gesetzt werden alle Pixel, die die Spitze erreicht, wennman sie entlang der gegebenen Strecke führt.
Spitze
I Strecken können auch gleich als auszufüllenden Polygonebetrachtet werden.
Rasterung von Polygonen
Welche Pixel sollen gesetzt werden?
?
?ungerade: Pixel setzen
gerade: Pixel nicht setzen
Verwendung der Odd-Parity-Regel.
Scan-line Algorithmus
I Für jedes Pixel extra festzustellen, ob es gesetzt werdensoll oder nicht, ist zu aufwendig.
I Man arbeitet zeilenweise von links nach rechts und merktsich den gegenwärtigen Zustand (gerade oder ungerade)
Technische Details
I Korrekte Bestimmung und Behandlung der Schnittpunktezwischen scan-line und gegebenem Polygon.
I Aliasing
Spezialfall Dreiecke
Für Dreiecke bietet es sich manchmal an, sogenanntebaryzentrische Koordinaten zu verwenden.
a
b
cp
I Für jeden Punkt p in der Ebene gibt es eindeutigbestimmte α, β, γ ∈ R mit α + β + γ = 1 undp = αa + βb + γc (affine Kombination).
I p liegt liegt im Dreieck mit Ecken a,b, c genau dann, wennα, β, γ alle nicht negativ sind (konvexe Kombination).
Einfache Anwendung: Interpolation der Pixelintensität
Jede der Ecken a,b, c hat eine Intensität Ia, Ib, Ic .
for all x dofor all y do
Berechne Koordinaten (α, β, γ) für den Punkt p = (x , y)if (α ≥ 0 and β ≥ 0 and γ ≥ 0) then
Ip := αIa + βIb + γIcSetze das Pixel am Punkt p mit Intensität Ip.
Effizienter: Schleifen nur über (x , y) im kleinstenumschließenden Rechteck (bounding box):