diff --git a/Computergrafik - Cheatsheet.pdf b/Computergrafik - Cheatsheet.pdf index 3de0ee4..9eb642a 100644 Binary files a/Computergrafik - Cheatsheet.pdf and b/Computergrafik - Cheatsheet.pdf differ diff --git a/Computergrafik - Cheatsheet.tex b/Computergrafik - Cheatsheet.tex index 6c08c17..cd10d2b 100644 --- a/Computergrafik - Cheatsheet.tex +++ b/Computergrafik - Cheatsheet.tex @@ -154,47 +154,47 @@ $(a,b,c,d)$ wobei $(a,b,c)=(nx,ny,nz)$ und $d$ der Abstand der Ebene zum Ursprung \begin{itemize*} \item Ebene definiert durch 3 Punkte - $$\begin{pmatrix} - x_1 & x_2 & x_3 & 0 \\ - y_1 & y_2 & y_3 & 0 \\ - z_1 & z_2 & z_3 & 0 \\ - 1 & 1 & 1 & 1 - \end{pmatrix}$$ + $$\begin{pmatrix} + x_1 & x_2 & x_3 & 0 \\ + y_1 & y_2 & y_3 & 0 \\ + z_1 & z_2 & z_3 & 0 \\ + 1 & 1 & 1 & 1 + \end{pmatrix}$$ \item Translation um Vektor $(\Delta x, \Delta y,\Delta z)$ - $$\begin{pmatrix} - 1 & 0 & 0 & \Delta x \\ - 0 & 1 & 0 & \Delta y \\ - 0 & 0 & 1 & \Delta z \\ - 0 & 0 & 0 & 1 - \end{pmatrix}$$ + $$\begin{pmatrix} + 1 & 0 & 0 & \Delta x \\ + 0 & 1 & 0 & \Delta y \\ + 0 & 0 & 1 & \Delta z \\ + 0 & 0 & 0 & 1 + \end{pmatrix}$$ \item Skalierung um Faktor $F_x,F_y,F_z$ - $$\begin{pmatrix} - F_y & 0 & 0 & 0 \\ - 0 & F_y & 0 & 0 \\ - 0 & 0 & F_z & 0 \\ - 0 & 0 & 0 & 1 - \end{pmatrix}$$ + $$\begin{pmatrix} + F_y & 0 & 0 & 0 \\ + 0 & F_y & 0 & 0 \\ + 0 & 0 & F_z & 0 \\ + 0 & 0 & 0 & 1 + \end{pmatrix}$$ \item Rotation um z-Achse - $$\begin{pmatrix} - cos(\theta) & -sin(\theta) & 0 & 0 \\ - sin(\theta) & \cos(\theta) & 0 & 0 \\ - 0 & 0 & 1 & 0 \\ - 0 & 0 & 0 & 1 - \end{pmatrix}$$ + $$\begin{pmatrix} + cos(\theta) & -sin(\theta) & 0 & 0 \\ + sin(\theta) & \cos(\theta) & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 1 + \end{pmatrix}$$ \item Rotation um die x-Achse - $$\begin{pmatrix} - 1 & 0 & 0 & 0 \\ - 0 & cos(\theta) & -sin(\theta) & 0 \\ - 0 & sin(\theta) & cos(\theta) & 0 \\ - 0 & 0 & 0 & 1 - \end{pmatrix}$$ + $$\begin{pmatrix} + 1 & 0 & 0 & 0 \\ + 0 & cos(\theta) & -sin(\theta) & 0 \\ + 0 & sin(\theta) & cos(\theta) & 0 \\ + 0 & 0 & 0 & 1 + \end{pmatrix}$$ \item Rotation um die y-Achse - $$\begin{pmatrix} - cos(\theta) & 0 & sin(\theta) & 0 \\ - 0 & 1 & 0 & 0 \\ - -sin(\theta) & 0 & cos(\theta) & 0 \\ - 0 & 0 & 0 & 1 - \end{pmatrix}$$ + $$\begin{pmatrix} + cos(\theta) & 0 & sin(\theta) & 0 \\ + 0 & 1 & 0 & 0 \\ + -sin(\theta) & 0 & cos(\theta) & 0 \\ + 0 & 0 & 0 & 1 + \end{pmatrix}$$ \end{itemize*} \paragraph{Kameratransformation} @@ -220,11 +220,11 @@ \item Projektionsrichtung hat zwei Freiheitsgrade und ist typischerweise nicht orthogonal zur Projektionsebene \item Projektionsrichtung (Schiefe) ist über 2 Winkel parametrisierbar \item Herleitung $P=\begin{pmatrix} - 1 & 0 & -cos(\alpha)*f & 0 \\ - 0 & 1 & -sin(\alpha)*f & 0 \\ - 0 & 0 & 0 & 0 \\ - 0 & 0 & 0 & 1 - \end{pmatrix}$ + 1 & 0 & -cos(\alpha)*f & 0 \\ + 0 & 1 & -sin(\alpha)*f & 0 \\ + 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 1 + \end{pmatrix}$ \item es gilt: $x'=x-cos(\alpha)*f*z$ und $y'=y-sin(\alpha)*f*z$ \end{itemize*} @@ -234,10 +234,10 @@ \item Augpunkt im Ursprung des Kamerakoordinatensystems \item Projektionsfläche ist eine Ebene parallel zu XY Ebene \item Eigenschaften - \begin{itemize*} - \item perspektivische Verkürzung - \item parallele Linien des Objekts fluchten oft in einen Fluchtpunkt - \end{itemize*} + \begin{itemize*} + \item perspektivische Verkürzung + \item parallele Linien des Objekts fluchten oft in einen Fluchtpunkt + \end{itemize*} \end{itemize*} $$\begin{pmatrix} d&0&0&0\\ 0&d&0&0 \\ 0&0&0&1 \\ 0&0&1&0 \end{pmatrix} * \begin{pmatrix}x\\y\\z\\1\end{pmatrix} = \begin{pmatrix} d*x\\ d*y\\ 1 \\ z \end{pmatrix} \rightarrow \begin{pmatrix} \frac{d*x}{z} \\ \frac{d*y}{z} \\ \frac{1}{z} \end{pmatrix}$$ @@ -252,8 +252,6 @@ \newpage \section{Modellierung} - \subsection{Geometrische Modellierung} - computergestütze Beschreibung der Form geometrischer Objekte \paragraph{Boundary Representation (B-Rep)} \begin{itemize*} @@ -261,13 +259,13 @@ \item Darstellungsform eines Flächen- oder Volumenmodells \item sind schnell verarbeitbar \item Definition des Ojekts über vef-Graph (vertex, edge, face) - \begin{itemize*} - \item Knotenliste: beinhaltet Koordinatenpunkt - \item Kantenliste: pro Kante zwei Punkte referenziert - \item Flächenliste: pro Fläche die Reihenfolge der Kanten - \end{itemize*} - \item Szene: dreidimensionale Beschreibung von Objekten, Lichtquellen und Materialeigenschaften mit virtuellen Betrachter - \item Szenegraph: hierarchische Gruppierung der Objekte in einer Szene + \begin{itemize*} + \item Knotenliste: beinhaltet Koordinatenpunkt + \item Kantenliste: pro Kante zwei Punkte referenziert + \item Flächenliste: pro Fläche die Reihenfolge der Kanten + \end{itemize*} + \item Szene: dreidimensionale Beschreibung von Objekten, Lichtquellen und Materialeigenschaften mit Betrachter + \item Szenegraph: Gruppierung der Objekte in einer Szene \end{itemize*} \subsection{Rendering} @@ -278,47 +276,39 @@ \item verarbeitet alle Eckpunkte (Vertices) mit Shader \item ermöglicht eine Beeinflussung der Objektform \item Transformation der 3D Position auf 2D Koordinaten - \item Input - \begin{itemize*} - \item Vertices relevanter Objekte der Szene - \item gewünschte Transformation - \end{itemize*} - \item Output - \begin{itemize*} - \item auf Bildschirm projizierte 2D Koordinaten - \item zugehörige Tiefeninformationen - \end{itemize*} + \item Input: Vertices relevanter Objekte der Szene; gewünschte Transformation + \item Output: auf Bildschirm projizierte 2D Koordinaten und zugehörige Tiefeninformationen \end{itemize*} \paragraph{Model View Projection} \begin{itemize*} \item Gegeben - \begin{itemize*} - \item Modell als Vertices mit kartesischen 3D Koordinaten und definierten Dreiecken - \item betrachtende Kamera (3D Position, Ausrichtung) - \end{itemize*} + \begin{itemize*} + \item Modell als Vertices mit kartesischen 3D Koordinaten und definierten Dreiecken + \item betrachtende Kamera (3D Position, Ausrichtung) + \end{itemize*} \item Umsetzung - \begin{enumerate*} - \item $M=T*R*S$ Transformation von Modellraum in Weltkoordinaten (Model) - \item $V=T_V^{-1}*R_V^{-1}$ Transformation in Kameraraum (View) - \item Projektion auf Kamerabildebene und Umrechnung in Bildraum (Projektion) - \end{enumerate*} + \begin{enumerate*} + \item $M=T*R*S$ Transformation von Modellraum in Weltkoordinaten (Model) + \item $V=T_V^{-1}*R_V^{-1}$ Transformation in Kameraraum (View) + \item Projektion auf Kamerabildebene und Umrechnung in Bildraum (Projektion) + \end{enumerate*} \item Ergebnis - \begin{itemize*} - \item MVP-Matrix $P*V*M=MVP_{Matrix}$ - \item Anwendung der MVP ergibt Bildraumprojektion des Modells $p'_m=P*V*M*p_m$ - \item MVP-Matrix muss nur einmal berechnet werden - \end{itemize*} + \begin{itemize*} + \item MVP-Matrix $P*V*M=MVP_{Matrix}$ + \item Anwendung der MVP ergibt Bildraumprojektion des Modells $p'_m=P*V*M*p_m$ + \item MVP-Matrix muss nur einmal berechnet werden + \end{itemize*} \end{itemize*} \subsection{Effiziente geometrische Datenstrukturen} \paragraph{Bintree} \begin{itemize*} - \item effizientes Suchen und Einfügen in eindimensionale Domänen + \item Suchen und Einfügen in eindimensionale Domänen \item logarithmische Komplexität pro Zugriff möglich \item Gefahr: lineare Komplexität, wenn nicht balanciert \item typisch Teilung in Mitte (bisektion) - \item Bereiche mit homogenem Inhalt (gleiche Farbe) werden nicht weiter unterteilt + \item Bereiche mit homogenem Inhalt werden nicht unterteilt \item Komprimierungseffekt \end{itemize*} @@ -335,7 +325,7 @@ \item Objekte in hierarchische Strukturen einsortiert \item jeder Knoten hat 0 oder 8 Kindknoten (8 Unterbereiche) \item beschleunigte räumliche Suche - \item Zeitaufwand Tiefe des Baumes $O(log n)$ + \item Zeitaufwand Tiefe des Baumes $O(\log n)$ \end{itemize*} \paragraph{KD Tree} @@ -346,18 +336,17 @@ \item jeder neue Punkt teilt den Bereich in dem er einsortiert wird; pro Hierarchiestufe stets wechsel der Teilungsrichtung \item ein Octree lässt sich auf einen kd-Baum abbilden, beide Baumarten haben vergleichbare Eigenschaften \item Median-Cut Strategie: Teilung in zwei gleichgroße Hälften - \begin{itemize*} - \item Baum garantiert balanciert und Tiefe minimal - \item $O(\log n)$ Verhalten garantiert - \item Probleme bei lokalen Häufungen (Cluster) - \item vollständig balanciert - \item unnötige Unterteilung weit weg (Artefakt) - \end{itemize*} + \begin{itemize*} + \item Baum garantiert balanciert und Tiefe minimal + \item $O(\log n)$ Verhalten garantiert + \item Probleme bei lokalen Häufungen (Cluster) + \item unnötige Unterteilung weit weg (Artefakt) + \end{itemize*} \item Middlecut-Strategie: - \begin{itemize*} - \item nicht balanciert - \item keine Unterteilung weit weg vom Cluster - \end{itemize*} + \begin{itemize*} + \item nicht balanciert + \item keine Unterteilung weit weg vom Cluster + \end{itemize*} \item Kompromiss Strat.: Mischung zwischen Median und Mitte \end{itemize*} @@ -366,37 +355,37 @@ \item Verallgemeinerung des kd-Baums \item Trennebenen nicht nur achsenparallel \item Unterteilung in beliebigen Richtungen, adaptiv an Modellflächen angepasst - \item Trennebenen die an einer Objektebene anliegen können dennoch weiter wegliegende Objekte schneiden. + \item Trennebenen die an einer Objektebene anliegen können dennoch weiter weg liegende Objekte schneiden. \item führt bei konvexen Polyedern zu entarteten Bäumen \end{itemize*} \paragraph{Hüllkörper Hierarchie} \begin{description} - \item[AABB] (Axia-Aligned-Bounding-Box) sehr einfache Abfrage (nur ein Vergleich < in jeder Koordinatenrichtung, wie bei kd-Baum) einfach zu erstellen (min, max), dafür nicht optimale Packungsdichte bei schräger Lage der Objekte + \item[AABB] (Axia-Aligned-Bounding-Box) sehr einfache Abfrage (nur ein Vergleich $<$ in jeder Koordinatenrichtung, wie bei kd-Baum) einfach zu erstellen (min, max), dafür nicht optimale Packungsdichte bei schräger Lage der Objekte \item[OBB] (Oriented Bounding Boxes) passen sich besser der räumlichen Ausrichtungen an, lassen sich auch leicht transformieren (Rotation bei Animation). Jedoch schwieriger zu erstellen (Wahl der Richtung), komplexere Überlappungsberechnung (Transformation, Ebenengleichung). Typischerweise weniger tief, weniger räumliche Abfragen dafür wesentlich mehr Berechnungsaufwand pro Rekursionsstufe. \item[KDOP] (k-dim. Discretly Oriented Polytopes) Polyeder mit festen vorgegebenen Richtungen (z.B. 45 Grad). Eigenschaften zwischen AABB und OBB. Bessere Raumausnützung als AABB, weniger Transformationene als OBB. - \item[BS] (Bounding Spheres) Schnelle 3D Überlappungstest (Abstand der Mittelpunkte < Summe der Radien). Langgezogene Objekte können mit mehreren Hüllkugeln begrenz werden um besseren Füllgrad zu erreichen. BS sind bis auf die Lage der Kugelmittelpunkte invariant gegenüber Rotation (geeignet für Kollisionserkennung bewegter Objekte/Animation). + \item[BS] (Bounding Spheres) Schnelle 3D Überlappungstest (Abstand der Mittelpunkte $<$ Summe der Radien). Langgezogene Objekte können mit mehreren Hüllkugeln begrenz werden um besseren Füllgrad zu erreichen. BS sind bis auf die Lage der Kugelmittelpunkte invariant gegenüber Rotation (geeignet für Kollisionserkennung bewegter Objekte). \item[weitere Anwendungsfälle] Kollisionserkennung in Computeranmiation. Reduktion der potenziellen Kollisionspaare durch räumliche Trennung. Beschleunigung des Echtzeitrenderings großer Datenmengen. Reduktion des Aufwands durch Culling (Weglassen) \end{description} \paragraph{Ray Picking mit KD Baum} \begin{itemize*} - \item Vorverarbeitun von Objekten (Dreiecken) im kd-Baum $O(n \log n)$ + \item Vorverarbeitung von Objekten im kd-Baum $O(n \log n)$ \item Strahl/Objektschnitt: als rekursive Suche im kd-Baum - \item `treeIntersect(p,d)`: Findet Schnittpunkt des Strahls (Punkt p, Richtung d) mit den im Baum gepseicherten Dreiecken und liefert die Beschreibung des nächsten Schnittpunktes bzw t=unendlich, falls kein Schnittpunkt existiert - \item `triangleIntersect(node,p,d)`: Findet Schnittpunkt des Strahles (Punkt p, Richtung d) mit einer Menge von Dreiecken in node - \item `subdivide(node, p, d, tmin, tmax)`: Findet rekursiv den nächstgelegenen Schnittpunkt (kleinstes t) des Strahls (p,d) mit den Dreiecken in oder unterhalb von node im Parameterbereich tmin ...tmax + \item $treeIntersect(Punkt,Richtung)$: Findet Schnittpunkt des Strahls mit den im Baum gespeicherten Dreiecken und liefert Beschreibung des nächsten Schnittpunktes bzw. t=unendlich, falls kein Schnittpunkt existiert + \item $triangleIntersect(node,Punkt,Richtung)$: Findet Schnittpunkt des Strahles mit Menge von Dreiecken in node + \item $subdivide(node, p, d, t_{min}, t_{max})$: Findet rekursiv den nächstgelegenen Schnittpunkt (kleinstes t) des Strahls (p,d) mit den Dreiecken in oder unterhalb von node im Parameterbereich $t_{min} ...t_{max}$ \end{itemize*} \paragraph{Aufwandsabschätzung bzgl Dreiecksanzahl} \begin{enumerate*} - \item (beinahe) konvexes Objekt (max 2 Schnitte): hat die Komplexität einer räumlichen Punktsuche, also dem Aufwand zur Untersuchung einer Baumzelle (finden + dortige Dreiecke testen) $O(\log n)$ + \item (beinahe) konvexes Objekt (max. 2 Schnitte): hat die Komplexität einer räumlichen Punktsuche, also dem Aufwand zur Untersuchung einer Baumzelle (finden + dortige Dreiecke testen) $O(\log n)$ \item Polygonnebel (viele kleine Dreiecke im Such-Volumen) - \begin{itemize*} - \item Annahme: alle Zellen enthalten konstante kleine Anzahl von Dreiecken $\rightarrow$ Aufwand proportional zur Anzahl durchlaufener Baumzellen - \item Anzahl dieser Zellen ist proportional zur Länge des Strahls durchs Volumen, da der 1. Schnitt sehr wahrscheinlich mitten im Volumen oder gar nicht stattfindet $\rightarrow$ Anzahl ist proportional zur Seitenlänge des Suchvolumens - \item bei n Dreiecken im Suchvolumen ist die Anzahl t der zu untersuchenden Zellen also ca $t=O(\sqrt{n})$ $\rightarrow$ Suchaufwand pro Strahl folglich $O(\sqrt{n} \log (n))$ - \end{itemize*} + \begin{itemize*} + \item Annahme: alle Zellen enthalten konstante kleine Anzahl von Dreiecken $\rightarrow$ Aufwand proportional zur Anzahl durchlaufener Baumzellen + \item Anzahl dieser Zellen ist proportional zur Länge des Strahls durchs Volumen, da der 1. Schnitt sehr wahrscheinlich mitten im Volumen oder gar nicht stattfindet $\rightarrow$ Anzahl ist proportional zur Seitenlänge des Suchvolumens + \item bei n Dreiecken im Suchvolumen ist die Anzahl t der zu untersuchenden Zellen also ca $t=O(\sqrt{n})$ $\rightarrow$ Suchaufwand pro Strahl folglich $O(\sqrt{n} \log (n))$ + \end{itemize*} \end{enumerate*} \paragraph{Aufwandsabschätzung in fps} @@ -411,22 +400,22 @@ \paragraph*{Heurisitk zur Unterteilung} \begin{itemize*} \item Surface Area Heuristic (SAH): - \begin{itemize*} - \item Annahme: Strahl i, trifft Zelle j mit Wahrscheinlichkeit P(i,j), zudem sei $n_j$ die Anzahl Dreiecke in Zelle j - \item Aufwand für Raytracing pro Zelle proportional zur Baumtiefe ($O(\log n)$ für balancierte Bäume) sowie die Anzahl der dortigen Dreiecke $n_j$; beachte $n_j$ wird hier nicht als konstant angenommen $\rightarrow$ Gesamtaufwand für Strahl i sei also $\sum(P(i,j)*n_j)$ - \end{itemize*} + \begin{itemize*} + \item Strahl $i$, trifft Zelle $j$ mit Wahrscheinlichkeit $P(i,j)$, zudem sei $n_j$ die Anzahl Dreiecke in Zelle $j$ + \item Aufwand für Raytracing pro Zelle proportional zur Baumtiefe ($O(\log n)$ für balancierte Bäume) sowie Anzahl der dortigen Dreiecke $n_j$; $n_j$ wird nicht als konstant angenommen $\rightarrow$ Gesamtaufwand für Strahl $i$ sei also $\sum(P(i,j)*n_j)$ + \end{itemize*} \item Heuristik: große Zellen mit wenigen Dreiecken senken Gesamtaufwand - \begin{itemize*} - \item Schätzung: P(i,j) ist etwa proportional zur Oberfläche einer Zelle (auf großer Oberfläche treffen mehr Strahlen auf) - \item die SAH optimiert auf jeder Teilstufe im Baum das Produkt der Zellgröße mal Anzahl Dreiecke im Teilbaum. Für den kD-Baum gilt bei der Unterteilung des Bereichs D in Richtung k: $D_k = D_{k_links} + D_{k_rechts}$ - \end{itemize*} - \item Bei ungleicher Verteilung der Dreiecke (z.B. Cluster) enthalten dann große Zellen wenige oder keine Dreiecke und Baum ist nicht balanciert $\rightarrow$ implizite Abtrennung des Clusters vom Rest des Baums (vgl Middle-Cut-Strategie) + \begin{itemize*} + \item Schätzung: $P(i,j)$ ist proportional zur Oberfläche einer Zelle (auf großer Oberfläche treffen mehr Strahlen auf) + \item die SAH optimiert auf jeder Teilstufe im Baum das Produkt der Zellgröße mal Anzahl Dreiecke im Teilbaum. Für den kD-Baum gilt bei der Unterteilung des Bereichs D in Richtung k: $D_k = D_{k_{links}} + D_{k_{rechts}}$ + \end{itemize*} + \item Bei ungleicher Verteilung der Dreiecke enthalten dann große Zellen wenige oder keine Dreiecke und Baum ist nicht balanciert $\rightarrow$ implizite Abtrennung des Clusters vom Rest des Baums (vgl. Middle-Cut-Strategie) \end{itemize*} \paragraph{Behandlung ausgedehnter Objekte} \begin{itemize*} \item Punkte haben keine Ausdehnung und können an einem eindeutigen Ort im kD-Baum abgelegt sein - \item Ausgedehnte Objekte können räumlich mehrere Blatt- Zellen überlappen. Ein solches Objekt müsste dann in mehreren Blattzellen einsortiert sein. + \item Ausgedehnte Objekte können räumlich mehrere Blatt- Zellen überlappen. Diese Objekte müssen dann in mehreren Blattzellen einsortiert werden \end{itemize*} \begin{enumerate*} \item Auftrennung von Objekten, d.h. Objekte müssen an der Zellgrenze aufgeteilt werden. Einsortierung der Teilobjekte in passende Zellen. Geht gut für Dreiecke @@ -441,7 +430,7 @@ \subsection{ Midpoint Algorithmus} \begin{itemize*} \item Grundidee: Effizient durch Verwendung von Ganzzahlen, Vermeiden von Multiplikation/Division sowie Nutzung einer inkrementellen Arbeitsweise - \item Die Linie geht zwischen den Endpunkten nicht durch ganzzahlige Gitterpunkte. Da nur ganzzahlige Pixel-Koordinaten gesetzt werden können müssten auch zwischenpunkte zuerst genau berechnet werden und dann auf ganzzahlige Pixelwerte gerundet werden. Dies ist unzuverlässig und ineffizient. Zur Herleitung des effizienten Bresenham-Algorithmus führen wir den Mittelpunkt M als Referenzpunkt ein. Ferner seinen der jeweils aktuellen Punkt P, der rechts von im liegende E (east) und der rechts oben liegende NE north-east) benannt. + \item Die Linie geht zwischen den Endpunkten nicht durch ganzzahlige Gitterpunkte. Da nur ganzzahlige Pixel-Koordinaten gesetzt werden können müssten auch zwischenpunkte zuerst genau berechnet werden und dann auf ganzzahlige Pixelwerte gerundet werden. Dies ist unzuverlässig und ineffizient. Zur Herleitung des effizienten Bresenham-Algorithmus führen wir den Mittelpunkt M als Referenzpunkt ein. Ferner seinen der jeweils aktuellen Punkt P, der rechts von im liegende E (east) und der rechts oben liegende NE (north-east) benannt. \item die Linie wird als Funktion repräsentiert: $y=\frac{\delta y}{\delta x}*x+B$ \item implizierte Form: $d: F(x,y)=\delta y*x-\delta x*y+B*\delta x = 0$ \item für Punkte auf der Linie wird $F(x,y)=0$ @@ -449,49 +438,49 @@ \item für Punkte oberhalb der Linie wird $F(x,y)<0$ \item Herleitung mit Einschränkung: Steigung der Linie m ($-10$ wird das nächste Pixel NE, andernfalls E. \item Insgesamt acht verschiedene Fälle: - \begin{enumerate*} - \item Oktant($\delta y < \delta x$) - \item Oktant($\delta y > \delta x$) - \item Oktant($\frac{\delta y}{\delta x}< 0$) - \item Oktant($\frac{\delta y}{\delta x}< -1$) - \item -8. Oktant($\delta x < 0$) - \end{enumerate*} + \begin{enumerate*} + \item Oktant($\delta y < \delta x$) + \item Oktant($\delta y > \delta x$) + \item Oktant($\frac{\delta y}{\delta x}< 0$) + \item Oktant($\frac{\delta y}{\delta x}< -1$) + \item - 8. Oktant($\delta x < 0$) + \end{enumerate*} \end{itemize*} \paragraph{Anti Aliasing} \begin{itemize*} - \item Treffenstufeneffekt bei gerasterten Linien + \item Treppenstufeneffekt bei gerasterten Linien \item Regelmäßigkeit wird verstärkt vom Auge wahrgenommen - \item Auflösungsvermögen des Auges für Punkte sei e. Strukturen wie Linien (aus vielen Punkten) werden durch Mittelwertbildung (Fitting) vom Auge viel genauer als e lokalisiert. Eine Stufe wird umso eher erkannt, je länger die angrenzenden Segmente sind. + \item Auflösungsvermögen des Auges für Punkte sei e. Strukturen wie Linien werden durch Mittelwertbildung (Fitting) vom Auge viel genauer als e lokalisiert. Eine Stufe wird umso eher erkannt, je länger die angrenzenden Segmente sind. \item Grundidee des Anti-Aliasing - \begin{itemize*} - \item Statt der Linie wird ein Rechteck mit der Breite von einem Pixel betrachtet - \item Graustufen der darunter liegenden Pixelflächen entsprechen dem jeweiligen Überdeckungsgrad - \end{itemize*} + \begin{itemize*} + \item Statt der Linie wird ein Rechteck mit der Breite von einem Pixel betrachtet + \item Graustufen der darunter liegenden Pixelflächen entsprechen dem jeweiligen Überdeckungsgrad + \end{itemize*} \item Praktische vereinfachte/effiziente Umsetzung - \begin{itemize*} - \item Rasterkonvertierung der Linie bei doppelter örtlicher Auflösung (Supersampling) - \item Replizieren der Linie (vertikal und/oder horizontal) um Linienbreite näherungsweise zu erhalten - \item Bestimmmung des Überdeckungsgrades pro Pixel in der ursprünglichen Auflösung (Downsampling) - \item Bestimmung des Farbwertes entsprechend des Überdeckungsgrades - \end{itemize*} + \begin{itemize*} + \item Rasterkonvertierung der Linie bei doppelter örtlicher Auflösung (Supersampling) + \item Replizieren der Linie (vertikal und/oder horizontal) um Linienbreite näherungsweise zu erhalten + \item Bestimmmung des Überdeckungsgrades pro Pixel in der ursprünglichen Auflösung (Downsampling) + \item Bestimmung des Farbwertes entsprechend des Überdeckungsgrades + \end{itemize*} \item Problem: - \begin{itemize*} - \item Ausgabe von Linien/Polygonen auf Rastergeräten muss auf vorgegebenem Raster erfolgen - \item Farbvariation ist zwar möglich, Farbberechnung muss aber effizient erfolgen - \end{itemize*} + \begin{itemize*} + \item Ausgabe von Linien/Polygonen auf Rastergeräten muss auf vorgegebenem Raster erfolgen + \item Farbvariation ist möglich, muss effizient erfolgen + \end{itemize*} \item Ohne Antialiasing: - \begin{itemize*} - \item es erfolgt ein einfacher Test über die Pixelkoordinate - \item verwendet Farbe in der Pixelmitte - \end{itemize*} + \begin{itemize*} + \item es erfolgt ein einfacher Test über die Pixelkoordinate + \item verwendet Farbe in der Pixelmitte + \end{itemize*} \item Ideales Antialiasing: Hat wegen der beliebig komplexen Geometrie allgemein einen sehr/zu hohen Aufwand! - \item Ansatz für eine "reale Lösung" - \begin{itemize*} - \item eine ideale Berechnung von Farbwerten nach dem Überdeckungsgrad ist allgemein beliebig aufwendig und daher praktisch irrelevant - \item Gesucht werden Ansätze mit gut abschätzbarem/konstanten Aufwand - \item "reales" Antialiasing beruht in der Regel auf der Verwendung von mehreren Samples pro Pixel, d.h. Berechnung dieser n Samples statt nur einem (typisch: n-facher Aufwand) - \end{itemize*} + \item Ansatz für eine 'reale Lösung' + \begin{itemize*} + \item ideale Berechnung von Farbwerten nach dem Überdeckungsgrad ist praktisch irrelevant + \item Gesucht werden Ansätze mit gut abschätzbarem/konstanten Aufwand + \item beruht auf der Verwendung von mehreren Samples pro Pixel, d.h. Berechnung dieser n Samples statt nur einem (typisch: n-facher Aufwand) + \end{itemize*} \end{itemize*} \paragraph{Supersampling + Downsampling} @@ -500,202 +489,185 @@ \item Ohne Anti-Aliasing kommt pro Pixel genau eine Sampleposition zum Zuge. Das Pixel wird demnach gefärbt oder nicht gefärbt: Das sind zwei mögliche Stufen. \item Bei vier Subpixeln können minimal 0 und maximal 4 Subpixel im (Makro-)Pixel gesetzt sein, d.h. es sind 5 Intensitäten von 0\%, 25\%0, 50\%, 75\% oder 100\% möglich \item Es gibt immer eine Abstufung mehr als Subpixel pro Pixel - \item Beim idealen Antialiasing entsprechenden Flächenbedeckungsgrad gibt es "beliebig" viele Abstufungen - \item Formabhängigkeit z.B. bei 45° gibt es nur eine Zwischenstufe und zwar je nach Phasenlage mit 25\% oder 75\% $\rightarrow$ Kante "pumpt" bei Objektbewegung. + \item bei Formabhängigkeit gibt es nur eine Zwischenstufe je nach Phasenlage $\rightarrow$ Kante "pumpt" bei Objektbewegung. \end{itemize*} - + \paragraph{Supersampling + Rotated Grids} \begin{itemize*} - \item Minderung der Formabhängigkeit - \item Kleine Winkel zu den Achsen führen zu langen Stufen der Polygonkante - \item Bessere Verhältnisse der Grauabstufung ergeben sich für flache Winkel, wenn statt des ordered-grid ein rotated-grid für das Supersampling verwendet wird - \item Rotated grids sind dafür bei anderen Winkeln etwas schlechter als das ordered grid. Wird kaum wahrgenommen, da die Treppen der digitalen Geraden kürzer sind - \item Gute Grauabstufung bei sehr flachen Kanten zur Zeilen- oder Spaltenrichtung. - \item Optimaler Winkel bei ca. 20-30° z.B. $arctan(0.5) \approx 26,6^{\circ}$ - \item Sehr dünne Linien bleiben auch bei Bewegung zusammenhängend/sichtbar (Vermeidung von "Line Popping") + \item minderung der Formabhängigkeit + \item kleine Winkel führen zu langen Stufen der Polygonkante + \item bessere Verhältnisse der Grauabstufung für flache Winkel, wenn ordered-grid statt rotated-grid verwendet wird + \item Rotated grids sind bei anderen Winkeln etwas schlechter als das ordered grid. Wird kaum wahrgenommen + \item gute Grauabstufung bei sehr flachen Kanten zur Zeilen- oder Spaltenrichtung + \item optimaler Winkel bei ca. 20-30° z.B. $arctan(0.5) \approx 26,6^{\circ}$ + \item sehr dünne Linien bleiben auch bei Bewegung zusammenhängend/sichtbar (Vermeidung von "Line Popping") \end{itemize*} - + \paragraph{Supersampling + Multisampling} \begin{itemize*} \item Realisierung der Subpixelberechnung durch \item ein Superbackpuffer (großem Buffer) - \begin{itemize*} - \item Nachteil (bei rotated grid): Anpassung der Rasterkonvertierung an verschobene Positionen erforderlich - \item Vorteil: Verwendung von mehr Texturinformation (Textur wird subpixelgerecht eingetragen) - \end{itemize*} - \item mehrere Multisamplebuffer (mehrere Buffer) - \begin{itemize*} - \item Mehrfachrendering in normaler Größe mit leicht versetzter Geometrie (Vertexverschiebung pro Sub-Bild) - \item Vorteil: keine Veränderung im Rendering - \item Nachteil: nur ein Texturwert pro Makro-/Sub-Pixel - \end{itemize*} - \item Gezielter Ressourceneinsatz - \begin{itemize*} - \item Kantenglättung - \begin{itemize*} - \item Effizienzsteigerung durch Beschränkung auf reine Kantenglättung möglich - \item Anzahl der Kantenpixel oft wesentlich kleiner als Anzahl der Flächenpixel - \item Aliasing bei Mustern in Texturen schon beim Auslesen der Werte aus Pixeltextur unterdrückbar - \item Kantenpixel bekannt als separate Linien oder Berandung von Polygonen/Dreiecken - \end{itemize*} - \item adaptives Samplen: statt feste Anzahl von Samples kann die Anzahl nach dem Bedarf gesteuert werden - \end{itemize*} + \begin{itemize*} + \item Nachteil (bei rotated grid): Anpassung der Rasterkonvertierung an verschobene Positionen + \item Vorteil: Verwendung von mehr Texturinformation (Textur wird subpixelgerecht eingetragen) + \end{itemize*} + \item mehrere Multisamplebuffer (mehrere kleinere Buffer) + \begin{itemize*} + \item Mehrfachrendering in normaler Größe mit versetzter Geometrie (Vertexverschiebung pro Sub-Bild) + \item Vorteil: keine Veränderung im Rendering + \item Nachteil: nur ein Texturwert pro Makro-/Sub-Pixel + \end{itemize*} + \item Gezielter Ressourceneinsatz durch Kantenglättung + \begin{itemize*} + \item Effizienzsteigerung durch Beschränkung auf reine Kantenglättung möglich + \item Anzahl der Kantenpixel oft wesentlich kleiner als Anzahl der Flächenpixel + \item Aliasing bei Mustern in Texturen schon beim Auslesen der Werte aus Pixeltextur unterdrückbar + \item Kantenpixel bekannt als separate Linien oder Berandung von Polygonen/Dreiecken + \end{itemize*} + \item adaptives Samplen: statt feste Anzahl von Samples kann die Anzahl nach dem Bedarf gesteuert werden \end{itemize*} \paragraph{Quincunx Verfahren} \begin{itemize*} \item Überfilterung - \item 2x Multisampling mit rotated grid; der Informations- zuwachs ist durch die doppelte Anzahl von Samples gekennzeichnet - \item Information für die Kantenglättung beruht nach wie vor auf 2 Subpixeln + \item 2x Multisampling mit rotated grid; Informations- zuwachs ist durch doppelte Anzahl von Samples gekennzeichnet + \item Information für die Kantenglättung beruht auf 2 Subpixeln \item Entspricht einer zusätzlichen Tiefpass-Überfilterung. Durch die Unschärfe sehen Polygonkanten glatter aus. - \item Harte Kanten sind gar nicht mehr möglich, dadurch wird auch Zappeln an Polygonrändern reduziert - \item Aber Nachteil: Texturinformation, die nur zu 2 Subpixeln gehört, wird verschmiert! + \item Harte Kanten sind gar nicht mehr möglich, dadurch wird auch 'Zappeln' an Polygonrändern reduziert + \item Nachteil: Texturinformation, die nur zu 2 Subpixeln gehört, wird verschmiert \end{itemize*} \paragraph{Pseudozufälliges Supersampling} \begin{itemize*} - \item Kombinationen und Pseudozufälliges Supersampling - \begin{itemize*} - \item Kombination von Supersampling, Multisampling und Quincunx möglich; Gewinn hält sich in Grenzflächen - \item Bei Überwindung der für Füllrate und Bandbreite gegebenen Grenzen überwiegen die Vorteile des Supersamplings. - \item Ordered grid und rotated grid weisen bei bestimmten Strukturklassen Vor- und Nachteile auf. Die verbleibenden Artefakte wiederholen sich bei großen Flächen, so dass derartige Muster vom Menschen oft als störend empfunden werden. $\rightarrow$ aus diesen und ähnlichen Überlegungen $\rightarrow$ Ansätze für die Weiterentwicklung: - \item pseudozufällige Auswahl von Abtastmustern für das Supersampling - \item nachträgliche Abminderung regelmäßiger Strukturen durch vorsichtiges Verrauschen (Rauschfilter) - \item entfernungsabhängiges Antialiasing - \end{itemize*} + \item Kombinationen und pseudozufälliges Supersampling + \begin{itemize*} + \item Kombination von Supersampling, Multisampling und Quincunx möglich; Gewinn hält sich in Grenzflächen + \item Bei Überwindung der Grenzen für Füllrate und Bandbreite überwiegen die Vorteile des Supersamplings. + \item Ordered grid und rotated grid weisen bei bestimmten Strukturklassen Vor- und Nachteile auf. Die verbleibenden Artefakte wiederholen sich bei großen Flächen so, dass derartige Muster vom Menschen oft als störend empfunden werden + \item pseudozufällige Auswahl von Abtastmustern für das Supersampling + \item nachträgliche Abminderung regelmäßiger Strukturen durch vorsichtiges Verrauschen (Rauschfilter) + \item entfernungsabhängiges Antialiasing + \end{itemize*} \item pseudozufällig - \begin{itemize*} - \item Samples können nur an n vordefinierten Positionen stattfinden (Sample-Positionsmuster) - \item Je nach Methode werden daraus m Positionen für das Samplen zufällig ausgewählt (beachte: m < n) - \item Anzahl der Muster als kombinatorisches Problem: m aus n (ohne Wiederholungen) - \end{itemize*} + \begin{itemize*} + \item Samples können nur an n vordefinierten Positionen stattfinden (Sample-Positionsmuster) + \item Je nach Methode werden daraus m Positionen für das Samplen zufällig ausgewählt (beachte: $m < n$) + \item Anzahl der Muster als kombinatorisches Problem: m aus n (ohne Wiederholungen) + \end{itemize*} \end{itemize*} \paragraph{Downsampling} Beim Anti-Aliasing zur Glättung von Polygonkanten kommt für das Downsampling die Mittelwertbildung in Frage (lineare Filterung (2x - AA), bilineare Filterung (4x - AA)), gleichgültig ob ordered oder rotated grid. Beim pseudozufälligen Supersampling ist entsprechend der "frei gewählten" Positionen der "Subpixel" zu modifizieren (z.B. Gewichte nach Abstand der Abfragepositionen zur Makropixelposition). - \subsection{ Polygonfüllalgorithmus} \begin{itemize*} \item Ansatz - \begin{itemize*} - \item finde die Pixel innerhalb des Polygons - \item weise ihnen Farbe zu - \item dabei zeilenweises Vorgehen, pro Rasterlinie: - \item für jede Polygonkante: schneide die Polygonkante mit der aktuellen Bildzeile ($\rightarrow x_s$ ) - \item füge Schnittpunkt $x_s$ in eine Liste ein - \item sortiere Schnittpunkte der aktuellen Bildzeile in x-Richtung - \item Paritätsregel: fülle die Pixel jeweils zwischen ungeradem und nächstem geraden Schnittpunkt (Pixel zwischen geraden und ungeraden Schnittpunkten aber nicht!) - \end{itemize*} - \item Schnittpunkte in floating point zu berechnen und zu runden ist ineffizient. Wir suchen, ähnlich wie beim Bresenham-Algorithmus, einen inkrementellen Ansatz mit Ganzzahl-Arithmetik. - \item Allgemeinere Sicht auf die Füll- bzw. Auswahlstrategie: Ein Pixel wird mit der Farbe des Polygons gefüllt, das sich rechts von ihm befindet. Sollte dort eine Kante sein, so wird die Farbe des oberen Polygons verwendet. + \begin{itemize*} + \item finde die Pixel innerhalb des Polygons + \item weise ihnen Farbe zu + \item dabei zeilenweises Vorgehen pro Rasterlinie + \item für jede Polygonkante: schneide die Polygonkante mit der aktuellen Bildzeile ($\rightarrow x_s$ ) + \item füge Schnittpunkt $x_s$ in eine Liste ein + \item sortiere Schnittpunkte der Bildzeile in x-Richtung + \item Paritätsregel: fülle die Pixel jeweils nur zwischen ungeraden und nächstem geraden Schnittpunkt + \end{itemize*} + \item Schnittpunkte in floating point zu berechnen und zu runden ist ineffizient. Ähnlich wie beim Bresenham-Algorithmus, inkrementeller Ansatz mit Ganzzahl-Arithmetik + \item Allgemeine Sicht auf die Füll-/Auswahlstrategie: Ein Pixel wird mit der Farbe des Polygons gefüllt, das sich rechts von ihm befindet. Sollte dort eine Kante sein, so wird die Farbe des oberen Polygons verwendet. \item Grundsätzlich könnten beliebige Richtungen als Referenzrichtung zur Farbbestimmung gewählt werden. Dann müssten die zuvor besprochenen Regeln oder der gesamte Algorithmus entsprechend angepasst werden. \item Effiziente Ermittlung der Schnittpunkte von Polygonkante und Rasterzeile: - \begin{itemize*} - \item Polygonkanten werden stets von unten nach oben bearbeitet - \item horizontale Polygonkanten müssen nicht bearbeitet werden (geschieht in Scanline) $\rightarrow$ im Algorithmus stets m ungleich 0 - \item $d_y = y_1 - y_0$ ist stets positiv (auch nie 0) - \item $d_x = x_1 - x_0$ kann positiv und negativ sein - \item damit können 4 Bereiche unterschieden werden - \item Berechnung von x bzw y: $y=y_0+m(x-x_0)$,$y=y_0+\frac{y_1-y_0}{x_1-x_0}(x-x_0)$,$x=x_0+\frac{1}{m}(y-y_0)$, $x=x_0+\frac{x_1-x_0}{y_1-y_0}(y-y_0)$ - \item Zwar sind die x- bzw. y-Werte immer noch nicht ganzzahlig, jedoch können sie als rationale Zahlen explizit mit Zähler und Nenner repräsentiert werden. - \item Die Rundung (nächstes x oder y erreicht?) kann inkrementell ermittelt werden. - \item Die Rundungsregel für Bruchwerte hängt davon ab, ob es eine linke oder rechte Kante ist. Links wird z.B. aufgerundet (Pixel ist auf oder rechts v. der Kante). - \end{itemize*} + \begin{itemize*} + \item Polygonkanten von unten nach oben bearbeitet + \item horizontale Polygonkanten müssen nicht bearbeitet werden $\rightarrow$ $m\not=0$ + \item $d_y = y_1 - y_0$ ist stets positiv (auch nie 0) + \item $d_x = x_1 - x_0$ kann positiv und negativ sein + \item damit können 4 Bereiche unterschieden werden + \item Berechnung von x bzw y: + \begin{itemize*} + \item $y=y_0+m(x-x_0)= y_0+\frac{y_1-y_0}{x_1-x_0}(x-x_0)$, + \item$x=x_0+\frac{1}{m}(y-y_0)= x_0+\frac{x_1-x_0}{y_1-y_0}(y-y_0)$ + \end{itemize*} + \item x-/y-Werte noch nicht ganzzahlig, aber können als rationale Zahlen explizit mit Zähler und Nenner repräsentiert werden + \item Die Rundung (nächstes x oder y erreicht?) kann inkrementell ermittelt werden + \item Die Rundungsregel für Bruchwerte hängt davon ab, ob es eine linke oder rechte Kante ist. Links wird z.B. aufgerundet (Pixel ist auf oder rechts v. der Kante) + \end{itemize*} \item Edge-Tabelle: - \begin{itemize*} - \item Verkettete Liste (oder Array, siehe unten) für die nicht horizontalen Kanten. - \item Sortierung nach der Scan-Line, wo die Kanten beginnen (unteres Ende, $y_0$ ). - \item Innerhalb der Scan-Line wiederum Liste (nach $x_0$-Werten sortiert). Je nach Implementierung werden z.B. $x_0 , y_1$ , sowie Zähler und Nenner gespeichert. - \end{itemize*} + \begin{itemize*} + \item Verkettete Liste/Array für nicht-horizontalen Kanten + \item Sortierung nach der Scan-Line, wo die Kanten beginnen (unteres Ende, $y_0$ ). + \item Innerhalb der Scan-Line wieder Liste (nach $x_0$ sortiert). Je nach Implementierung werden z.B. $x_0 , y_1$ , sowie Zähler und Nenner gespeichert. + \end{itemize*} \item Active-Edge-Tabelle: - \begin{itemize*} - \item Die AET speichert alle Kanten, die die gegenwärtige Scan-Linie schneiden. - \item Die Liste hat die gleiche Struktur wie eine Zeile der ET. - \item Die Kanten werden gelöscht, wenn das obere Ende der Kante erreicht ist. - \end{itemize*} - \item Bemerkung zu Scan Convert Polygon: - \begin{itemize*} - \item Es existiert immer eine gerade Anzahl Kanten. Bei konvexen Polygonen sind immer null oder zwei Kanten in der AET. Die Sortierung ist dadurch trivial bzw. entfällt bei konvexen Polygonen. Bei vielen Grafikbibliotheken (z.B. OpenGL) beschränkt man sich auf konvexe Polygone. Nichtkonvexe Polygone müssen daher vorher in konvexe Komponenten zerlegt werden. Dafür ist das Füllen dieser Polygone danach effizienter. - \item Dieser Teil entspricht einem Schleifendurchlauf der Prozedur EdgeScan. Die Unterscheidung zwischen linker und rechter Kante wird beim Auffüllen der Pixel gemacht. - \end{itemize*} + \begin{itemize*} + \item speichert alle Kanten, die gegenwärtige Scan-Linie schneiden + \item Liste hat die gleiche Struktur wie eine Zeile der ET + \item Kanten gelöscht, wenn oberes Ende der Kante erreicht ist + \end{itemize*} + \item Bemerkung zu Scan Convert Polygon: Es existiert immer eine gerade Anzahl Kanten. Bei konvexen Polygonen sind immer null oder zwei Kanten in der AET. Die Sortierung ist dadurch trivial bzw. entfällt bei konvexen Polygonen. Bei vielen Grafikbibliotheken beschränkt man sich auf konvexe Polygone. Nichtkonvexe Polygone müssen daher vorher in konvexe Komponenten zerlegt werden. Dafür ist das Füllen dieser Polygone danach effizienter. Dieser Teil entspricht einem Schleifendurchlauf der Prozedur EdgeScan. Die Unterscheidung zwischen linker und rechter Kante wird beim Auffüllen der Pixel gemacht. \item Bemerkungen zur Effizienz - \item \begin{itemize*} - \item Der Polygonfüllalgorithmus ist zentraler Bestandteil jeder Grafikbibliothek für Rastergrafik. Für Echtzeitanwendungen ist Effizienz essentiell. Ein Polygon belegt - meistens viel mehr Pixel als es Eckpunkte bzw. Kanten besitzt. Deshalb sind effiziente per-Pixel-Operationen besonders wichtig. Der Rechenaufwand sollte folglich möglichst vermieden werden (mit fallender Priorität): - \item pro Pixel (Annahme: sehr häufig auszuführen, deshalb möglichst effizient) - \item pro Rasterzeile - \item pro Kante (hier sollte möglichst viel vorberechnet werden, um pro Rasterzeile bzw. Pixel Rechenzeit zu sparen) - \item Neben der reinen Rasterisierung des Polygons existieren Erweiterungen des inkrementellen Ansatzes für effiziente Berechnungen in der 3D-Grafik, z.B.: - \item Füllen des Z-Buffers (Tiefenwertberechnung) - \item lineare Interpolation beim Gouraud Shading (Farbwertberechnungen) - \end{itemize*} + \begin{itemize*} + \item Ein Polygon belegt meist mehr Pixel als es Eckpunkte/Kanten besitzt. Deshalb sind effiziente per-Pixel-Operationen wichtig. Der Rechenaufwand sollte vermieden werden (fallende Priorität) für: + \item pro Pixel (sehr häufig auszuführen) + \item pro Rasterzeile + \item pro Kante (möglichst viel vorberechnen, um pro Rasterzeile/Pixel Rechenzeit zu sparen) + \end{itemize*} + \item Erweiterungen des inkrementellen Ansatzes für effiziente Berechnungen in der 3D-Grafik, z.B.: + \item Füllen des Z-Buffers (Tiefenwertberechnung) + \item lineare Interpolation beim Gouraud Shading (Farbwertberechnungen) \end{itemize*} \paragraph{Füllmuster} \begin{itemize*} - \item Füllen eines Polygons mit einem Pattern statt mit einem konstanten Farbwert + \item Füllen eines Polygons mit Pattern statt konstanten Farbwert \item benutze dazu BITMAPs \item 2-dimensionales Array \item besteht aus M Spalten und N Zeilen - \item BITMAP = ARRAY [0 · · · M - 1, 0 · · · N - 1] + \item $BITMAP = ARRAY [0... (M-1), 0...(N-1)]$ \end{itemize*} - \begin{lstlisting} - drawPoly(Polygon poly, Pattern pat){ - foreach pixelPosition x, y in poly - poly.set(x, y, pat[x mod pat.width, y mod pat.height]); - } - \end{lstlisting} \paragraph{Dithering} \begin{itemize*} - \item Grundidee: Ersetzen "genauer" Farbwerte durch grobe Quantisierung + \item Ersetzen 'genauer' Farbwerte durch grobe Quantisierung \item gegeben sei Tabelle von im Output zulässigen Farben - \item Durchlaufen aller Pixel (mit genauen Werten) beginnend links oben - \item pro Pixel P die beste Ersetzung in Tabelle finden + setzen - \item verursachten Fehler $\delta$ jeweils nach Schema auf unbearbeitete Nachbarpixel in der (noch) genauen Repräsentation verteilen + \item Durchlaufen aller Pixel beginnend links oben + \item pro Pixel P die beste Ersetzung in Tabelle finden \& setzen + \item verursachten Fehler $\delta$ jeweils nach Schema auf unbearbeitete Nachbarpixel in der Repräsentation verteilen \item bei kleinen Bildern mit hoher Auflösung ist Dithering kaum wahrnehmbar \end{itemize*} - Dithering vs. Anti-Aliasing: + + \paragraph{Dithering vs. Anti-Aliasing} \begin{itemize*} - \item sind komplementär zueinander - \item Anti-Aliasing erhöht die empfundene räumlich Auflösung durch Anwendung von Zwischenwerten in der Grau-, bzw. Farbabstufung - \item Dithering erhöht die Farbauflösung (verringert die empfundene Farbquantisierung) durch das Verteilen des Quantisierungsfehlers auf mehrere Pixel $\rightarrow$ Verringerung der räumlichen Auflösung + \item komplementär zueinander + \item A.A. erhöht empfundene räumlich Auflösung durch Anwendung von Zwischenwerten in der Grau-/Farbabstufung + \item Dithering erhöht Farbauflösung (verringert empfundene Farbquantisierung) durch Verteilen des Quantisierungsfehlers auf mehrere Pixel $\rightarrow$ Verringerung der räumlichen Auflösung \end{itemize*} \section{Farbräume} \subsection{ Farbwahrnehmung - Phänonmenologie} \begin{itemize*} - \item Hell- und Farbempfinden als Sinneseindruck beschreiben. Einiges kann dadurch bereits qualitativ erschlossen werden - \item Tageslicht kann als weiß bzw grau mit unterschiedlichen Helligkeiten, jedoch unbunt (farblos) empfunden werden + \item Hell- und Farbempfinden als Sinneseindruck beschrieben + \item Tageslicht als weiß/grau mit unterschiedlichen Helligkeiten aber farblos empfunden \item Abwesenheit von Licht wird als schwarz empfunden - \item Regenbogen wird als bunt mit verschiedenen Farbtönen empfunden + \item Regenbogen bunt mit verschiedenen Farbtönen empfunden \end{itemize*} \begin{description} \item[Farbton (Hue)] \begin{itemize*} - \item Zwischen den grob unterscheidbaren Farbtönen des Regenbogens lassen sich zwischenstufen orten, welche eine praktisch stufenlose Farbpalette ergeben + \item Farbpalette aus abstufung grober Farbtöne \item direkt nebeneinanderliegende Farben im Farbspektrum werden als ähnlich empfunden - \item wieder andere Farben werden als sehr unterschiedlich empfunden - \item mit dieser Beobachtung lassen sich Farbwerte ordnen (Dimensionen des Farbtons als eine der Dimensionen zur Beschreibung von Farbwerten) - \item All diese Farben ist jedoch gemein, dass sie als sehr bunt empfunden werden (voll gesättigte Farben im Gegensatz zu Grautönen) + \item Farbwerte lassen sich ordnen + \item als bunt empfunden (voll gesättigte Farben im Gegensatz zu Grautönen) \end{itemize*} \item[Farbsättigung (Saturation)] \begin{itemize*} - \item Zwischen bunten Farben und Grau lassen sich Zwischenstufen finden - \item Pastelltöne sind zwar weniger bunt aber nicht völlig farblos (Farbwerte sind noch unterscheidbar) + \item Stufen zwischen Bunt und Grau + \item Pastelltöne sind weniger bunt aber nicht farblos \item Grauton (keine Farbwerte unterscheidbar) - \item zu jedem einzelnen bunten Farbton können Abstufungen von Pastelltönen bis zum gänzlich unbunten Grau zugeordnet werden - \item diese Abstufung nennen wir Sättigung der Farbe - \item Links maximal gesättigte Farbe, rechts völlig ungesättigte Farbe (grau) - \item In jeder Zeile wird der gesättigte Farbton als nicht prinzipiell anders als die zugehörige Pastellfarbe empfunden (aber weniger bunt) nur weniger gesättigt + \item jedem Farbton können Abstufungen bis Grau zugeordnet werden \end{itemize*} \item[Helligkeitsstufen (Lightness)] \begin{itemize*} - \item Zu jedem Farbton (gesättigt oder nicht) können unterschiedliche Helligkeitsabstufungen bis zum tiefen Schwarz zugeordnet werden - \item links maximale Helligkeit, rechts dunkelster Wert (schwarz) - \item in jeder Zeile werden die hellen Farbtöne als nicht prinzipiell anders als die zugehörigen dunkleren Farbtöne empfunden - \item im schwarzen sind ebenfalls keine Farbtöne mehr unterscheidbar + \item unterschiedliche Helligkeitsabstufungen bis Schwarz + \item im Schwarzen sind keine Farbtöne mehr unterscheidbar \end{itemize*} \end{description} @@ -705,89 +677,80 @@ \item Farbton: Hue \item Sättigung: Saturation \item Helligkeit: Lightness/Brightness/Value/Intensity - \item Da sich die Dimension des Farbtons periodisch wiederholt wird das System oft als Winkelkoordinate eines Polarkooridnaten-Systems in der HS-Ebene, bzw dreidimensional als Zylinderkoordinaten HSl darstellt. - \item Darstellungsformen: Die Darstellungsform des HSL Farbraums ist nicht fest vorgeschrieben. Eine Darstellung als (Doppel)-Kegel oder sechseitige (Doppel-) Pyramide ist ebenso möglich. - \item Der HSl Farbraum entspricht zumindest grob unserer Farbwahrnehmung. Daher eignet er sich zur intuitiven und qualitativen Einstellung von Farben in Illustrationsgrafiken + \item Dimension des Farbtons wiederholt sich periodisch + \item darstellung als Winkelkoordinate eines Polarkoordinaten-Systems in der HS-Ebene oder dreidimensional als Zylinderkoordinaten HSL darstellt. + \item Darstellungsformen nicht fest vorgeschrieben. Eine Darstellung als (Doppel)-Kegel oder sechseitige (Doppel-) Pyramide ist ebenso möglich + \item Der HSL Farbraum entspricht grob unserer Farbwahrnehmung. Daher geeignet zur intuitiven und qualitativen Einstellung von Farben in Illustrationsgrafiken \item Relative Skala 0-255 - \item Quantisierbarkeit der Farben und Helligkeit z.B. beruhend auf physiologischen Messungen + \item Quantisierbarkeit der Farben und Helligkeit \item Bezug zur Physik des Lichtes (Energie, Spektrum) \end{itemize*} + \paragraph{RGB Farbraum} \begin{itemize*} \item Hypothese, dass Farbsehen auf drei Arten von Sinneszellen beruht (rot, grün, blau) (Young) \item Farbwahrnehmungen durch drei beliebige, linear unabhängige Größen darstellbar (Graßmann) - \item Im Auge sind Zäpfchen, welche mit unterschiedlicher Empfindlichkeit auf die verschiedenen Wellenlängen des Lichtes reagieren. Es gilt: gleicher Reiz heißt gleiche Farbwahrnehmung \item Mit Grundfarben Rot, Grün und Blau können weitere Farben additiv gemischt werden \item Bestimmen der Anteile der Mischfarben - \begin{itemize*} - \item drei Empfindlichkeitskurven: R,G,B und zugehörige Lichtquellen r,g,b - \item alle 3 Lichtquellen zusammen ergeben weiß wahrgenommenes Licht: $r=g=b=1~$weiß - \item damit dreidimensionalen Farbraum (RGB-Farbraum) aufspannen - \item die Lage einer monochromatischen Lichtwelle: $x(\lambda_0)=p*r+\gamma*g+\beta*b$ - \item Achtung: hängt von Wellenlängen der verwendeten Grundfarben r,g,b (Primärvalenzen) ab. - \end{itemize*} - \end{itemize*} - - Beispiel für Reizung durch monochromatisches Licht (Laser) einer bestimmten Stärke: - \begin{itemize*} - \item $r=0,2R(\lambda)4$ - \item $y=0,5R(\lambda)+0,3G(\lambda)$ - \item $g=0,2R(\lambda)+0,5G(\lambda)$ - \item $b=0,02B(\lambda)$ + \begin{itemize*} + \item Empfindlichkeitskurven R,G,B und zugehörige Lichtquellen r,g,b + \item alle 3 Lichtquellen zusammen ergeben weis wahrgenommenes Licht: $r=g=b=1$ + \item damit 3d-Farbraum (RGB-Farbraum) aufspannen + \item Lage einer monochromatischen Lichtwelle: $x(\lambda_0)=p*r+\gamma*g+\beta*b$ + \item Achtung: hängt von Wellenlängen der verwendeten Grundfarben r,g,b (Primärvalenzen) ab. + \end{itemize*} + \item Beispiel für Reizung durch monochromatisches Licht (Laser): + \begin{itemize*} + \item $r=0,2R(\lambda)$ + \item $y=0,5R(\lambda)+0,3G(\lambda)$ + \item $g=0,2R(\lambda)+0,5G(\lambda)$ + \item $b=0,02B(\lambda)$ + \end{itemize*} + \item Intensität: $I=\frac{R+G+B}{3}$ + \item Innere Farbmischung: mischen direkt aus Grundfarben + \item Äußere Farbmischung: hinzufügen von Grundfarben zu bestehender Mischung \end{itemize*} Farberzeugung durch Mischung: $$1,9r + 0,6g = 0,38R(\lambda)+0,12R(\lambda)+0,3G(\lambda)=0,5R(\lambda)+0,3G(\lambda) = y$$ - - Innere Farbmischung: $F=p*r + \gamma*g + \beta*b$ - - Äußere Farbmischung:\\ - die gemischte Farbe Cyan wird zwar als derselbe Buntton wie die Referenzfarbe F wahrgenommen, jedoch weniger gesättigt. Um die beiden Farben gleich aussehen zu lassen wird der Referenzfarbe F etwas Rot beigemischt. Damit sind beide Farben gleich ungesättigt. Das Verfahren wird äußere Farbmischung genannt: $F=p*r + \gamma *g - \beta *b$. - Um die aus Blau und Grün gemischte Farbe Cyan voll gesättigt aussehend zu lassen, müsste Rot aus der Mischfarbe subtrahiert werden. Dies ist allerdings technisch nicht realisierbar. Durch die negative Farbvalenz wird das Modell jedoch theoretisch konsistent und es lassen sich alle Farben durch Mischen von Rot, Grün und Blau darstellen. Daraus wird ein vollstänfiges RGB-Farbmodell abgeleitet. - Idee: \begin{itemize*} - \item es werden drei linear-unabhängige Größen benötigt - \item zur beschreibung der Farbempfindung - \item zur (technischen) Reproduktion der Farbempfindung + \item drei linear-unabhängige Größen benötigt, zur Beschreibung und (technischen) Reproduktion der Farbempfindung \item zunächst werden folgende Werte gewertet + \begin{itemize*} \item die additive Mischung als Reproduktionsmethode \item drei Primärfarben Rot, Grün, Blau \item drei linear unabhängige Größen spannen stets einen 3D Raum auf + \end{itemize*} \item die RGB Werte werden den drei ortogonalen Achsen dieses Raumes zugeordnet \end{itemize*} Darstellung des RGB Farbraums: \begin{itemize*} - \item alle mit drei Farblichtquellen technisch (additiv) erzeugbaren Farben liegen innerhalb eines Würfels - \item Im Koordinatenursprung befindet sich Schwarz, diagonal gegenüber weiß. + \item alle technisch/additiv erzeugbaren Farben liegen innerhalb eines Würfels + \item Im Koordinatenursprung befindet sich Schwarz \item auf der Raumdiagonalen liegen dazwischen die Graustufen \end{itemize*} - Bei entsprechender Normierung liegen die vom RGB Farbsynthesesystem erzeugbare Farben im Einheitswürfel. Zunächst wird der Begriff Intensität eingeführt: $I=\frac{R+G+B}{3}$. Der Ausschnitt aus der Ebene konstanter Intensität, der im Einheitswürfel liegt, wird im Interesse der einfachen Darstellung als Farbebene (Farbtafel) genutzt. Dabei bleibt die Ordnung der Farbvalenzen erhalten. Die Länge |F| der Farbvalenz bzw die Intensität geht verloren. - Die in der Ebene konstanter Intensität liegenden Werte definieren die Chrominanz durch welche die Farbwertanteile erfasst werden (zwei reichen aus da 2D). Es kann auch die Projektion der Ebene auf RG (grau überlagert) als Farbtafel genutzt werden, ohne die Ordnung der Farborte zu stören. Vorteil: orthonoales rg-System - RGB Farbtafel:\\ - Alle Farben gleicher Buntheit (unterscheiden sich nur in der Länge von F) führen zum gleichen Farbort, der durch die Farbwertantwile r,g,b beschrieben wird: + Alle Farben gleicher Buntheit führen zum gleichen Farbort, der durch die Farbwertanteile r,g,b beschrieben wird: $$r=\frac{R}{R+G+B}, g=\frac{G}{R+G+B}, b=\frac{B}{R+G+B} \leftrightarrow r+g+b=1$$ - Aus dem rechten Teil der Gleichung folgt mit $b=1-r-g$, dass sich die Buntheit allein durch r und g darstellen lässt (entspricht $R^2$). - Die Farbwertanteile lassen sich bei bekanntem Farbort in der Farbtafel nach der angegebenen Konstruktionsvorschrift ermitteln oder direkt ablesen. - + Aus dem rechten Teil der Gleichung folgt mit $b=1-r-g$, dass sich die Buntheit allein durch r und g darstellen lässt (entspricht $R^2$). \paragraph{CIE System} - Um eine Relation zwischen der menschlichen Farbwahrnehmung und den physikalischen ursachen des Farbreizes herzustellen, wurde das CIE-Normvalenzsystem von der Internationalen Beleuchtungskommission (CIE) definiert. Es stellt die Gesammtheit der wahrnehmbaren Farben dar. + Um eine Relation zwischen der menschlichen Farbwahrnehmung und den physikalischen Ursachen des Farbreizes herzustellen, wurde das CIE-Normvalenzsystem definiert. Es stellt die Gesammtheit der wahrnehmbaren Farben dar. - Farbkörperunterschiede:\\ + \paragraph{Farbkörperunterschiede} Es finden sich Unterschiede welche Farbbereiche nach dem CIE Normalvalenzsystem von den jeweiligen Systemen dargestellt werden können: \begin{itemize*} - \item menschliche Farbwahrnehmung ca 2-6 Mio Farben - \item Monitor: ca 1/3 davon. Bei Monitoren wird die additive Farbmischung verwendet, da die einzelnen Lichtquellen aufsummiert werden. - \item Druckprozess: meist deutlich weniger Farben. Bei Druckernwerden einzelne Farbschichten auf Papier gedruckt und das resultierende Bild wird über die subtraktive Farbmischung bestimmt. + \item menschliche Farbwahrnehmung ca. 2-6 Mio Farben + \item Monitor ca. 1/3 davon. Bei Monitoren wird die additive Farbmischung verwendet, da die einzelnen Lichtquellen aufsummiert werden. + \item Druckprozess deutlich weniger Farben. Es werden einzelne Farbschichten auf Papier gedruckt und das resultierende Bild wird über subtraktive Farbmischung bestimmt \end{itemize*} - Subtraktive Farbmischung:\\ + \paragraph{Subtraktive Farbmischung} Je nachdem welche Farbe ein Material hat, werden entsprechende Farbanteile absorbiert oder reflektiert. Eine gelbe Oberfläche sieht gelb aus, da sie das Blau aus weißem Licht absorbiert, aber Rot und Grün reflektiert. Achtung: Dies gilt nur für die Bestrahlung mit weißem Licht. Wird beispielsweise ein gelbes Blatt mit blauem Licht bestrahlt, dann wirkt es schwarz, da das blaue Licht vom gelben Blatt absorbiert wird. @@ -1514,21 +1477,21 @@ \item Phase: Erzeugung der Photon Map \item Photonenverteilung in der Szene: Von der Lichtquelle ausgestrahlte Photonen werden zufällig in der Szene gestreut. Wenn ein Photon eine Oberfläche trifft, kann ein Teil der Energie absorbiert, reflektiert oder gebrochen werden. \item Speichern der Photonen in der Photon Map Daten enthalten also u.a. Position und Richtung beim Auftreffen sowie Energie für die Farbkanäle R,G,B - \begin{itemize*} - \item Photon wird in 3D-Suchstruktur (kd-Baum) gespeichert (Irradiance cache) - \item Reflektionskoeffizienten als Maß für Reflektionswahrscheinlichkeit (analog Transmissionswahrscheinlichkeit) - \item dafür: Energie bleibt nach Reflexion unverändert. Neue Richtung wird statistisch auf Basis der BRDF gewählt. - \end{itemize*} + \begin{itemize*} + \item Photon wird in 3D-Suchstruktur (kd-Baum) gespeichert (Irradiance cache) + \item Reflektionskoeffizienten als Maß für Reflektionswahrscheinlichkeit (analog Transmissionswahrscheinlichkeit) + \item dafür: Energie bleibt nach Reflexion unverändert. Neue Richtung wird statistisch auf Basis der BRDF gewählt. + \end{itemize*} \item Phase: Aufsammeln der Photonen aus Betrachtersicht (gathering) - \begin{itemize*} - \item Verwende Ray-Tracing um für den Primärstrahl von der Kamera durch einen Pixel den Schnittpunkt x mit der Szene zu bestimmen. Basierend auf den Informationen aus der Photon Map werden für x folgende Schritte ausgeführt: - \begin{enumerate*} - \item Sammle die nächsten N Photonen um x herum auf durch Nächste-Nachbar-Suche in der Photon Map (N = konst., z. B. 10) - \item S sei die (kleinste) Kugel, welche die N Photonen enthält. - \item Für alle Photonen: dividiere die Summe der Energie der gesammelten Photonen durch die Fläche von S ($\rightarrow$ Irradiance) und multipliziere mit der BRDF angewendet auf das Photon. - \item Dies ergibt die reflektierte Strahldichte, welche von der Oberfläche (an der Stelle x) in Richtung des Beobachters abgestrahlt wird. - \end{enumerate*} - \end{itemize*} + \begin{itemize*} + \item Verwende Ray-Tracing um für den Primärstrahl von der Kamera durch einen Pixel den Schnittpunkt x mit der Szene zu bestimmen. Basierend auf den Informationen aus der Photon Map werden für x folgende Schritte ausgeführt: + \begin{enumerate*} + \item Sammle die nächsten N Photonen um x herum auf durch Nächste-Nachbar-Suche in der Photon Map (N = konst., z. B. 10) + \item S sei die (kleinste) Kugel, welche die N Photonen enthält. + \item Für alle Photonen: dividiere die Summe der Energie der gesammelten Photonen durch die Fläche von S ($\rightarrow$ Irradiance) und multipliziere mit der BRDF angewendet auf das Photon. + \item Dies ergibt die reflektierte Strahldichte, welche von der Oberfläche (an der Stelle x) in Richtung des Beobachters abgestrahlt wird. + \end{enumerate*} + \end{itemize*} \end{enumerate*} \subsection{ Radiosity} @@ -1578,7 +1541,7 @@ \item beim progressive Refinement ist die inkrementelle Approximation des Ergebnisses des exakten Algorithmus durch ein vereinfachtes Verfahren wünschenswert \item ein entsprechender Algorithmus, der die Patches einzeln behandelt, stammt von Cohen, Chen, Wallace und Greenberg \item akkumuliert mehr Energie in jedem Schritt, verletzt Gleichgewicht der Strahlung $\rightarrow$ Korrektur notwendig: - $L_r^{k+1}=L_{emr} + R_r*\sum_s F_{sr}* L_s^k$ + $L_r^{k+1}=L_{emr} + R_r*\sum_s F_{sr}* L_s^k$ \end{itemize*} @@ -1985,18 +1948,18 @@ \subsection{ Shadow Mapping} \begin{enumerate*} \item Durchgang: - \begin{itemize*} - \item Erzeugen der Shadow Map - \item Darstellung (mit z-Werten) aus Sicht der Lichtquelle - \item Kamera Koordinaten in der Lichtquelle zentriert (Matrix L) - \item z-Puffer als Textur speichern - \end{itemize*} + \begin{itemize*} + \item Erzeugen der Shadow Map + \item Darstellung (mit z-Werten) aus Sicht der Lichtquelle + \item Kamera Koordinaten in der Lichtquelle zentriert (Matrix L) + \item z-Puffer als Textur speichern + \end{itemize*} \item Durchgang: - \begin{itemize*} - \item Kamera Ansicht: View Matrix: V (ebenfalls mit z-Puffer) - \item $\rightarrow$ Um den Schatten zu erzeugen benötigen wir Shader mit Lookup in der Shadow Map-Textur: - \item 4x4-Matrix: $M = V^{-1}*L$ - \end{itemize*} + \begin{itemize*} + \item Kamera Ansicht: View Matrix: V (ebenfalls mit z-Puffer) + \item $\rightarrow$ Um den Schatten zu erzeugen benötigen wir Shader mit Lookup in der Shadow Map-Textur: + \item 4x4-Matrix: $M = V^{-1}*L$ + \end{itemize*} \end{enumerate*} %![Quelle Computergrafik Vorlesung 2020](Assets/Computergrafik_ShadowMap.png) @@ -2057,11 +2020,11 @@ \subsection{Allgemeines} \begin{itemize*} \item Anwendungsprogramm: - \begin{itemize*} - \item läuft auf der CPU, - \item definiert Daten und Befehlsabfolge, - \item greift dazu über das Grafik-API (Application Programming Interface, z. B. OpenGL, Direct3D) auf die Grafikkarte zu - \end{itemize*} + \begin{itemize*} + \item läuft auf der CPU, + \item definiert Daten und Befehlsabfolge, + \item greift dazu über das Grafik-API (Application Programming Interface, z. B. OpenGL, Direct3D) auf die Grafikkarte zu + \end{itemize*} \item Treiber: übersetzt die Grafikbefehle des Programms in die Maschinensprache der speziellen Grafikhardware (Graphics Processing Unit / GPU, z.B. von nVidia, AMD oder Intel) \item Befehle und Daten werden über den Bus (z.B. PCI-Express) von der CPU auf die GPU übertragen \item OpenGL-Pipeline: Abarbeitung der Grafikbefehle auf der GPU @@ -2098,12 +2061,12 @@ \item Interpolation der x-Werte der Kanten (siehe left edge scan /bzw. right edge scan) \item pro Scan Line: inkrementiere x-Wert (left edge, right edge) (OpenGL behandelt nur konvexe Polygone/Dreiecke – d. h. immer 2 Kanten pro Bildzeile!) \item lineare Interpolation weiterer Attribute: - \begin{itemize*} - \item z (1/z)-Werte, - \item RGB-Werte (Gouraud Shading), - \item Texturkoordinaten u/v (affines Texturmapping), - \item Normalen (Phong Shading) - \end{itemize*} + \begin{itemize*} + \item z (1/z)-Werte, + \item RGB-Werte (Gouraud Shading), + \item Texturkoordinaten u/v (affines Texturmapping), + \item Normalen (Phong Shading) + \end{itemize*} \item sehr wenige Ganzzahloperationen pro Pixel/Bildzeile \item Ausnahmen: z. B. perspektivische Texture Maps (FP-Division!) \end{itemize*} @@ -2127,24 +2090,24 @@ \begin{itemize*} \item Grafikkarten geben ihre Performance an in: - \begin{itemize*} - \item Anzahl Polygone / Sekunde (Polygone mit kleiner Pixelanzahl) - \item Anzahl verarbeitete Pixel / Sekunde - \item z.B. ca. 100 Millionen Polygone/sec à 10 Pixel / Polygon (mit Texturen, tri-lineare Filterung, etc. mehrere Milliarden Pixel / s (Gouraud Shader) (Angaben: nVidia Geforce 6800 - Jahr 2005) - \end{itemize*} + \begin{itemize*} + \item Anzahl Polygone / Sekunde (Polygone mit kleiner Pixelanzahl) + \item Anzahl verarbeitete Pixel / Sekunde + \item z.B. ca. 100 Millionen Polygone/sec à 10 Pixel / Polygon (mit Texturen, tri-lineare Filterung, etc. mehrere Milliarden Pixel / s (Gouraud Shader) (Angaben: nVidia Geforce 6800 - Jahr 2005) + \end{itemize*} \item Problem der Grafik-Pipeline: Flaschenhals! - Langsamste Operation hält Pipeline auf (bestimmt Durchsatz) → Zwei extreme Situationen: - \begin{itemize*} - \item Vertex-limited: viele Vertices, kleine Polygone (wenige Pixel), einfache lineare Interpolation der Vertex-Attribute pro Fragment (kleines b ) - \item Fill rate limited: anspruchsvolle Fragment-Shader (großes b), weniger dafür große Polygone (viele Pixel) - \end{itemize*} + \begin{itemize*} + \item Vertex-limited: viele Vertices, kleine Polygone (wenige Pixel), einfache lineare Interpolation der Vertex-Attribute pro Fragment (kleines b ) + \item Fill rate limited: anspruchsvolle Fragment-Shader (großes b), weniger dafür große Polygone (viele Pixel) + \end{itemize*} \item Außerdem: Grafikspeicher-Zugriffe sind teuer (Latenz und Bandbreite beachten!) z.B. Auslesen gerenderter Bilder aus dem Grafikspeicher \item Eine für die Grafikkarte angegebene Performance (z. B. 100 Mio Polygone/sec bei G-Force 6800) ist nur unter unrealistisch günstigen Bedingungen zu erreichen. - \begin{itemize*} - \item d. h. z.B. nicht 100 Mio. unterschiedliche Polygone mit 1 fps (wegen Speicherbandbreite für Vertexzugriffe) - \item auch nicht 10.000 Polygone mit 10.000 fps (da Framebuffer-Reset teuer) - \item Herstellerangaben gelten nur unter optimalen Bedingungen (z. B. 10 Pixel / projiziertem Polygon)! - \item realistisch (verschieden große Polygone) → ca. 1 Mio Polygone mit 10 fps (10 Mio Polygone/s) = 10\% der Peak Performance! - \end{itemize*} + \begin{itemize*} + \item d. h. z.B. nicht 100 Mio. unterschiedliche Polygone mit 1 fps (wegen Speicherbandbreite für Vertexzugriffe) + \item auch nicht 10.000 Polygone mit 10.000 fps (da Framebuffer-Reset teuer) + \item Herstellerangaben gelten nur unter optimalen Bedingungen (z. B. 10 Pixel / projiziertem Polygon)! + \item realistisch (verschieden große Polygone) → ca. 1 Mio Polygone mit 10 fps (10 Mio Polygone/s) = 10\% der Peak Performance! + \end{itemize*} \end{itemize*} $$\text{Durchsatz (fps)} \approx \text{Konst.} / \text{Polygonanzahl}$$ @@ -2171,12 +2134,12 @@ \item 45° - Drehung eines 3x3 Pixel großen Quadrates $\rightarrow$ Den Koodinaten (-1,1) und (1,1) beinhalten 2 Pixel aus dem Original (0,2) ist kein Pixelzugeordnet! \item Runden: führt zu Ausfallartefakten, da bestimmte Zielbildpixel je nach Transformation nicht erreicht werden \item Betrachtung eines Bildes aus 2 Kamerapositionen (Stereo) - \begin{itemize*} - \item Bild aus verschiedenen Kameraperspektiven betrachtet. - \item Beide Kameras sind auf den gleichen Punkt FP gerichtet. - \item Die unterschiedlichen Pixel des Quellbildes werden an unterschiedliche Positionen in den beiden Zielbildern (jeweils Kamerabild in Kamerakoordinatensystem) abgebildet (Vorwärtstransformation). - \item Störstrukturen bei Skalierung auf jeweils beiden Bildern - \end{itemize*} + \begin{itemize*} + \item Bild aus verschiedenen Kameraperspektiven betrachtet. + \item Beide Kameras sind auf den gleichen Punkt FP gerichtet. + \item Die unterschiedlichen Pixel des Quellbildes werden an unterschiedliche Positionen in den beiden Zielbildern (jeweils Kamerabild in Kamerakoordinatensystem) abgebildet (Vorwärtstransformation). + \item Störstrukturen bei Skalierung auf jeweils beiden Bildern + \end{itemize*} \end{itemize*} Lösungs-Idee: Inverse Transformation @@ -2191,10 +2154,10 @@ \begin{itemize*} \item Inverse Transformation der Koordination vom Zielbild + Sampling im Originalbild \item Es entstehen zwar keine Lücken im Zielbild, aber durch Rundung nichtganzzahliger Pixelkoordinaten auf den nächstenganzzahligen Wert können dennoch Aliasing-Artefakte entstehen: $B(k.l)=A(h^{-1}(k,l)$ - \begin{itemize*} - \item einzelne Pixel im Originalbild werden öfter gesampelt als andere - \item einige Pixel im Originalbild werden ausgelassen! - \end{itemize*} + \begin{itemize*} + \item einzelne Pixel im Originalbild werden öfter gesampelt als andere + \item einige Pixel im Originalbild werden ausgelassen! + \end{itemize*} \end{itemize*} %![Rücktransformation I](Assets/Computergrafik_Rückwärtstransformation_Pixelkoordinaten.png) @@ -2215,11 +2178,11 @@ Verkleinern eines Bildes durch Skalierung \begin{itemize*} \item Inverse Transformation der Koordination vom Zielbild + Sampling im Originalbild - \begin{itemize*} - \item auch hier entstehen zwar keine Lücken im Zielbild beim Transformieren zusammenhängender Bilder - \item aber beim Sampeln im Originalbild entstehen Aliasing-Artefakte: - \item z.B. Auslassen jedes zweiten Pixels im Originalbild → Zielbild wird uniform weiß (oder schwarz) - \end{itemize*} + \begin{itemize*} + \item auch hier entstehen zwar keine Lücken im Zielbild beim Transformieren zusammenhängender Bilder + \item aber beim Sampeln im Originalbild entstehen Aliasing-Artefakte: + \item z.B. Auslassen jedes zweiten Pixels im Originalbild → Zielbild wird uniform weiß (oder schwarz) + \end{itemize*} \item exakte Lösung wäre nur bei doppelter Auflösung möglich \item jedoch Auflösung im Zielbild begrenzt, gute Näherung muss gefunden werden \item Näherung durch Sampeln und Interpolation mehrerer Nachbarpixel führt zu möglicher Lösung @@ -2229,15 +2192,15 @@ Fazit: \begin{itemize*} \item Vorwärtstransformation: - \begin{itemize*} - \item gesuchte Farbwerte im Zielbild liegen nicht immer an ganzzahligen Koordinaten - \item durch Rundung können Lücken im Zielbild entstehen - \end{itemize*} + \begin{itemize*} + \item gesuchte Farbwerte im Zielbild liegen nicht immer an ganzzahligen Koordinaten + \item durch Rundung können Lücken im Zielbild entstehen + \end{itemize*} \item Rückwärtstransformation: - \begin{itemize*} - \item es entstehen keine Lücken im Zielbild, dennoch können (Sampling) Artefakte (Aliasing) auftreten - \item diese Artefakte können durch Interpolation mehrerer Pixel teilweise abmildert werden - \end{itemize*} + \begin{itemize*} + \item es entstehen keine Lücken im Zielbild, dennoch können (Sampling) Artefakte (Aliasing) auftreten + \item diese Artefakte können durch Interpolation mehrerer Pixel teilweise abmildert werden + \end{itemize*} \end{itemize*} @@ -2251,10 +2214,10 @@ \item Farb-/Helligkeitswert als Funktion des Ortes W(x,y) \item Bei ortsabhängigen Signalen (z.B. Bildmustern) ist mit Frequenz gemeint, nach welcher Distanz (in Pixeln gemessen) sich das Muster im Bild wiederholt. \item Die Umwandlung vom Ortsraum in den Frequenzraum (und umgekehrt) geschieht durch eine Fourier-Transformation. - \begin{itemize*} - \item damit kann ein Bild im Frequenzraum f definiert werden - \item $S(f)$ wird Spektrum genannt - \end{itemize*} + \begin{itemize*} + \item damit kann ein Bild im Frequenzraum f definiert werden + \item $S(f)$ wird Spektrum genannt + \end{itemize*} \end{itemize*} %![Frequenzraum](Assets/Computergrafik_Frequenzraum_Signal.png) @@ -2271,11 +2234,11 @@ \item Das diskrete Grauwertbild $F (i* \delta x, j * \delta y )$ habe M Spalten und N Zeilen \item $P = M * N$ (=Anzahl Bildpunkte) ist damit die Dimension des Primärdatenraumes des Bildes \item Wir stellen uns bewusst das Bild aus Punkten zusammengesetzt vor, d.h. - \begin{itemize*} - \item wir können von $M * N$ Basisbildern der Dimension $M * N$ ausgehen, in denen jeweils nur ein Pixel den Wert 1 (weiß) besitzt (alle anderen Pixel Schwarz = 0) - \item diese Basisbilder sind damit alle orthonormal → Wichtungsfaktoren durch inneres Produkt! - \item sie ergeben in der grauwertgewichteten Summe das diskrete Bild F - \end{itemize*} + \begin{itemize*} + \item wir können von $M * N$ Basisbildern der Dimension $M * N$ ausgehen, in denen jeweils nur ein Pixel den Wert 1 (weiß) besitzt (alle anderen Pixel Schwarz = 0) + \item diese Basisbilder sind damit alle orthonormal → Wichtungsfaktoren durch inneres Produkt! + \item sie ergeben in der grauwertgewichteten Summe das diskrete Bild F + \end{itemize*} \end{itemize*} %![Frequenzraum II](Assets/Computergrafik_Frequenzraum_diskretes_Bild.png) @@ -2314,10 +2277,10 @@ \begin{itemize*} \item Spezielle Basistransformation: Cosinus Transformation \item Jedes Pixel im Cosinus Raum entspricht einem Bild mit Cosinus-Funktionen verschiedener Frequenzen oder Phasen (in x- oder y-Richtung) - \begin{itemize*} - \item Links oben: Frequenz = Null (Durchschnittswert des Bildes) - \item Rechts unten: Anteil der höchsten Frequenz - \end{itemize*} + \begin{itemize*} + \item Links oben: Frequenz = Null (Durchschnittswert des Bildes) + \item Rechts unten: Anteil der höchsten Frequenz + \end{itemize*} \item Der Cosinus Raum bildet ein Orthonormalsystem \item ein Pixelbild im Ursprungsraum lässt sich zusammensetzen als gewichtete Addition von Bildern mit unterschiedlichen Frequenzen → Spektralzerlegung \item Ähnlich funktioniert die Fouriertransformation (Sinus und Cosinustransformation) @@ -2331,9 +2294,9 @@ \item Transformation: verändert eine Funktion nicht, sondern stellt sie nur anders dar \item Transformation ist umkehrbar: somit existiert auch eine inverse Fourier-Transformation \item Hochpassfilter: ausblenden der tiefen Frequenzen im Frequenzraum - %![Hochpassfilter](Assets/Computergrafik_Fourier_Hochpass.png) + %![Hochpassfilter](Assets/Computergrafik_Fourier_Hochpass.png) \item Tiefpassfilter: ausblenden der hohen Frequenzen im Frequenzraum - %![Tiefpassfilter](Assets/Computergrafik_Fourier_Tiefpass.png) + %![Tiefpassfilter](Assets/Computergrafik_Fourier_Tiefpass.png) \end{itemize*} @@ -2342,24 +2305,24 @@ \item die Abtastfrequenz viel höher als die Signalfrequenz im Original \item Konkret: Die Signalfrequenz liegt unter der halben Abtastfrequenz, der sogenannten Nyquistfrequenz \item Samplingtheorem von Nyquist: - \begin{itemize*} - \item Signale unterhalb der Nyquistfrequenz der Samples können rekonstruiert werden - \item andererseits: Signale oberhalb der Nyquistfrequenz können nicht rekonstruiert werden - \item stattdessen entsteht ein völlig fremdes Signal, welches mit dem Original offensichtlich nichts mehr zu tun hat - \item Aliasing-Effekt (entsteht z. B. auch bei digitalen Tonaufnahmen von hohen Frequenzen, wenn die Samplingrate für diese Frequenzen zu niedrig ist) - \end{itemize*} + \begin{itemize*} + \item Signale unterhalb der Nyquistfrequenz der Samples können rekonstruiert werden + \item andererseits: Signale oberhalb der Nyquistfrequenz können nicht rekonstruiert werden + \item stattdessen entsteht ein völlig fremdes Signal, welches mit dem Original offensichtlich nichts mehr zu tun hat + \item Aliasing-Effekt (entsteht z. B. auch bei digitalen Tonaufnahmen von hohen Frequenzen, wenn die Samplingrate für diese Frequenzen zu niedrig ist) + \end{itemize*} \end{itemize*} \paragraph{Anitaliasing} \begin{itemize*} \item Aliasing bei Bildern entsteht u.a. bei der Kameraaufnahme von diskreten, digitalen Bildern, wenn das Bild in Bezug auf das Abtastraster zu hohe Frequenzen enthält (Verletzung des Abtasttheorems). \item die höchste zulässige Frequenz wird als Nyquistfrequenz bezeichnet - \begin{itemize*} - \item sie ist gleich der halben Abtastfrequenz:$K_{x,Nyqu}=\frac{1}{2*\delta x}, x = Pixelabstand$ - \item zum besseren Verständnis des Grundproblems noch mal drei Beispiele nebeneinander: - %![Beispiel](Assets/Computergrafik_Antialiasing_Nyquist.png) - \item Nachträgliches Filtern kann das Aliasing nicht mehr beseitigen. - \end{itemize*} + \begin{itemize*} + \item sie ist gleich der halben Abtastfrequenz:$K_{x,Nyqu}=\frac{1}{2*\delta x}, x = Pixelabstand$ + \item zum besseren Verständnis des Grundproblems noch mal drei Beispiele nebeneinander: + %![Beispiel](Assets/Computergrafik_Antialiasing_Nyquist.png) + \item Nachträgliches Filtern kann das Aliasing nicht mehr beseitigen. + \end{itemize*} \item Rekonstruktion eines Signals mittels Interpolation durch Erzeugen weiterer Samples zwischen den gemessenen Samples mittels eines Interpolationsalgorithmus (Supersampling) \item z.B. durch polynomiale Interpolation (mehrere Nachbarsamples) \item Dennoch entsteht ein etwas gestörtes Signal (hier nicht harmonische Verzerrung / Modulation) @@ -2417,12 +2380,12 @@ \begin{itemize*} \item Inverse Transformation: $B(k, l) = A(h^{-1} \{k, l\}) = A(x, y )$ \item Interpolationsansatz 1 für das Resampling: - \begin{itemize*} - \item gewichtete Überlagerung der Abtastwerte aus der lokalen Umgebung des Quellbildes. Die Gewichte werden durch Interpolationsfunktionen festgelegt. Die Interpolations-funktionen bestimmen die Qualität des Zielbildes (Störungen, Artefakte). - \item $A(x,y)=\sum_{i=-\infty}^{\infty}\sum_{j=-\infty}^{\infty}A(i,j) * f_{int}(x-i, y-j)$ - \item Filterkern $f_{int}$ ist zentriert um das Pixel $A(x, y)$ - \item Filter ist selbst auch als Rasterbild definiert - \end{itemize*} + \begin{itemize*} + \item gewichtete Überlagerung der Abtastwerte aus der lokalen Umgebung des Quellbildes. Die Gewichte werden durch Interpolationsfunktionen festgelegt. Die Interpolations-funktionen bestimmen die Qualität des Zielbildes (Störungen, Artefakte). + \item $A(x,y)=\sum_{i=-\infty}^{\infty}\sum_{j=-\infty}^{\infty}A(i,j) * f_{int}(x-i, y-j)$ + \item Filterkern $f_{int}$ ist zentriert um das Pixel $A(x, y)$ + \item Filter ist selbst auch als Rasterbild definiert + \end{itemize*} \end{itemize*} Anwendung der Filter auf Bildinformationen: @@ -2454,32 +2417,32 @@ \begin{itemize*} \item Box-Filter - \begin{itemize*} - \item Alle Abtastwerte innerhalb eines um das Pixel gelegte Quadrat (meist mit der Kantenlänge von einem Pixelabstand) haben die gleiche Gewichtung: → Mittelwertbildung - \item Das Box-Filter liefert im Allgemeinen schlechte Ergebnisse, da seine Fourier-Transformierte eine Sinc-Funktion ist, die den gewünschten Frequenzbereich nur schlecht isoliert - \end{itemize*} - + \begin{itemize*} + \item Alle Abtastwerte innerhalb eines um das Pixel gelegte Quadrat (meist mit der Kantenlänge von einem Pixelabstand) haben die gleiche Gewichtung: → Mittelwertbildung + \item Das Box-Filter liefert im Allgemeinen schlechte Ergebnisse, da seine Fourier-Transformierte eine Sinc-Funktion ist, die den gewünschten Frequenzbereich nur schlecht isoliert + \end{itemize*} + \item Kegel-Filter - \begin{itemize*} - \item Beim Kegel-Filter fällt die Gewichtung mit zunehmender Distanz zum Pixel linear ab. - \item Es liefert etwas bessere Ergebnisse als das Box-Filter - \item Artefakte sind noch vorhanden, aber deutlich abgeschwächt! - \end{itemize*} - + \begin{itemize*} + \item Beim Kegel-Filter fällt die Gewichtung mit zunehmender Distanz zum Pixel linear ab. + \item Es liefert etwas bessere Ergebnisse als das Box-Filter + \item Artefakte sind noch vorhanden, aber deutlich abgeschwächt! + \end{itemize*} + \item Gauß-Filter - \begin{itemize*} - \item Beim Gauß-Filter wird zur Rekonstruktion eine Gauß-Funktion verwendet. Die Fouriertransformierte einer Gauß-Funktion ist wieder eine Gauß-Funktion. - \item Dieser Filter führt zu Unschärfe (höhere Frequenzen, auch unterhalb der Nyquistfrequenz werden zu stark abgeschwächt), - \item dafür werden aber Aliasing-Effekte sehr gut unterdrückt - \end{itemize*} - + \begin{itemize*} + \item Beim Gauß-Filter wird zur Rekonstruktion eine Gauß-Funktion verwendet. Die Fouriertransformierte einer Gauß-Funktion ist wieder eine Gauß-Funktion. + \item Dieser Filter führt zu Unschärfe (höhere Frequenzen, auch unterhalb der Nyquistfrequenz werden zu stark abgeschwächt), + \item dafür werden aber Aliasing-Effekte sehr gut unterdrückt + \end{itemize*} + \item Mitchell-Netravali-Filter - \begin{itemize*} - \item sind stückweise kubische Filter mit vier Pixel breiten Trägern. - \item Sie sind durch zwei freie Parameter änderbar und wurden speziell dafür entworfen, die aus Rekonstruktionsfiltern resultierenden Artefakte zu untersuchen. - \item Bei geeigneter Parameterwahl liefern die Filter einen guten Kompromiss zwischen Unschärfe, Anisotropie und Ringing. - \item Die Mitchell-Netravali-Filter werden auch als bikubische Filter bezeichnet, z. B. kubische B-Splines, o. Ä. - \end{itemize*} + \begin{itemize*} + \item sind stückweise kubische Filter mit vier Pixel breiten Trägern. + \item Sie sind durch zwei freie Parameter änderbar und wurden speziell dafür entworfen, die aus Rekonstruktionsfiltern resultierenden Artefakte zu untersuchen. + \item Bei geeigneter Parameterwahl liefern die Filter einen guten Kompromiss zwischen Unschärfe, Anisotropie und Ringing. + \item Die Mitchell-Netravali-Filter werden auch als bikubische Filter bezeichnet, z. B. kubische B-Splines, o. Ä. + \end{itemize*} \end{itemize*} \paragraph{Nearest Neighbour}