Probeklausur 1 - 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. Alle Lösungen sind ausklappbar mit vollem Rechenweg, Begründung und Kapitelbezug. Zum Vergleich mit dem Original: Klausur WS2025 (Lösungen).
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 (6 P): Rechnen Sie die folgenden drei Farben aus dem RGB-Modell (Wertebereich ) in das HSV-Modell um. Geben Sie jeweils (Value), (Saturation) und (Hue) 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 Rot , mittig Gelb , rechts Blau . 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 Kanal man RGB von HSV am schnellsten unterscheidet.
Lösung anzeigen
Teil a - Umrechnung RGB nach HSV. Formeln (Kapitel 10): , , = Farbwinkel auf dem Farbkreis ( Rot, Gelb, Grün, Cyan, Blau, Magenta).
Farbe 1 - Gelb:
- Rot und Grün sind maximal, Blau ist null: reines Gelb, also .
- Ergebnis:
Farbe 2 - Grauton:
- Wegen ist undefiniert (unbunt).
- Ergebnis:
Farbe 3 - entsättigtes Blau:
- Blau ist maximal, Rot und Grün gleich (kein Anteil Richtung Cyan oder Magenta): .
- Ergebnis:
Teil b - Kanalzerlegung.
RGB-Kanäle (weiss = 1, schwarz = 0):
| Region | R | G | B |
|---|---|---|---|
| Hintergrund (weiss) | 1 | 1 | 1 |
| Rot | 1 | 0 | 0 |
| Gelb | 1 | 1 | 0 |
| Blau | 0 | 0 | 1 |
HSV-Kanäle:
| Region | H | S | V |
|---|---|---|---|
| Hintergrund (weiss) | undef (0) | 0 | 1 |
| Rot | 1 | 1 | |
| Gelb | 1 | 1 | |
| Blau | 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 Hintergrund. In HSV gilt für Weiss (weiss), aber (schwarz) und undefiniert (schwarz dargestellt). Die HSV-Zerlegung zeigt also einen Kanal (V) mit weissem Hintergrund und zwei (H, S) mit schwarzem Hintergrund. Sind alle drei Hintergründe hell, liegt RGB vor; sind zwei dunkel, liegt HSV vor.
Kapitelbezug: Kapitel 10: Farbräume.
Typischer Fehler: als Mittelwert der drei Kanäle berechnen. ist das Maximum , nicht der Durchschnitt. Ausserdem und vertauschen: Bei voll gesättigten Farben ist und , bei einem Grauton dagegen und = der gemeinsame Grauwert.
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 vec2 vertex_uv;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projMatrix;
out vec2 uvVS;
void main() {
gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(vertex, 1.0);
uvVS = vertex_uv;
}
// Fragment Shader
#version 330
in vec2 uvVS;
out vec4 color;
uniform vec3 baseColor;
void main() {
color = vec4(baseColor * uvVS.x, 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?
c (3 P): Erklären Sie den Unterschied zwischen in und out. Was passiert mit einem out-Wert des Vertex-Shaders auf dem Weg zum Fragment-Shader?
d (4 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: = Position (vertex), = Normale (vertex_normal), = Texturkoordinate (vertex_uv).
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. Verwendung z.B. für Transformationsmatrizen (modelMatrix, viewMatrix, projMatrix), Lichtparameter oder hier die baseColor.
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 (READ/WRITE), die an die nächste Pipeline-Stufe weitergereicht wird. Ein out-Wert des Vertex-Shaders (hier uvVS) wird bei der Rasterisierung automatisch über das Primitiv interpoliert, bevor er als in im Fragment-Shader ankommt. Kopplung erfolgt über gleichen Namen und gleichen Typ in beiden Shadern.
d) Die Matrizen werden bei Spaltenvektoren von rechts nach links angewendet:
Zuerst bringt die Model-Matrix den Vertex aus dem lokalen ins Weltkoordinatensystem, dann die View-Matrix ins Kamerakoordinatensystem, dann die Projektions-Matrix in den Clip-Raum. Das 1.0 homogenisiert die 3D-Position zu einem vec4 mit ; nur so lassen sich Translationen (in der letzten Spalte der -Matrizen) überhaupt ausführen. Ein Richtungsvektor 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:
uniform(konstant pro Draw-Call, per Name adressiert) klar vonin-Vertex-Attributen (variieren pro Vertex, perlocation-Index adressiert) trennen. Und: der Fragment-Output ist erst nach Tiefentest und Blending das finale Pixel.
3. Aufgabe: Affine Transformationen (16 Punkte)
Teil a (6 P): Eine 2D-Szene "Roboterkopf" soll aus zwei Basiselementen aufgebaut werden: Kreis (Einheitskreis, Radius , Zentrum Ursprung) und Dreieck (Basis von bis auf der x-Achse, Spitze bei ). Zielszene:
- Kopf: ein Kreis mit Radius , Zentrum im Ursprung.
- Linkes Auge: ein Kreis mit Radius , Zentrum bei .
- Nase: ein Dreieck, um gedreht (Spitze zeigt nach unten), unverändert gross, Zentrum bei .
Geben Sie für jedes der drei Blätter die nötigen Transformationen samt Parametern an. Erläutern Sie kurz die Vererbung im Szenegraphen.
Teil b (10 P): Ein Punkt soll erst um gegen den Uhrzeigersinn 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 (Probe).
- Zeigen Sie an derselben Rechnung, dass die umgekehrte Reihenfolge ein anderes Ergebnis liefert (Nicht-Kommutativität).
Lösung anzeigen
Teil a - Transformationen pro Blatt (Basiselemente sind Einheitskreis und Standarddreieck):
- Kopf: Einheitskreis () auf vergrössern, Zentrum bleibt im Ursprung -> Skalierung.
- Linkes Auge: Einheitskreis auf verkleinern und an die Position schieben -> Skalierung, dann Translation. Reihenfolge beachten: erst skalieren (um den Ursprung), dann verschieben, sonst wird der Abstand zum Ursprung mitskaliert.
- Nase: Standarddreieck um drehen (Spitze zeigt danach nach unten) -> Rotation, dann Translation. Die Grösse bleibt unverändert (keine Skalierung).
Vererbung: Im Szenegraphen erben Kind-Objekte die Transformationen ihres Elternknotens. Eine Transformation, die auf alle Teile wirken soll (z.B. den ganzen Kopf drehen), notiert man einmal am Elternknoten Roboterkopf; 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. Für gilt , :
2. Kombinierte Matrix . Zuerst rotieren, dann verschieben, also steht rechts (direkt am Punkt):
Anwendung auf :
Also .
Probe (schrittweise): Rotation zuerst: um CCW ergibt . Dann Translation : ✓ - stimmt mit überein.
3. Umgekehrte Reihenfolge :
Also . Die Matrixmultiplikation ist nicht kommutativ: .
Kapitelbezug: Kapitel 5: Transformationen (homogene Koordinaten, Rotationsmatrix, 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: Skalierung und Rotation wirken nur relativ zum Ursprung, deshalb beim Auge erst skalieren, dann verschieben.
4. Aufgabe: Beleuchtung nach Phong (16 Punkte)
An einem Oberflächenpunkt steht eine Punktlichtquelle, eine Kamera blickt auf . Alle Material- und Lichtkonstanten sind zunächst , gerechnet wird 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 . Zeigen Sie den Rechenweg.
Teil c (6 P): Nun mit realistischen Konstanten: diffuses Material , spekulares Material , Lichtfarbe , globales Ambient . 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 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 . Damit
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.
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). 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 :
- :
- :
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): Erklären Sie den Unterschied zwischen dem Mittelwertoperator (Faltung) und dem Medianoperator (Rangordnung). Warum erhält der Median Kanten besser und entfernt Salz-und-Pfeffer-Rauschen wirksamer?
b (6 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.
| 10 | 10 | 10 | 10 |
|---|---|---|---|
| 10 | 90 | 20 | 10 |
| 10 | 20 | 90 | 10 |
| 10 | 10 | 10 | 10 |
c (6 P): Berechnen Sie den Median für das folgende -Fenster und vergleichen Sie ihn mit dem Mittelwert. Was zeigt das Beispiel?
| 52 | 55 | 54 |
|---|---|---|
| 53 | 250 | 56 |
| 54 | 55 | 53 |
Lösung anzeigen
a - Mittelwert vs. Median. Der Mittelwertoperator (mean filter) ist eine lineare Faltung: er bildet den gewichteten Durchschnitt der Nachbarschaft. Dadurch kann er neue, im Original nicht vorhandene Grauwerte erzeugen, verwischt Kanten und ist empfindlich gegenüber Ausreissern (ein einzelner extremer Wert zieht den Durchschnitt mit). Der Medianoperator ist ein nichtlinearer Rangordnungsoperator: er sortiert die überdeckten Werte und wählt den mittleren. Er erzeugt keine neuen Grauwerte, erhält Kanten (der Mehrheitswert auf jeder Kantenseite bleibt erhalten) und entfernt Impuls-/Salz-und-Pfeffer-Rauschen wirksam, weil ein einzelner Ausreisser beim Sortieren an den Rand ( oder ) wandert und daher nie als Median ausgewählt wird.
b - Laplace-Operator.
(Hinweis: Vorzeichen abhängig von der Kernel-Orientierung; hier wird das Zentrum mit gewichtet, die 4 direkten Nachbarn mit , das Zentrum ist also .) Bei einem -Kernel auf einem -Bild bleiben die inneren Pixel:
- Pixel :
- Pixel :
- Pixel :
- Pixel :
(Nachbarn jeweils oben/unten/links/rechts; z.B. für : oben , unten , links , rechts .)
Die grossen Beträge markieren die starken lokalen Grauwertsprünge um die beiden hellen -Pixel.
c - Median vs. Mittelwert.
Die 9 Werte sortiert: .
Der Median ist der 5. Wert (): .
Der Mittelwert ist
Aussage: Das Störpixel (Impulsrauschen) zieht den Mittelwert stark nach oben (, obwohl fast alle Nachbarn um liegen), während der Median mit dem tatsächlichen lokalen Grauwert entspricht und den Ausreisser vollständig ignoriert. Der Median ist hier 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 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).