Spickzettel (A4, 2 Seiten)

Maximal verdichtete Klausurhilfe Visual Computing: Formeln, Fakten und Fallen aus Kap. 5-12. Fachbegriffe mit English gloss, KaTeX fuer Kernformeln.

Seite 1

Transformationen (Kap. 5)

  • Punkt = Spaltenvektor (column vector), homogene Koordinate (homogeneous coord.) w=1w=1. Rotation/Skalierung wirken nur um den Ursprung.
  • Verkettung ist nicht kommutativ (non-commutative): A⋅B≠B⋅AA\cdot B\neq B\cdot A. Zuerst angewandte Transformation steht rechts (direkt an p⃗\vec p). Code-Reihenfolge ist umgekehrt zur Matrixreihenfolge.
  • Die 5 pruefungsrelevanten 4x4-Matrizen:
T=(100tx010ty001tz0001)  S=(sx0000sy0000sz00001)T=\begin{pmatrix}1&0&0&t_x\\0&1&0&t_y\\0&0&1&t_z\\0&0&0&1\end{pmatrix}\ \ S=\begin{pmatrix}s_x&0&0&0\\0&s_y&0&0\\0&0&s_z&0\\0&0&0&1\end{pmatrix} Rx=(10000c−s00sc00001) Ry=(c0s00100−s0c00001) Rz=(c−s00sc0000100001)R_x=\begin{pmatrix}1&0&0&0\\0&c&-s&0\\0&s&c&0\\0&0&0&1\end{pmatrix}\ R_y=\begin{pmatrix}c&0&s&0\\0&1&0&0\\-s&0&c&0\\0&0&0&1\end{pmatrix}\ R_z=\begin{pmatrix}c&-s&0&0\\s&c&0&0\\0&0&1&0\\0&0&0&1\end{pmatrix}
  • c=cos⁡α, s=sin⁡αc=\cos\alpha,\ s=\sin\alpha. Merkfalle: bei RyR_y steht +sin⁡+\sin oben rechts, −sin⁡-\sin unten links (spiegelverkehrt zu Rx,RzR_x,R_z).
  • Referenzpunkt (reference point) p⃗\vec p: M=T(+p⃗)⋅R⋅T(−p⃗)M=T(+\vec p)\cdot R\cdot T(-\vec p).
  • Homogenisierung (perspective divide): (X,Y,Z,W)→(X/W,Y/W,Z/W)(X,Y,Z,W)\to(X/W,Y/W,Z/W), W≠0W\neq 0.
  • Szenegraph (scene graph): Kind erbt Eltern-Transformation; Wurzel steht ganz links: T1⋅T3⋅T6⋅PT_1\cdot T_3\cdot T_6\cdot P.
  • Falle: Skalierung eines Objekts abseits des Ursprungs skaliert auch den Abstand (Position aendert sich mit).

