Probeklausur 3 - Visual Computing
Ü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 (kein Überschneiden mit Probeklausur 1 oder 2). 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 und ein beschriebenes DIN-A4-Blatt. Insgesamt 100 Punkte.
1. Aufgabe: RGB und HSV Farbmodelle (13 Punkte)
Teil a (7 P): Rechnen Sie die folgenden drei Farben aus dem RGB-Modell (Wertebereich ) in das HSV-Modell um. Geben Sie jeweils (Hue), (Saturation) und (Value) an und zeigen Sie den Rechenweg. Verwenden Sie fuer den Farbton die allgemeine Hue-Formel (nicht nur die Standardwinkel).
| Farbe | |
|---|---|
| Farbe 1 | |
| Farbe 2 | |
| Farbe 3 |
Teil b (6 P): Rechnen Sie umgekehrt die folgenden zwei Farben aus dem HSV-Modell zurück in RGB (Wertebereich ). Zeigen Sie den Rechenweg mit den Hilfsgrössen (Chroma), und .
| Farbe | |
|---|---|
| Farbe 4 | |
| Farbe 5 |
Lösung anzeigen
Teil a - Umrechnung RGB nach HSV. Formeln (Kapitel 10): , , (bzw. falls ), und der Farbton
Farbe 1 - Orange:
- , ,
- , also
- Ergebnis: (Orange liegt genau zwischen Rot bei und Gelb bei ).
Farbe 2 - Grauton:
- ,
- Wegen ist undefiniert (unbunt).
- Ergebnis:
Farbe 3 - Frühlingsgrün:
- , ,
- , also
- Ergebnis: (liegt zwischen Grün bei und Cyan bei ).
Teil b - Umrechnung HSV nach RGB. Formeln (Kapitel 10): , , , . Je nach Sektor von :
Am Ende: .
Farbe 4 :
- Sektor , also
- - halbhelles Blau. Probe: ✓, ✓.
Farbe 5 :
- Sektor , also
- - reines Orange. Das ist genau die Umkehrung von Farbe 1 aus Teil a ✓.
Kapitelbezug: Kapitel 10: Farbräume.
Typischer Fehler: mit verwechseln oder als Mittelwert berechnen. Merke: (nicht der Durchschnitt), ist der relative Abstand von Grau (). Bei der Rückrichtung nicht vergessen, am Ende auf alle drei Kanäle zu addieren.
2. Aufgabe: OpenGL Shader (18 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 fragColor;
uniform float brightness;
void main() {
fragColor = vec4(colorVS * brightness, 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 hat sie im Shader? Worin unterscheidet sich brightness von den Matrix-Uniforms in der Verwendung?
c (3 P): Was passiert mit den out-Variablen normalVS und colorVS auf dem Weg vom Vertex- zum Fragment-Shader? Warum sollte eine Normale im Fragment-Shader gegebenenfalls erneut normiert werden?
d (3 P): Erklären Sie die Zeile gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(vertex, 1.0);. In welcher Reihenfolge wirken die Matrizen, und wozu dient das 1.0?
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ö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 werden gebunden: = Position (vertex), = Normale (vertex_normal), = Vertexfarbe (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 (via glGetUniformLocation) adressiert wird. Im Shader ist sie READ-ONLY. In der Verwendung gibt es keinen prinzipiellen Unterschied: brightness wird mit glUniform1f gesetzt, die Matrizen mit glUniformMatrix4fv; beide sind pro Draw-Call konstant. brightness ist nur ein einzelner Skalar (float), die Matrizen sind -Werte (mat4).
c) Beide out-Werte des Vertex-Shaders werden bei der Rasterisierung automatisch über das Primitiv (Dreieck) interpoliert (perspektivisch korrekt) und kommen als gleichnamige in-Variablen im Fragment-Shader an. Die Kopplung erfolgt über gleichen Namen und Typ. Eine Normale sollte im Fragment-Shader erneut mit normalize() normiert werden, weil die lineare Interpolation zweier Einheitsvektoren im Allgemeinen keinen Einheitsvektor mehr ergibt (die interpolierte Länge ist meist kleiner als ), was Beleuchtungsrechnungen verfälschen würde.
d) Bei Spaltenvektoren werden die Matrizen von rechts nach links angewendet:
Zuerst bringt die Model-Matrix den Vertex vom lokalen ins Weltkoordinatensystem, dann die View-Matrix ins Kamerakoordinatensystem, zuletzt die Projektions-Matrix in den Clip-Raum. Das 1.0 homogenisiert die 3D-Position zu einem vec4 mit ; nur mit wirken die Translationsanteile (letzte Spalte der -Matrizen). Ein reiner Richtungsvektor (z.B. eine Normale) bekäme stattdessen .
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: Die interpolierte Normale immer im Fragment-Shader neu normieren. Und:
uniform(konstant pro Draw-Call, per Name adressiert) sauber vonin-Vertex-Attributen (variieren pro Vertex, perlocation-Index adressiert) trennen.
3. Aufgabe: Affine Transformationen (16 Punkte)
Teil a (6 P): Eine 2D-Szene "Segelboot-Symbol" soll aus zwei Basiselementen aufgebaut werden: Kreis (Einheitskreis, Radius , Zentrum Ursprung) und Dreieck (Basis von bis auf der x-Achse, Spitze bei ). Zielszene:
- Sonne: ein Kreis mit Radius , Zentrum im Ursprung.
- Kleiner Kreis (Bullauge): ein Kreis mit Radius , Zentrum bei .
- Segel: ein Dreieck, um im Uhrzeigersinn gedreht (Spitze zeigt danach nach rechts), doppelt so gross, Zentrum bei .
Geben Sie für jedes der drei Blätter die nötigen Transformationen samt Parametern und in der richtigen Reihenfolge an. Erläutern Sie kurz die Vererbung im Szenegraphen.
Teil b (10 P): Ein Punkt soll erst um den Faktor skaliert und danach um gegen den Uhrzeigersinn um den Ursprung gedreht werden.
- Stellen Sie die Skalierungsmatrix und die Rotationsmatrix in homogenen Koordinaten () auf.
- Berechnen Sie die kombinierte Matrix und wenden Sie sie auf an (Probe).
- Zeigen Sie, dass die umgekehrte Reihenfolge ein anderes Ergebnis liefert (Nicht-Kommutativität).
Lösung anzeigen
Teil a - Transformationen pro Blatt (Basiselemente sind Einheitskreis und Standarddreieck):
- Sonne: Einheitskreis () auf vergrössern, Zentrum bleibt im Ursprung -> Skalierung.
- Kleiner Kreis: Einheitskreis auf verkleinern, dann an die Position schieben -> Skalierung, danach Translation. Reihenfolge beachten: erst skalieren (um den Ursprung), dann verschieben, sonst wird der Abstand zum Ursprung mitskaliert.
- Segel: Standarddreieck um im Uhrzeigersinn drehen (das entspricht Rotation), auf doppelte Grösse Skalierung, dann an die Position Translation. Anwendungsreihenfolge am Objekt: erst Skalierung, dann Rotation, dann Translation.
Vererbung: Im Szenegraphen erben Kind-Objekte die Transformationen ihres Elternknotens. Eine Transformation, die auf alle Teile wirken soll (z.B. das ganze Boot verschieben), notiert man einmal am Elternknoten Segelboot; sie wird mit den blattspezifischen Transformationen zur akkumulierten Matrix verkettet. Bei Spaltenvektoren steht die Wurzel-Transformation dabei ganz links (wirkt als äusserste, zuletzt angewandte Transformation).
Teil b - homogene Transformation.
1. Matrizen aufstellen. Skalierung mit und Rotation mit (, ):
2. Kombinierte Matrix . Zuerst skalieren, dann rotieren, also steht rechts (direkt am Punkt):
Anwendung auf :
Also .
Probe (schrittweise): Skalierung zuerst: . Dann Rotation CCW: ✓ - stimmt mit überein.
3. Umgekehrte Reihenfolge :
Also . Probe: erst Rotation , dann Skalierung ✓. Die Matrixmultiplikation ist nicht kommutativ: .
Kapitelbezug: Kapitel 5: Transformationen (homogene Koordinaten, Rotations- und Skalierungsmatrix, Szenegraph, Nicht-Kommutativität).
Typischer Fehler: Die zuerst anzuwendende Transformation links statt rechts notieren. Bei Spaltenvektoren steht die erste Transformation direkt am Punkt, also ganz rechts. Ausserdem: im Uhrzeigersinn entspricht (also ).
4. Aufgabe: Beleuchtung nach Phong (15 Punkte)
An einem Oberflächenpunkt steht eine Punktlichtquelle, eine Kamera blickt auf . Gerechnet wird einkanalig 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 (Material- und Lichtkonstanten ). Zeigen Sie den Rechenweg.
Teil c (5 P): Nun mit realistischen Konstanten: diffuses Material , spekulares Material , Lichtfarbe , globales Ambient . Berechnen Sie die Gesamthelligkeit an mit der vollständigen Phong-Formel. Was bewirkt ein grösserer Exponent ?
Lösung anzeigen
Teil a - benötigte Vektoren (alle normiert) an :
- = Normale der Oberfläche.
- = Lichtvektor, zeigt von zur Lichtquelle.
- = Reflexionsvektor, Spiegelung von an .
- = Sicht-/Blickvektor, 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 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 Oberfläche).
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 (12 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). Teil 2 (8 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 :
- :
- :
Probe: ✓
Farbwert:
Der Punkt liegt tief (nahe der Basiskante ) und weit von (Blau) entfernt, deshalb sind Rot- und Grünanteil gleich gross und der Blauanteil klein.
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 enthält). Liegt nahe an , muss gross sein.
6. Aufgabe: Bildverarbeitung, lokale Operatoren (16 Punkte)
a (3 P): Warum muss die Grösse von Faltungskerneln aus ungeraden Zahlen (, , ...) bestehen? Was bewirkt der folgende Kernel, und was ist an seiner Koeffizientensumme bemerkenswert?
b (5 P): Wenden Sie den Laplace-Operator auf die folgende Rastergrafik an. Der Kernel lässt sich nur auf die inneren Pixel anwenden; geben Sie die Ergebnismatrix mit Rechenweg an.
| 20 | 20 | 80 | 80 |
|---|---|---|---|
| 20 | 20 | 80 | 80 |
| 20 | 20 | 80 | 80 |
| 20 | 20 | 80 | 80 |
c (4 P): Berechnen Sie den Median für das folgende -Fenster und vergleichen Sie ihn mit dem Mittelwert. Was zeigt das Beispiel?
| 30 | 32 | 31 |
|---|---|---|
| 33 | 5 | 34 |
| 31 | 30 | 32 |
d (4 P): Bestimmen Sie für die folgende Binärgrafik (X = Vordergrund, . = Hintergrund) die Anzahl der Zusammenhangskomponenten (ZHK) einmal mit N4- und einmal mit N8-Nachbarschaft. Begründen Sie den Unterschied.
| X | . | . | . | X |
|---|---|---|---|---|
| . | X | . | X | . |
| . | . | X | . | . |
| . | X | . | X | . |
| X | . | . | . | X |
Lösung anzeigen
a - ungerade Kernelgrösse und Wirkung von . Ein ungerader Kernel (, , ...) hat ein eindeutiges Zentrum. Nur so lässt sich das Faltungsergebnis genau einem Ausgangspixel zuordnen, und der Kernel ist symmetrisch um dieses Zentrum (kein Halbpixel-Versatz).
ist der Sobel-Operator in y-Richtung: er bildet die gewichtete Differenz zwischen der oberen und der unteren Zeile (obere Zeile , untere Zeile , mittlere Spalte doppelt gewichtet). Er ist ein Kanten-/Ableitungsoperator (erste Ableitung in vertikaler Richtung) und hebt damit horizontale Kanten hervor (Grauwertsprünge von oben nach unten). Bemerkenswert: die Koeffizientensumme ist (). Deshalb liefert er in konstanten Flächen den Wert und reagiert nur an Kanten; er braucht keine weitere additive Grauwertkorrektur, um konstante Bereiche auf abzubilden.
b - Laplace-Operator.
Bei einem -Kernel auf einem -Bild bleiben die inneren Pixel (Zeilen/Spalten und , von gezählt):
- Pixel : (oben , unten , links , rechts )
- Pixel : (oben , unten , links , rechts )
- Pixel :
- Pixel :
Die Ergebnismatrix zeigt links und rechts der senkrechten Kante (Sprung zwischen Spalte und ) betragsgleiche Ausschläge mit Vorzeichenwechsel (Nulldurchgang genau an der Kante). Konstante Bereiche ohne inneren Nachbarwechsel gäben .
c - Median vs. Mittelwert.
Die 9 Werte sortiert: .
Der Median ist der 5. Wert (): .
Der Mittelwert ist
Aussage: Das Störpixel (Pfeffer-Rauschen, dunkler Ausreisser) zieht den Mittelwert nach unten auf , obwohl alle echten Nachbarn um liegen. Der Median () entspricht dem tatsächlichen lokalen Grauwert und ignoriert den Ausreisser vollständig, weil dieser beim Sortieren an den Rand () wandert und daher nie als Median gewählt wird. Der Median ist hier klar überlegen und erzeugt zudem keine neuen Grauwerte.
d - Zusammenhangskomponenten (ZHK). Alle 9 Vordergrundpixel liegen auf den beiden Diagonalen eines "X" und berühren sich untereinander nur diagonal: Positionen (Zeile, Spalte): .
- N4-Nachbarschaft (nur oben/unten/links/rechts): Kein Vordergrundpixel hat einen 4-Nachbarn, der ebenfalls Vordergrund ist (alle Verbindungen sind diagonal). Jedes Pixel ist also eine eigene Komponente -> .
- N8-Nachbarschaft (zusätzlich die 4 Diagonalen): Beide Diagonalen sind lückenlos diagonal verbunden und treffen sich im Zentrum . Das gesamte "X" bildet eine einzige Komponente -> .
Begründung: N8 verbindet zusätzlich diagonal berührende Pixel, deshalb ergibt dasselbe Bild mit N8 immer gleich viele oder weniger Komponenten als mit N4. Diagonale "Ketten" zerfallen bei N4 in lauter Einzelpixel, bei N8 verschmelzen sie.
Kapitelbezug: Kapitel 12: Bildverarbeitung - Lokale Operatoren (Faltung, Kantenoperatoren, Median, Segmentierung, ZHK).
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. Bei den ZHK die Nachbarschaftsdefinition (N4 vs N8) genau beachten.
7. Aufgabe (Zusatz): Grauwerttransformation und Projektion (10 Punkte)
Nach einer Faltung liegen die Pixelwerte im Intervall . Gesucht sind lineare Grauwerttransformationen 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 (gestreckt). Die Balkenform bleibt erhalten, es entstehen aber Lücken (Kammform), weil benachbarte ganzzahlige Eingabewerte auf um auseinanderliegende Ausgabewerte abgebildet werden. Der Kontrast steigt.
b) :
Probe: ✓, ✓.
Kontrast: Wegen wird der Wertebereich gestaucht, 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)
- c = zNear (Abstand der nahen Clipping-Ebene)
- d = zFar (Abstand der fernen Clipping-Ebene)
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