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): ABBAA\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=(10000cs00sc00001) Ry=(c0s00100s0c00001) Rz=(cs00sc0000100001)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)RT(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), W0W\neq 0.
  • Szenegraph (scene graph): Kind erbt Eltern-Transformation; Wurzel steht ganz links: T1T3T6PT_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=RKameraT(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): pyn=pypzpy=npypz\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)=(1t)F(0)+tF(1)F(t)=(1-t)F(0)+t\,F(1). Falle: Gewicht von F(0)F(0) ist (1t)(1-t), nicht tt. Bilinear = Flaechen (2D).
  • Baryzentrisch im Dreieck: c=w1c1+w2c2+w3c3\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=12x1(y2y3)+x2(y3y1)+x3(y1y2)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=Meemiss.+MdLaambient+i=1n(Mdcosαdiffus+Mscoskβ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,NL)\cos\alpha=\max(0,\vec N\circ\vec L). Spekular: coskβ=max(0,RV)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=(M1)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=1RGB\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=maxminmax=1minmaxS=\dfrac{\max-\min}{\max}=1-\dfrac{\min}{\max} (0 falls max=0\max=0); HH = Farbwinkel: 00^\circ Rot, 120120^\circ Gruen, 240240^\circ Blau.
  • S=0min=maxS=0 \Leftrightarrow \min=\max (Grau); S=1min=0S=1 \Leftrightarrow \min=0. Kanalbild-Leseregel: weiss=hoher Wert (max), schwarz=niedrig (min). H-Kanal: harter Sprung 0 ⁣ ⁣3600^\circ\!\leftrightarrow\!360^\circ im Rot.
  • Luma/Grauwert-Gewichtung Y0,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 (12612\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=emult+addg'=e\cdot\text{mult}+\text{add}.
  • Kontrastspreizung [gmin,gmax][gMIN,gMAX][g_{min},g_{max}]\to[g'_{MIN},g'_{MAX}]:  mult=gMAXgMINgmaxgmin,add=gminmult\ \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=gMAXgg'=g_{MAX}-g. Gamma: ggMAX=(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 gmaxgming_{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. 2558/9=227255\cdot8/9=227).

Mittel=19 ⁣(111111111) Gauss=116 ⁣(121242121) Laplace=(010141010)\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=(010151010) Sobelx=(101101101) Sobely=(111000111)\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=e0,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(x1)g(x{+}1)-2g(x)+g(x{-}1), isotrop, Nulldurchgang an Kante (zero crossing). Sharpen = nFId+n\cdot F_{Id}+ inv. Laplace; n=1n=1 -> Summe 1 (helligkeitserhaltend).
  • Rangordnung (rank-order, nicht-linear, Strukturelement): sortiere g0g8g_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 MprojVMModelpM_{proj}\cdot V\cdot M_{Model}\cdot p sicher parat haben.