Kamera und Projektion (Kap. 7)

  • Idee: nicht Kamera, sondern Szene bewegen. Ziel: Kamera im Ursprung, Blick entlang −Z-Z (rechtshaendig).
  • View-Matrix (view matrix): V=RKamera⋅T(−c⃗)V=R_{Kamera}\cdot T(-\vec c). Rotationsteil = Kamera-Achsen als Zeilen in Weltkoordinaten; Translation um −c⃗-\vec c.
  • lookAt(c, a, u): Kamerazentrum cc (camera center), Betrachtungspunkt aa (look-at/target), up-Vektor uu (Rotation um Blickachse/Roll).
  • Perspektive aus Strahlensatz (intercept theorem): py′n=pypz⇒py′=n pypz\dfrac{p'_y}{n}=\dfrac{p_y}{p_z}\Rightarrow p'_y=\dfrac{n\,p_y}{p_z} (analog xx). Division durch pzp_z = perspektivische Verkleinerung.
  • Orthografisch (orthographic): parallele Strahlen, Quader, keine Verkleinerung. Perspektivisch (perspective): Fluchtpunkt (vanishing point), Frustum (Pyramidenstumpf).
  • glm::frustum(l,r,top,bottom,n,f) -> auch asymmetrisch. glm::perspective(theta, aspect, n, f) -> nur symmetrisch. Falle: frustum-Reihenfolge top vor bottom (anders als glOrtho bottom vor top).
  • Nicht klausurrelevant: die perspektivische Projektionsmatrix selbst; relevant ist ihre Wirkung (x,y perspektivisch, z nichtlinear -> mehr Praezision nahe der Kamera, z-fighting bei fernem far/nahem near).

Rendering-Pipeline und Interpolation (Kap. 8)

  • Bloecke: Vertex Processor →\to Rasterizer →\to Fragment Processor →\to Output Merging.
  • 4 Shaderstufen: Vertex (Pflicht), Tesselation (opt.), Geometry (opt.), Fragment (Pflicht). Optionale = Tradeoff Speicher vs. Performance.
  • Fragment ≠\neq Pixel: Fragment ist Vorstufe; z-Buffer verwirft, Transparenz kann mehrere Fragmente je Pixel liefern.
  • Raeume: Local →Model\xrightarrow{Model} World →View\xrightarrow{View} Camera →Projection\xrightarrow{Projection} Clip →Homogen.\xrightarrow{Homogen.} NDC →Viewport\xrightarrow{Viewport} Screen. Bis NDC aufloesungsunabhaengig; Viewport macht geraeteabhaengig.
  • NDC-Wuerfel [−1,1]3[-1,1]^3. Grenze: Local->Clip im Vertex-Shader; ab Homogenisierung/NDC automatisch auf GPU.
  • Viewport: px′=12(px+1)w,py′=12(py+1)h,pz′=12(pz+1)p'_x=\tfrac12(p_x+1)w,\quad p'_y=\tfrac12(p_y+1)h,\quad p'_z=\tfrac12(p_z+1).
  • Lineare Interpolation (Kante, 1D): F(t)=(1−t)F(0)+t F(1)F(t)=(1-t)F(0)+t\,F(1). Falle: Gewicht von F(0)F(0) ist (1−t)(1-t), nicht tt. Bilinear = Flaechen (2D).
  • Baryzentrisch im Dreieck: c⃗=w1c⃗1+w2c⃗2+w3c⃗3\vec c=w_1\vec c_1+w_2\vec c_2+w_3\vec c_3, wi=Ai/Agesw_i=A_i/A_{ges}, ∑wi=1\sum w_i=1. Flaeche A=12∣x1(y2−y3)+x2(y3−y1)+x3(y1−y2)∣A=\tfrac12|x_1(y_2-y_3)+x_2(y_3-y_1)+x_3(y_1-y_2)|.
  • Tiefentest (depth test): glEnable(GL_DEPTH_TEST), glDepthFunc(GL_LESS) -> kleinerer z gewinnt, glClearDepth(1.0). Ohne Tiefentest: Painter's Algorithm (reihenfolgeabhaengig, versagt bei sich schneidenden Polygonen). z-Buffer: pro Fragment min. z, kein globales Sortieren.

Shader-Kette (Kap. 6/7/9)

  • Eine Zeile: gl_Position = projection * view * model * vec4(vertex,1.0); wirkt rechts nach links (model zuerst, projection zuletzt). Output = homogen, vor perspektivischer Division.
  • #version 330, layout(location=N) in, uniform, in/out (VS-out kommt interpoliert als FS-in an).

Seite 2

Phong-Beleuchtung (Kap. 9)

Vektoren am Punkt P, alle normiert: N⃗\vec N Normale, L⃗\vec L zur Lichtquelle, R⃗\vec R reflektiert, V⃗\vec V zur Kamera. α=∠(N⃗,L⃗)\alpha=\angle(\vec N,\vec L) diffus, β=∠(R⃗,V⃗)\beta=\angle(\vec R,\vec V) spekular.

Lo=Me⏟emiss.+MdLa⏟ambient+∑i=1n(Mdcos⁡α⏟diffus+Mscos⁡kβ⏟spekular)LiL_o=\underbrace{M_e}_{\text{emiss.}}+\underbrace{M_d L_a}_{\text{ambient}}+\sum_{i=1}^{n}\big(\underbrace{M_d\cos\alpha}_{\text{diffus}}+\underbrace{M_s\cos^{k}\beta}_{\text{spekular}}\big)L_i
  • Diffus (Lambert): cos⁡α=max⁡(0,N⃗∘L⃗)\cos\alpha=\max(0,\vec N\circ\vec L). Spekular: cos⁡kβ=max⁡(0,R⃗∘V⃗)k\cos^{k}\beta=\max(0,\vec R\circ\vec V)^{k}; grosses kk = kleiner, harter Glanzpunkt (shininess).
  • Ambient ist richtungsunabhaengig (kein cos⁡\cos), steht ausserhalb der Summe. Emission unabhaengig von Lichtquellen.
  • Farbe = komponentenweise (Hadamard) Material ×\times Licht, kein Skalarprodukt.
  • Lambert-Begruendung: gleiche Photonenzahl auf projizierte Flaeche Aproj=cos⁡α⋅AA_{proj}=\cos\alpha\cdot A (nicht "weniger Licht").
  • Normalmatrix (normal matrix): M′=(M−1)⊤M'=(M^{-1})^{\top} = transpose(inverse(view*model)) (noetig bei nicht-uniformer Skalierung). Herleitung nicht klausurrelevant, Anwendung schon.
  • Falle Phong-Shading ≠\neq Phong-Reflexionsmodell: Modell = was (ambient+diffus+spekular); Shading = wo/wie oft: Flat (Flaechennormale), Gouraud (Eckennormale, bilinear interp., Glanzlicht in Dreiecksmitte geht verloren), Phong (Pixelnormale, teuer, korrekte Highlights).
  • Normal Mapping: nur Normalen (als RGB-Textur) angepasst, Geometrie bleibt flach.
  • GLSL: N=normalize(normal); L=normalize(lightDir); (interpolierte Normalen sind nicht mehr Einheitsvektoren -> normalize im Fragment-Shader). reflect(-L,N) (builtin erwartet einfallenden Vektor). viewDir=-P.xyz (Kamera im View-Space im Ursprung). cosBetak=pow(max(0.0,dot(R,V)),shininess).
  • Lichtquellen: directional (parallel), point (Punkt, alle Richtungen), spotlight (Winkel), Lichtabschwaechung (attenuation) mit Entfernung.

Farbraeume (Kap. 3/10)

  • Hardwareorientiert: RGB, RGBA, CMY, CMYK. Wahrnehmungsorientiert: HSV, YCbCr, CIE XYZ, CIELab (trennen Chrominanz/Helligkeit).
  • RGB additiv (Licht/Display, R+G+B=Weiss); CMY subtraktiv (Druck/Pigment). CMY=1−RGB\text{CMY}=1-\text{RGB}. CMYK-Schwarz =(0,0,0,1)=(0,0,0,1). Unbuntgerade r=g=br=g=b = Grau.
  • HSV aus RGB, Werte in [0,1][0,1]: V=max⁡(r,g,b)V=\max(r,g,b); S=max⁡−min⁡max⁡=1−min⁡max⁡S=\dfrac{\max-\min}{\max}=1-\dfrac{\min}{\max} (0 falls max⁡=0\max=0); HH = Farbwinkel: 0∘0^\circ Rot, 120∘120^\circ Gruen, 240∘240^\circ Blau.
  • S=0⇔min⁡=max⁡S=0 \Leftrightarrow \min=\max (Grau); S=1⇔min⁡=0S=1 \Leftrightarrow \min=0. Kanalbild-Leseregel: weiss=hoher Wert (max), schwarz=niedrig (min). H-Kanal: harter Sprung 0∘ ⁣↔ ⁣360∘0^\circ\!\leftrightarrow\!360^\circ im Rot.
  • Luma/Grauwert-Gewichtung Y≈0,30R+0,60G+0,10BY\approx 0{,}30R+0{,}60G+0{,}10B (exakt 0,299/0,587/0,114, Koeffizienten nicht klausurrelevant). YCbCr: Cb=Blau-Gelb, Cr=Rot-Gruen; JPEG/MPEG; 4:1:1-Subsampling = 50% Kompression (12→612\to6 Werte).
  • CIELab: L*=Helligkeit, a*=Rot-Gruen, b*=Gelb-Blau; geraeteneutral, wahrnehmungslinear (Distanz ∝\propto Farbunterschied). Gamut: CIE >> RGB(HSV,YCbCr) >> CMY.

Punktoperatoren (Kap. 11)

  • Punktoperator: neuer Grauwert nur aus eigenem Pixel (keine Nachbarn). Lineare Grauwerttransf. (LGT): g′=e⋅mult+addg'=e\cdot\text{mult}+\text{add}.
  • Kontrastspreizung [gmin,gmax]→[gMIN′,gMAX′][g_{min},g_{max}]\to[g'_{MIN},g'_{MAX}]:  mult=gMAX′−gMIN′gmax−gmin,add=−gmin⋅mult\ \text{mult}=\dfrac{g'_{MAX}-g'_{MIN}}{g_{max}-g_{min}},\quad \text{add}=-g_{min}\cdot\text{mult}.
  • gg'-Diagramm: oberhalb Diagonale=heller, unterhalb=dunkler, negative Steigung=invertiert, Steigung <1<1=kontrastaermer, >1>1=kontrastreicher.
  • Inversion g′=gMAX−gg'=g_{MAX}-g. Gamma: g′gMAX′=(ggMAX)1/γ\dfrac{g'}{g'_{MAX}}=\Big(\dfrac{g}{g_{MAX}}\Big)^{1/\gamma}; Exponent ist 1/γ1/\gamma. γ>1\gamma>1 hellt auf, γ<1\gamma<1 dunkelt ab.
  • Verfaelschung: zwei Eingangswerte auf denselben Ausgangswert = Informationsverlust. Kontrastspreizung meist verfaelschungsfrei; Gamma verfaelscht (nicht in sensiblen Daten). Falle: gmin/gmaxg_{min}/g_{max} (im Bild) vs. gMIN/gMAXg_{MIN}/g_{MAX} (darstellbar); Clipping auf [0,255][0,255].
  • Kontrast = Spannweite gmax−gming_{max}-g_{min}; Dynamik = Anzahl verschiedener Grauwerte; Helligkeit = Mittelwert. Histogramm ist kein Mass fuer Bildinhalt.

Lokale Operatoren (Kap. 12)

Faltung (convolution) 3x3:  g′(i,j)=∑u,vK(u,v) g(i+u,j+v)\ g'(i,j)=\sum_{u,v}K(u,v)\,g(i+u,j+v). Kernelgroesse ungerade (eindeutiges Zentrum). Zero-Padding am Rand (z.B. 255⋅8/9=227255\cdot8/9=227).

Mittel=19 ⁣(111111111) Gauss=116 ⁣(121242121) Laplace=(0101−41010)\text{Mittel}=\tfrac19\!\begin{pmatrix}1&1&1\\1&1&1\\1&1&1\end{pmatrix}\ \text{Gauss}=\tfrac1{16}\!\begin{pmatrix}1&2&1\\2&4&2\\1&2&1\end{pmatrix}\ \text{Laplace}=\begin{pmatrix}0&1&0\\1&-4&1\\0&1&0\end{pmatrix} Sharpen=(0−10−15−10−10) Sobelx=(−101−101−101) Sobely=(−1−1−1000111)\text{Sharpen}=\begin{pmatrix}0&-1&0\\-1&5&-1\\0&-1&0\end{pmatrix}\ \text{Sobel}_x=\begin{pmatrix}-1&0&1\\-1&0&1\\-1&0&1\end{pmatrix}\ \text{Sobel}_y=\begin{pmatrix}-1&-1&-1\\0&0&0\\1&1&1\end{pmatrix}
  • Gauss 5x5 Normierung 1/2561/256. Differenz-/Sobel-Rueckabbildung: g′=e⋅0,5+127g'=e\cdot0{,}5+127 (Bereich [−255,255]→[0,255][-255,255]\to[0,255]).
    1. Ableitung: Differenz g(x+1)−g(x)g(x{+}1)-g(x), Sobel -> Peak an Kante; Sobel hat Pufferzeile (rauschrobust, mehrere Pixel breit) vs. Differenz (1 Pixel, rauschanfaellig).
    1. Ableitung: Laplace g(x+1)−2g(x)+g(x−1)g(x{+}1)-2g(x)+g(x{-}1), isotrop, Nulldurchgang an Kante (zero crossing). Sharpen = n⋅FId+n\cdot F_{Id}+ inv. Laplace; n=1n=1 -> Summe 1 (helligkeitserhaltend).
  • Rangordnung (rank-order, nicht-linear, Strukturelement): sortiere g0≤⋯≤g8g_0\le\dots\le g_8. Median g4g_4 (Impulsrauschen weg, Kanten scharf), Dilatation g8g_8=max (hell waechst), Erosion g0g_0=min (dunkel waechst). Opening = Erosion dann Dilatation (Rauschen weg); Closing = Dilatation dann Erosion (Luecken zu); Reihenfolge ergebnisrelevant.
  • ZHK (Zusammenhangskomponenten / connected components): N4 (4 direkte Nachbarn, kreuzfoermig) vs. N8 (+Diagonalen). N8 verschmilzt diagonal beruehrende Pixel -> gleich viele oder weniger Komponenten als N4.
  • Zentrale Regel: Vorder- und Hintergrund mit entgegengesetzter Nachbarschaft (VG N4 ⇒\Rightarrow HG N8, und umgekehrt), sonst topologisch inkonsistent. Flood Fill = rekursives Fluten, jede ZHK bekommt eine Marke.
  • Hough-Transformation braucht 1 Pixel breite Kanten (sonst doppelte Geraden); Canny duennt aus.

Prio-Tipp: Groesste Punktebringer sind (1) Phong-Formel + GLSL + Shading-Verfahren, (2) HSV-Umrechnung und Farbmodell-Zuordnung, (3) LGT/Kontrastspreizung rechnen und (4) Faltungskerne + ZHK-Zaehlung (N4/N8). Transformationsmatrizen (RyR_y-Vorzeichen!) und die Kette Mproj⋅V⋅MModel⋅pM_{proj}\cdot V\cdot M_{Model}\cdot p sicher parat haben.