Rasterung von zweidimensionalen...

Preview:

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):

Recommended