Typische Fehler & Missverständnisse

Die klausurrelevanten Stolperfallen der Vorlesung an einem Ort: pro Punkt der falsche Reflex (Fehler) und die korrekte Fassung (Richtig), jeweils mit Link ins Kapitel.

Transformationen: Reihenfolge & Nicht-Kommutativität

  • Fehler: Die Matrizen einer Verkettung in Leserichtung anwenden und annehmen, die Reihenfolge sei egal. Richtig: Matrixmultiplikation ist nicht kommutativ (non-commutative). Die Kette p=MprojVMModelp\mathbf{p}' = M_{proj}\cdot V\cdot M_{Model}\cdot\mathbf{p} wirkt von rechts nach links: die zuerst angewandte Transformation steht rechts (im Shader projection * view * model * vertex, model wirkt zuerst). (Kapitel 5: Transformationen, Kapitel 7: Kameras)

  • Fehler: Die Elterntransformation im Szenegraph (scene graph) als erste (innerste) anwenden. Richtig: Der Szenegraph wird von unten (Blatt) nach oben (Wurzel) ausgewertet; die Elterntransformation wirkt als letzte (aeusserste). (Kapitel 5: Transformationen)

Transformationen: Skalierung & Rotation um den Ursprung

  • Fehler: Annehmen, Skalierung (scaling) und Rotation wirkten am Ort des Objekts. Richtig: Beide beziehen sich auf den Ursprung (origin). Ein nicht im Ursprung liegendes Objekt verschiebt sich beim Skalieren/Drehen ungewollt mit. Wer um einen anderen Referenzpunkt drehen/skalieren will, muss vorher dorthin translatieren (und danach zurueck). (Kapitel 5: Transformationen, Kapitel 2: Grafische Objekte)

Transformationen: Vorzeichen in der Rotationsmatrix

  • Fehler: Falsches sin\sin-Vorzeichen in der Rotationsmatrix, besonders bei RyR_y. Richtig: Auf die Vorzeichenstellung achten. RyR_y hat gegenueber RxR_x und RzR_z die "gespiegelte" Anordnung der sin\sin-Terme:
Ry=(cosφ0sinφ010sinφ0cosφ)R_y = \begin{pmatrix} \cos\varphi & 0 & \sin\varphi \\ 0 & 1 & 0 \\ -\sin\varphi & 0 & \cos\varphi \end{pmatrix}

(Kapitel 5: Transformationen)

Homogene Koordinaten & Homogenisierung

  • Fehler: Die Homogenisierung (homogenization / perspective divide), also die Division durch WW, vergessen oder W=0W = 0 nicht ausschliessen. Richtig: Nach der Vertex-Stufe wird durch WW geteilt; erst dadurch entsteht die perspektivische Verkleinerung. W=0W = 0 ist auszuschliessen (Division). (Kapitel 5: Transformationen, Kapitel 7: Kameras)

  • Fehler: Beim Hochladen eines Punktes in den Shader ww vergessen bzw. versehentlich w=0w = 0 setzen. Richtig: Punkte als vec4(vertex, 1.0) uebergeben (w=1w = 1), nicht w=0w = 0 (das waere eine Richtung, kein Punkt). (Kapitel 6: Shaderprogrammierung)

Beleuchtung nach Phong: Winkel α\alpha und β\beta

  • Fehler: Die Winkel α\alpha und β\beta vertauschen oder den Glanz-Exponenten (shininess) kk auf den diffusen Term anwenden. Richtig: α\alpha ist der Winkel zwischen Normale N\vec{N} und Lichtvektor L\vec{L} (diffus, Lambert): Idiff=cosαI_{diff} = \cos\alpha. β\beta ist der Winkel zwischen Reflexionsvektor R\vec{R} und Blickvektor V\vec{V} (spekular): Ispec=coskβI_{spec} = \cos^{k}\beta. Der Exponent kk gehoert nur zur spekularen Reflexion (grosses kk = kleiner, harter Glanzpunkt). (Kapitel 9: Visualisierungstechniken)

  • Fehler: Phong'sches Reflexionsmodell (reflection model) und Phong-Shading gleichsetzen. Richtig: Das Reflexionsmodell sagt was berechnet wird (ambient + diffus + spekular), das Shading wo/wie oft (pro Flaeche / pro Vertex / pro Pixel). (Kapitel 9: Visualisierungstechniken)

  • Fehler: Negatives cosα\cos\alpha zulassen ("Licht" von der Rueckseite). Richtig: Im Shader mit max(0.0, dot(N,L)) abschneiden. (Kapitel 9: Visualisierungstechniken)

