Probeklausur 2 - Visual Computing
Zweite Übungsklausur (mock exam) zum Kurs "Visual Computing" (HS Darmstadt). Sie ist an Struktur, Themenmix, Schwierigkeit und Punktgewichtung der Original-Klausur WS 2025/2026 angelehnt, enthält aber ausschliesslich neue Aufgaben (weder aus der Original-Klausur noch aus Probeklausur 1 übernommen). Alle Lösungen sind ausklappbar mit vollem Rechenweg, Begründung und Kapitelbezug. Zum Vergleich: Klausur WS2025 (Lösungen) und Probeklausur 1.
Hinweise zur Klausur: Dauer 90 Minuten. Hilfsmittel: ein nicht-programmierbarer Taschenrechner (non-programmable calculator) und ein beschriebenes DIN-A4-Blatt. Insgesamt 100 Punkte.
1. Aufgabe: RGB und HSV Farbmodelle (13 Punkte)
Teil a (6 P): Rechnen Sie die folgenden drei Farben aus dem RGB-Modell (Wertebereich ) in das HSV-Modell um. Geben Sie jeweils (Hue = Farbton), (Saturation = Sättigung) und (Value = Hellwert) an und zeigen Sie den Rechenweg.
| Farbe | |
|---|---|
| Farbe 1 | |
| Farbe 2 | |
| Farbe 3 |
Teil b (7 P): Eine Grafik zeigt auf weissem Hintergrund drei gefüllte Quadrate: links Cyan , mittig Magenta , rechts Gelb . Die Grafik wird einmal in ihre RGB-Kanäle und einmal in ihre HSV-Kanäle zerlegt (je drei Graustufenbilder, Leseregel: weiss = Maximalwert, schwarz = Minimalwert). Vervollständigen Sie beide Tabellen mit den Kanalwerten und begründen Sie, an welchem Merkmal man RGB von HSV am schnellsten unterscheidet.
Lösung anzeigen
Teil a - Umrechnung RGB nach HSV. Formeln (Kapitel 10): , (falls , dann ), = Farbwinkel auf dem Farbkreis ( Rot, Gelb, Grün, Cyan, Blau, Magenta).
Hue-Formel (falls benötigt), mit :
Farbe 1 - Orange:
- , also (Orange liegt zwischen Rot und Gelb).
- Ergebnis:
Farbe 2 - Grauton:
- Wegen ist undefiniert (unbunt / achromatic).
- Ergebnis:
Farbe 3 - entsättigtes Grün:
- , also (reines Grün, Rot- und Blauanteil gleich).
- Ergebnis:
Teil b - Kanalzerlegung.
RGB-Kanäle (weiss = 1, schwarz = 0):
| Region | R | G | B |
|---|---|---|---|
| Hintergrund (weiss) | 1 | 1 | 1 |
| Cyan | 0 | 1 | 1 |
| Magenta | 1 | 0 | 1 |
| Gelb | 1 | 1 | 0 |
HSV-Kanäle:
| Region | H | S | V |
|---|---|---|---|
| Hintergrund (weiss) | undef (0) | 0 | 1 |
| Cyan | 1 | 1 | |
| Magenta | 1 | 1 | |
| Gelb | 1 | 1 |
Begründung (schnellste Unterscheidung): Entscheidend ist der Hintergrund (Weiss). In RGB ist Weiss in jedem Kanal der Maximalwert, also haben alle drei RGB-Kanalbilder einen hellen (weissen) Hintergrund. In HSV gilt für Weiss (weiss), aber (schwarz) und undefiniert (als schwarz dargestellt). Die HSV-Zerlegung zeigt also einen Kanal () mit weissem Hintergrund und zwei (, ) mit schwarzem Hintergrund. Faustregel: alle drei Hintergründe hell -> RGB; zwei Hintergründe dunkel -> HSV.
Kapitelbezug: Kapitel 10: Farbräume.
Typischer Fehler: als Mittelwert der drei Kanäle berechnen. ist das Maximum , nicht der Durchschnitt. Ausserdem bei den drei vollgesättigten Sekundärfarben (Cyan, Magenta, Gelb) ist und ; nur der Farbton (Winkel) unterscheidet sie.
2. Aufgabe: OpenGL Shader (19 Punkte)
Gegeben ist das folgende Shader-Paar:
// Vertex Shader
#version 330
layout(location = 0) in vec3 vertex;
layout(location = 1) in vec3 vertex_normal;
layout(location = 2) in vec3 vertex_color;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projMatrix;
out vec3 normalVS;
out vec3 colorVS;
void main() {
gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(vertex, 1.0);
normalVS = vertex_normal;
colorVS = vertex_color;
}
// Fragment Shader
#version 330
in vec3 normalVS;
in vec3 colorVS;
out vec4 color;
uniform vec3 lightDir;
void main() {
float diff = max(dot(normalize(normalVS), normalize(lightDir)), 0.0);
color = vec4(colorVS * diff, 1.0);
}
a (3 P): Worauf verweist der index in layout(location = index)? Welche drei Attribute werden hier gebunden?
b (3 P): Was ist eine uniform Variable und welche Zugriffsrechte (read/write) hat sie im Shader? Nennen Sie die uniforms dieses Programms.
c (3 P): Erklären Sie den Unterschied zwischen in und out. Was passiert mit einem out-Wert des Vertex-Shaders (z.B. normalVS) auf dem Weg zum Fragment-Shader?
d (4 P): Füllen Sie den Lückentext aus (Begriffe: Position, normalisiert, interpoliert, Skalarprodukt, Alpha, drei).
e (3 P): Erklären Sie die Parameter von gluLookAt(ax,ay,az, bx,by,bz, cx,cy,cz).
f (3 P): Was bewirken glEnable(GL_DEPTH_TEST), glDepthFunc(GL_LESS) und glClearDepth(1.0)?
Lückentext (zu d):
Der Vertex-Shader liest drei ______ (a)-dimensionale Attribute pro Vertex und berechnet mit den drei Matrizen die finale Vertex-______ (b) in gl_Position. Die Normale und die Farbe werden unverändert als out weitergereicht und bei der Rasterisierung über das Dreieck ______ (c). Der Fragment-Shader ______ (d) Normale und Lichtrichtung, bildet mit dot(...) ihr ______ (e) und multipliziert die Farbe damit. Zuletzt wird der Farbe ein ______ (f)-Wert von 1.0 hinzugefügt.
Lösung anzeigen
a) Der index gibt die Vertex-Attribut-Position (vertex attribute index) an, aus der das Attribut im VAO/VBO gelesen wird. Er entspricht dem index in glVertexAttribPointer(index, ...) bzw. glEnableVertexAttribArray(index). Hier: = Position (vertex), = Normale (vertex_normal), = Farbe (vertex_color).
b) Eine uniform Variable ist eine globale, für alle Vertices bzw. Fragmente eines Draw-Calls konstante Eingabe, die von der Anwendung (CPU) per glUniform* / glUniformMatrix*fv gesetzt und per Variablenname adressiert wird. Im Shader ist sie READ-ONLY (nur lesbar). Uniforms hier: modelMatrix, viewMatrix, projMatrix (Vertex-Shader) und lightDir (Fragment-Shader).
c) in ist eine Eingabevariable (read-only): im Vertex-Shader die Vertex-Attribute, im Fragment-Shader die Ausgabe der vorherigen Stufe. out ist eine Ausgabevariable, die an die nächste Pipeline-Stufe weitergereicht wird. Ein out-Wert des Vertex-Shaders (hier normalVS, colorVS) wird bei der Rasterisierung automatisch über das Primitiv interpoliert (perspektivkorrekt), bevor er als gleichnamige in-Variable im Fragment-Shader ankommt. Kopplung über gleichen Namen und gleichen Typ.
d) Lückentext:
Der Vertex-Shader liest drei drei-dimensionale Attribute pro Vertex und berechnet mit den drei Matrizen die finale Vertex-Position in gl_Position. Die Normale und die Farbe werden unverändert als out weitergereicht und bei der Rasterisierung über das Dreieck interpoliert. Der Fragment-Shader normalisiert Normale und Lichtrichtung, bildet mit dot(...) ihr Skalarprodukt und multipliziert die Farbe damit. Zuletzt wird der Farbe ein Alpha-Wert von 1.0 hinzugefügt.
(Begründung diff: ist der Lambert-Term, das max(..., 0.0) verhindert negative Helligkeit auf der lichtabgewandten Seite.)
e) gluLookAt definiert die View-Matrix über drei Vektoren:
- a = Augpunkt / Kameraposition (eye) - wo die Kamera steht.
- b = Blickpunkt / Zielpunkt (center) - wohin die Kamera schaut.
- c = Up-Vektor (up) - welche Richtung "oben" ist.
f)
glEnable(GL_DEPTH_TEST)schaltet den Tiefentest (z-Buffer-Test) ein.glDepthFunc(GL_LESS)legt fest, dass ein Fragment nur gezeichnet wird, wenn sein Tiefenwert kleiner (also näher an der Kamera) ist als der bereits gespeicherte.glClearDepth(1.0)setzt den Wert, mit dem der Tiefenpuffer beim Löschen gefüllt wird ( = maximale, weiteste Entfernung), damit jedes reale Fragment den Test zunächst besteht.
Kapitelbezug: Kapitel 6: Shaderprogrammierung, Kapitel 7: Kameras, Kapitel 8: Rendering-Pipeline.
Tipp:
normalize(...)vor demdot-Produkt ist wichtig: Nach der Interpolation istnormalVSin der Regel nicht mehr genau die Einheitslänge ; nur normierte Vektoren liefern mitdotwirklich .
3. Aufgabe: Affine Transformationen (16 Punkte)
Teil a (6 P): Eine 2D-Szene "Schneemann" (snowman) soll aus zwei Basiselementen aufgebaut werden: Kreis (Einheitskreis / unit circle, Radius , Zentrum Ursprung) und Dreieck (Basis von bis auf der x-Achse, Spitze bei ). Zielszene:
- Bauch (unterer Kreis): Kreis mit Radius , Zentrum im Ursprung .
- Kopf (oberer Kreis): Kreis mit Radius , Zentrum bei .
- Nase: ein kleines Dreieck, um im Uhrzeigersinn gedreht (Spitze zeigt danach nach rechts), auf verkleinert, Zentrum bei .
Geben Sie für jedes der drei Blätter (leaves) die nötigen Transformationen samt Parametern und in der richtigen Reihenfolge an. Erläutern Sie kurz die Vererbung (inheritance) im Szenegraphen. Skalierung ist unzulässig (keine Wirkung).
Teil b (10 P): Ein Punkt soll erst um im Uhrzeigersinn (clockwise, also ) um den Ursprung gedreht und danach um verschoben werden.
- Stellen Sie die Rotationsmatrix und die Translationsmatrix in homogenen Koordinaten () auf.
- Berechnen Sie die kombinierte Matrix und wenden Sie sie auf an (mit Probe).
- Zeigen Sie, dass die umgekehrte Reihenfolge ein anderes Ergebnis liefert (Nicht-Kommutativität / non-commutativity).
Lösung anzeigen
Teil a - Transformationen pro Blatt (Basiselemente: Einheitskreis und Standarddreieck):
- Bauch: Einheitskreis () auf vergrössern, Zentrum bleibt im Ursprung -> nur Skalierung.
- Kopf: Einheitskreis auf verkleinern und nach oben schieben -> erst Skalierung, dann Translation. Reihenfolge beachten: erst skalieren (um den Ursprung), dann verschieben, sonst würde der Abstand vom Ursprung mitskaliert.
- Nase: Standarddreieck erst verkleinern -> Skalierung, dann Rotation (im Uhrzeigersinn, Spitze zeigt danach nach rechts), zuletzt Translation. Also Reihenfolge: Skalierung, dann Rotation, dann Translation.
Vererbung: Im Szenegraphen erben Kind-Knoten (children) die Transformationen ihres Elternknotens (parent). Eine Transformation, die auf alle Teile wirken soll (z.B. den ganzen Schneemann drehen), notiert man einmal am Wurzelknoten Schneemann; sie wird mit den blattspezifischen Transformationen zur akkumulierten Matrix (accumulated matrix) verkettet. Bei Spaltenvektoren steht die Wurzel-Transformation dabei ganz links (wirkt als äusserste, zuletzt angewandte Transformation).
Teil b - homogene Transformation.
1. Matrizen aufstellen. Für gilt , :
Kontrolle der Rotationswirkung: bildet auf ab, das ist genau eine -Drehung im Uhrzeigersinn.
2. Kombinierte Matrix . Zuerst rotieren, dann verschieben, also steht rechts (direkt am Punkt):
Anwendung auf :
Also .
Probe (schrittweise): Rotation zuerst: um im Uhrzeigersinn ergibt . Dann Translation : ✓ - stimmt mit überein.
3. Umgekehrte Reihenfolge :
Also . Die Matrixmultiplikation ist nicht kommutativ: . Anschaulich: bei wird zuerst verschoben und dann der schon verschobene Punkt um den Ursprung gedreht.
Kapitelbezug: Kapitel 5: Transformationen (homogene Koordinaten, Rotationsmatrix, Szenegraph, Nicht-Kommutativität).
Typischer Fehler: Bei der Drehung im Uhrzeigersinn das Vorzeichen von vergessen. Für ist , deshalb landet die unten links in (nicht oben rechts wie bei ). Und: die zuerst anzuwendende Transformation steht bei Spaltenvektoren ganz rechts (direkt am Punkt).
4. Aufgabe: Beleuchtung nach Phong (16 Punkte)
An einem Oberflächenpunkt steht eine Punktlichtquelle (point light), eine Kamera blickt auf . Gerechnet wird einkanalig (single channel) auf einer Skala bis .
Teil a (4 P): Nennen Sie die vier für das Phong-Reflexionsmodell nötigen (normierten) Vektoren an und geben Sie an, zwischen welchen Vektoren die Winkel und gemessen werden.
Teil b (6 P): Berechnen Sie die Helligkeit der diffusen und der spekularen Reflexion an für , und Glanzexponent (shininess) . Alle Material- und Lichtkonstanten sind hier . Zeigen Sie den Rechenweg.
Teil c (6 P): Nun mit realistischen Konstanten: diffuses Material , spekulares Material , Lichtfarbe , globales Ambient (ambient light) . Berechnen Sie die Gesamthelligkeit an mit der vollständigen Phong-Formel (einkanalig). Was bewirkt ein grösserer Exponent ?
Lösung anzeigen
Teil a - benötigte Vektoren (alle normiert) an :
- = Normale (normal) der Oberfläche.
- = Lichtvektor (light vector), zeigt von zur Lichtquelle.
- = Reflexionsvektor (reflection vector), Spiegelung von an .
- = Sicht-/Blickvektor (view vector), zeigt von zur Kamera.
Winkel: liegt zwischen und (steuert die diffuse Reflexion, ); liegt zwischen und (steuert die spekulare Reflexion, ).
Teil b - diffuse und spekulare Helligkeit (Konstanten ):
Diffuse Reflexion (Lambert):
Spekulare Reflexion (Phong):
Rechenweg: , also
Teil c - vollständige Phong-Formel (einkanalig, eine Lichtquelle):
Einsetzen mit und :
Die Gesamthelligkeit an beträgt also rund (ambienter Sockel , diffus , spekular ).
Wirkung von : Ein grösserer Glanzexponent macht das spekulare Glanzlicht (highlight) kleiner und härter (schärferer, konzentrierterer Glanzpunkt), weil mit steigendem ausserhalb von schneller gegen null fällt. Kleines ergibt ein grosses, weiches Highlight (matte, glänzende Oberfläche vs. spiegelnde).
Kapitelbezug: Kapitel 9: Visualisierungstechniken (Phong-Reflexionsmodell).
Typischer Fehler: und vertauschen ( misst zu , misst zu ) oder den Exponenten fälschlich auf den diffusen Term anwenden. gehört ausschliesslich zum spekularen Term. Ausserdem: der ambiente Term steht ausserhalb der Summe und hat keinen -Faktor.
5. Aufgabe: Farbinterpolation im Dreieck (10 Punkte)
Ein Dreieck hat die Vertices mit Farbe Rot , mit Farbe Grün und mit Farbe Blau . Gesucht ist der interpolierte RGB-Farbwert im Punkt .
Teil 1 (4 P): Beschreiben Sie das Vorgehen (baryzentrische Interpolation / barycentric interpolation). Teil 2 (6 P): Berechnen Sie den Farbwert nachvollziehbar. Führen Sie die Probe durch.
Lösung anzeigen
Teil 1 - Vorgehen. Innerhalb eines Dreiecks werden die Vertexfarben über baryzentrische Gewichte (barycentric weights = Flächenverhältnisse) interpoliert. Für jeden Vertex ist das Gewicht der Anteil der gegenüberliegenden Teildreiecksfläche an der Gesamtfläche:
Der Farbwert ist dann die gewichtete Summe . Die Dreiecksfläche berechnet man mit
Teil 2 - Rechnung.
Gesamtfläche mit , , :
- mit , , :
- mit , , :
- mit , , :
Probe: ✓
Farbwert:
Der Punkt liegt am nächsten an (Rot), daher überwiegt der Rotanteil ().
Kapitelbezug: Kapitel 8: Rendering-Pipeline (lineare Farbinterpolation im Dreieck).
Tipp: Immer die Probe machen. Das Gewicht gehört zur gegenüberliegenden Teilfläche (nicht zu der Teilfläche, die den Vertex enthält). Liegt nahe an , muss gross sein.
6. Aufgabe: Bildverarbeitung, lokale Operatoren (16 Punkte)
a (4 P): Was versteht man unter einer Faltung (convolution) in der Bildverarbeitung? Warum muss die Kernelgrösse (kernel size) aus ungeraden Zahlen (, , ...) bestehen?
b (6 P): Wenden Sie den Laplace-Operator auf die folgende Rastergrafik an. Der Kernel lässt sich nur auf die inneren Pixel (inner pixels) anwenden; geben Sie die Ergebnismatrix mit Rechenweg an.
| 10 | 10 | 10 | 10 |
|---|---|---|---|
| 10 | 50 | 80 | 10 |
| 10 | 80 | 50 | 10 |
| 10 | 10 | 10 | 10 |
c (6 P): Berechnen Sie den Median für das folgende -Fenster und vergleichen Sie ihn mit dem Mittelwert (mean). Was zeigt das Beispiel über Impulsrauschen (salt-and-pepper noise)?
| 60 | 62 | 61 |
|---|---|---|
| 63 | 5 | 64 |
| 62 | 60 | 63 |
Lösung anzeigen
a - Faltung und ungerade Kernelgrösse. Eine Faltung legt einen Kernel (Filtermaske, Gewichtsmatrix) über jedes Pixel, multipliziert die überdeckten Grauwerte mit den zugehörigen Kernelgewichten und summiert sie zum neuen Wert des Zentralpixels auf. Der Kernel wird dabei über das ganze Bild geschoben (sliding window).
Ein ungerader Kernel (, , ...) hat ein eindeutiges Zentrum (genau ein Mittelpixel). Nur so kann das Faltungsergebnis genau einem Ausgangspixel zugeordnet werden, und die Nachbarschaft ist symmetrisch um dieses Zentrum (kein halbpixel-Versatz / half-pixel shift). Bei gerader Kantenlänge läge das Zentrum zwischen vier Pixeln und das Ergebnis wäre nicht eindeutig positionierbar.
b - Laplace-Operator.
(Zentrum mit gewichtet, die vier direkten Nachbarn mit .) Bei einem -Kernel auf einem -Bild bleiben die inneren Pixel. Die Grauwerte der inneren Pixel sind , , , (Zeilen/Spalten ab gezählt):
- Pixel : oben , unten , links , rechts
- Pixel : oben , unten , links , rechts
- Pixel : oben , unten , links , rechts
- Pixel : oben , unten , links , rechts
Die grossen Beträge () markieren die hellen -Pixel, an denen der Grauwertsprung (grey-level jump) gegenüber dem dunklen Rand am stärksten ist; die -Pixel liegen je zwischen zwei -Nachbarn und einem dunklen Rand und ergeben nur .
c - Median vs. Mittelwert.
Die 9 Werte sortiert (sorted): .
Der Median ist der 5. Wert (, der mittlere der 9 sortierten Werte): .
Der Mittelwert ist
Aussage: Das Störpixel (dunkles Impuls-/Pfefferrauschen, pepper noise) zieht den Mittelwert deutlich nach unten (, obwohl fast alle Nachbarn um liegen), während der Median mit dem tatsächlichen lokalen Grauwert entspricht und den Ausreisser (outlier) vollständig ignoriert. Der Median erzeugt zudem keine neuen Grauwerte (er wählt einen vorhandenen Wert), während der Mittelwert den neuen, im Original nicht vorkommenden Wert erzeugt. Für Salz-und-Pfeffer-Rauschen ist der Median klar überlegen.
Kapitelbezug: Kapitel 12: Bildverarbeitung - Lokale Operatoren.
Typischer Fehler: Beim Median den Durchschnitt statt des sortierten Mittelwerts bilden - der Median ist der Rang , keine Rechnung. Beim Laplace das Randproblem übersehen: ein -Kernel ohne Randbehandlung liefert aus einem -Bild eine -Ergebnismatrix.
7. Aufgabe (Zusatz): Grauwerttransformation und Projektion (10 Punkte)
Nach einer Faltung liegen die Pixelwerte im Intervall . Gesucht sind lineare Grauwerttransformationen (grey-level transformation) der Form .
a (4 P): Bilden Sie auf den Grauwertbereich ab. Wie verändert sich das Histogramm?
b (4 P): Bilden Sie auf ab. Ist das Ergebnis kontrastreicher oder kontrastärmer? Begründung.
c (2 P): Nennen Sie die Parameter von glm::perspective(a, b, c, d).
Lösung anzeigen
Allgemein: ; so wählen, dass auf fällt (bekannten Punkt einsetzen und auflösen).
a) :
Probe: ✓, ✓.
Histogramm: Wegen wird der Wertebereich gespreizt (stretched). Die Balkenform bleibt erhalten, es entstehen aber Lücken (Kammform / comb pattern), weil benachbarte ganzzahlige Eingabewerte auf um auseinanderliegende Ausgabewerte abgebildet werden. Der Kontrast steigt.
b) :
Probe: ✓, ✓.
Kontrast: Wegen wird der Wertebereich gestaucht (compressed), das Ergebnis ist kontrastärmer (die Grauwertspanne schrumpft von auf ).
c) glm::perspective(a, b, c, d):
- a = fovy (vertikaler Öffnungswinkel / field of view in y)
- b = aspect (Seitenverhältnis Breite/Höhe / aspect ratio)
- c = zNear (Abstand der nahen Clipping-Ebene / near clipping plane)
- d = zFar (Abstand der fernen Clipping-Ebene / far clipping plane)
Kapitelbezug: Kapitel 11: Bildbearbeitung - Punktoperatoren (lineare Grauwerttransformation, Histogramm), Kapitel 7: Kameras (perspektivische Projektion).
Typischer Fehler:
addfalsch bestimmen. Sichere Methode: aus den Intervallbreiten berechnen, dann einen bekannten Punkt (z.B. ) einsetzen und nachaddauflösen. Faustregel: spreizt (mehr Kontrast), staucht (weniger Kontrast).
Klausur WS2025 (Lösungen) · Probeklausur 1 · Kapitelübersicht