Farbraeume & HSV: der V-Kanal

  • Fehler: Den HSV-Wert VV als Mittelwert der Kanaele auffassen oder VV mit einem der bunten RGB-Kanaele verwechseln. Richtig: V=max(r,g,b)V = \max(r,g,b) (nicht der Mittelwert); die Saettigung (saturation) SS nutzt das max-min-Verhaeltnis. Bei voll gesaettigten Farben ist VV fast ueberall 1, es "verschwindet" nur die schwarze Mitte. (Kapitel 10: Farbraeume)

  • Fehler: Bei der Kanalzerlegung (channel decomposition) die Leserichtung des Grauwerts vertauschen. Richtig: Weiss = hoher Wert (max), Schwarz = niedriger Wert (min). In HSV hat Weiss V=1V = 1 (weiss), S=0S = 0 (schwarz) und undefiniertes HH (als 0/schwarz dargestellt). (Kapitel 10: Farbraeume)

Punktoperatoren: Grauwerttransformation & Kontrast

  • Fehler: Bei der linearen Grauwerttransformation g=emult+addg' = e\cdot\text{mult} + \text{add} nicht erkennen, ob der Kontrast (contrast) steigt oder faellt. Richtig: Der Faktor mult entscheidet: mult>1\text{mult} > 1 spreizt den Wertebereich (kontrastreicher, Kammform mit Luecken im Histogramm), mult<1\text{mult} < 1 staucht ihn (kontrastaermer). Beispiel: [2,10][0,36][-2,10]\to[0,36] ergibt mult=3>1\text{mult}=3>1 (mehr Kontrast), [2,10][3,9][-2,10]\to[3,9] ergibt mult=0,5<1\text{mult}=0{,}5<1 (weniger Kontrast). (Kapitel 11: Bildbearbeitung - Punktoperatoren)

  • Fehler: Den Achsenabschnitt add frei raten oder das Clipping vergessen. Richtig: mult aus den Intervallbreiten bestimmen, dann einen bekannten Punkt einsetzen und nach add aufloesen. Werte ausserhalb [0,255][0,255] auf 0 bzw. 255 klemmen. (Kapitel 11: Bildbearbeitung - Punktoperatoren)

Lokale Operatoren: Mittelwert vs. Median

  • Fehler: Annehmen, Mittelwert- und Medianoperator seien austauschbar. Richtig: Der Mittelwertoperator (mean filter, lineare Faltung) bildet einen gewichteten Durchschnitt und kann dadurch neue, im Original nicht vorhandene Grauwerte erzeugen; er ist ausreisserempfindlich. Der Median (Rangordnungsoperator, nichtlinear) waehlt den mittleren Wert der sortierten Nachbarschaft, erzeugt keine neuen Grauwerte, erhaelt Kanten besser und entfernt Salz-und-Pfeffer-Rauschen wirksamer. (Kapitel 12: Bildverarbeitung - Lokale Operatoren)

  • Fehler: Faltungskernel mit gerader Kantenlaenge verwenden. Richtig: Kernelgroesse muss ungerade sein (3x3, 5x5, ...), damit es ein eindeutiges Zentrum ohne Halbpixel-Versatz gibt. (Kapitel 12: Bildverarbeitung - Lokale Operatoren)

Segmentierung: N4- vs. N8-Nachbarschaft

  • Fehler: N4- und N8-Nachbarschaft (4-/8-neighborhood) verwechseln oder fuer Vorder- und Hintergrund dieselbe Nachbarschaft verwenden. Richtig: N4 zaehlt nur die 4 direkten Nachbarn (oben/unten/links/rechts): diagonal beruehrende Pixel sind getrennt, es entstehen mehr Zusammenhangskomponenten (ZHK / connected components). N8 zaehlt zusaetzlich die 4 Diagonalnachbarn: diagonale Ketten verschmelzen, es entstehen gleich viele oder weniger ZHKs. Fuer Vorder- und Hintergrund die entgegengesetzte Nachbarschaft waehlen. (Kapitel 12: Bildverarbeitung - Lokale Operatoren)

Texturierung: Texture Unit vs. Textur-ID

  • Fehler: Bei glUniform1i die Textur-ID statt der Texture Unit uebergeben (haeufigste Fehlerquelle). Richtig: Der Sampler-Uniform bekommt die Nummer der Texture Unit (0, 1, 2, ...), an die die Textur gebunden ist, nicht die von OpenGL vergebene Textur-ID (das Handle des glGenTextures-Objekts). (Kapitel 9b: Texturierung)

  • Fehler: Texel (texture element) und Pixel (Ausgabebild) gleichsetzen oder Texturkoordinaten mit x,yx,y statt s,t[0,1]s,t\in[0,1] notieren. Richtig: Ein Texel ist ein Element der Textur, ein Pixel ein Element des Ausgabebilds; Texturkoordinaten laufen normiert als s,t[0,1]s,t\in[0,1]. (Kapitel 9b: Texturierung)