Probeklausur 4 - Visual Computing (erhöhter Schwierigkeitsgrad)
Übungsklausur (mock exam) zum Kurs "Visual Computing" (HS Darmstadt) mit erhöhtem Schwierigkeitsgrad. Sie folgt Struktur, Themenmix und Punktgewichtung der Original-Klausur WS 2025/2026, verlangt aber mehr mehrstufige Rechenschritte (mehr Zwischenrechnungen, gedrehte Dreiecke, Rotation um einen Punkt, Phong mit echten 3D-Vektoren, volle Hue-Formel). Alle Aufgaben sind neu und überschneiden sich nicht mit Probeklausur 1, 2 oder 3. Lösungen sind ausklappbar mit vollem Rechenweg. 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 (9 P): Rechnen Sie die folgenden drei Farben aus dem RGB-Modell (Wertebereich ) exakt in das HSV-Modell um. Verwenden Sie die vollständige Hue-Formel (nicht nur "reine" Primärfarben ablesen) und zeigen Sie jeden Schritt: , und .
| Farbe | |
|---|---|
| Farbe 1 | |
| Farbe 2 | |
| Farbe 3 |
Teil b (4 P): Eine Grafik zeigt auf schwarzem Hintergrund drei Quadrate: Orange , Türkis und Mittelgrau . Geben Sie für jede Region die HSV-Kanalwerte an und begründen Sie, warum man keinen einzelnen Kanal findet, der alle vier Regionen (inkl. Hintergrund) eindeutig unterscheidet.
Lösung anzeigen
Teil a - vollständige RGB-nach-HSV-Umrechnung. Formeln (Kapitel 10) mit , , :
Farbe 1 :
- , ,
- (Orange)
- Ergebnis:
Farbe 2 :
- , ,
- Ergebnis: (Farbton zwischen Grün und Cyan )
Farbe 3 :
- , ,
- Ergebnis: (Farbton zwischen Blau und Magenta , also Violett)
Teil b - HSV-Kanalwerte. Türkis : (G und B gleich), , (Cyan). Mittelgrau: , undefiniert. Schwarz: , , undefiniert.
| Region | |||
|---|---|---|---|
| Hintergrund (Schwarz) | undef (0) | 0 | 0 |
| Orange | 1 | 1 | |
| Türkis | 1 | 0{,}5 | |
| Mittelgrau | undef (0) | 0 | 0{,}5 |
Begründung (kein einzelner Kanal reicht):
- trennt Orange () vom Rest, aber Türkis und Mittelgrau haben beide und sind ununterscheidbar.
- trennt die bunten () von den unbunten Regionen (), aber Schwarz und Mittelgrau haben beide , Orange und Türkis beide .
- trennt Orange () von Türkis (), ist aber bei Schwarz und Mittelgrau undefiniert (gleich dargestellt).
Erst die Kombination aus mindestens zwei Kanälen (z.B. und ) trennt alle vier Regionen eindeutig. Das ist der Kern der HSV-Zerlegung: Buntheit (), Helligkeit () und Farbton () sind entkoppelt.
Kapitelbezug: Kapitel 10: Farbräume, Kapitel 3: Farben und Primitive.
Typischer Fehler: Bei oder den falschen Zweig der Hue-Formel nehmen oder die Konstante bzw. vergessen. Merke: (rot-dominant), (grün-dominant), (blau-dominant), jeweils mal . Ausserdem: , nicht allein.
2. Aufgabe: OpenGL Shader mit Beleuchtung (19 Punkte)
Gegeben ist ein Shader-Paar, das die diffuse Beleuchtung pro Fragment berechnet:
// Vertex Shader
#version 330
layout(location = 0) in vec3 vertex;
layout(location = 1) in vec3 vertex_normal;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projMatrix;
out vec3 normalVS;
void main() {
gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(vertex, 1.0);
normalVS = vertex_normal;
}
// Fragment Shader
#version 330
in vec3 normalVS;
out vec4 color;
uniform vec3 lightDir; // normiert, zeigt von der Oberflaeche zur Lichtquelle
uniform vec3 objColor;
void main() {
vec3 N = normalize(normalVS);
float diff = max(dot(N, normalize(lightDir)), 0.0);
color = vec4(objColor * diff, 1.0);
}
a (3 P): Worauf verweist der index in layout(location = index)? Welche zwei Attribute werden hier gebunden?
b (3 P): Was ist eine uniform Variable und welche Zugriffsrechte hat sie im Shader? Warum ist lightDir als uniform und nicht als in-Attribut deklariert?
c (4 P): Warum wird normalVS im Fragment-Shader mit normalize(...) erneut normiert, obwohl die Vertex-Normalen bereits Einheitslänge hatten?
d (3 P): Erklären Sie die Zeile float diff = max(dot(N, normalize(lightDir)), 0.0);. Welches Beleuchtungsgesetz steckt dahinter und wozu dient das max(..., 0.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).
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* gesetzt und per Variablenname adressiert wird. Im Shader ist sie READ-ONLY. lightDir ist ein uniform, weil die Lichtrichtung für das ganze Objekt gleich ist (ändert sich nicht von Vertex zu Vertex). Ein in-Attribut würde dagegen pro Vertex einen eigenen Wert aus dem VBO lesen, was hier unnötig wäre.
c) Der out-Wert normalVS wird bei der Rasterisierung linear über das Dreieck interpoliert, bevor er als in im Fragment-Shader ankommt. Die lineare Interpolation zweier Einheitsvektoren ergibt aber im Allgemeinen einen Vektor mit Länge (der interpolierte Vektor "hängt durch"). Für das Skalarprodukt muss aber wieder normiert sein, sonst wäre die berechnete Helligkeit systematisch zu dunkel. Deshalb normalize erneut im Fragment-Shader.
d) Das ist das Lambert-Gesetz (diffuse Reflexion): Die Helligkeit ist proportional zu , dem Skalarprodukt aus normierter Flächennormale und normiertem Lichtvektor . Das max(..., 0.0) klemmt negative Werte auf : Zeigt die Lichtquelle hinter die Fläche (, also ), soll die Fläche nicht "negativ beleuchtet" (und schon gar nicht abgezogen) werden, sondern schlicht unbeleuchtet () bleiben.
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, Kapitel 9: Visualisierungstechniken.
Typischer Fehler: Annehmen, eine im Vertex-Shader normierte Normale bleibe nach der Interpolation normiert. Interpolation erhält die Richtung näherungsweise, aber nicht die Länge, daher die erneute Normierung pro Fragment.
3. Aufgabe: Affine Transformationen und Rotation um einen Punkt (16 Punkte)
Teil a (6 P): Eine 2D-Szene "Eiswaffel" wird aus zwei Basiselementen aufgebaut: Kreis (Einheitskreis, Radius , Zentrum Ursprung) und Dreieck (Basis von bis auf der x-Achse, Spitze bei ). Zielszene:
- Kugel: ein Kreis mit Radius , Zentrum bei .
- Waffel: ein Dreieck, das nach unten zeigt (Spitze unten) und doppelt so hoch wie breit ist, Spitze bei etwa .
Geben Sie für jedes Blatt die nötigen Transformationen samt Parametern in korrekter Reihenfolge an. Begründen Sie bei der Waffel die Reihenfolge von Skalierung, Rotation und Translation.
Teil b (10 P): Ein Punkt soll um gegen den Uhrzeigersinn um den Drehpunkt (nicht um den Ursprung) gedreht werden.
- Stellen Sie die drei benötigten Matrizen in homogenen Koordinaten () auf: , , .
- Berechnen Sie die kombinierte Matrix .
- Wenden Sie auf an und bestätigen Sie das Ergebnis mit einer geometrischen Probe. Zeigen Sie, dass eine Drehung um den Ursprung ein anderes Ergebnis liefert.
Lösung anzeigen
Teil a - Transformationen pro Blatt.
-
Kugel: Einheitskreis () auf vergrössern, dann an die Position schieben -> Skalierung, danach Translation. Erst skalieren (um den Ursprung), dann verschieben, sonst würde der Abstand zum Ursprung mitskaliert.
-
Waffel: drei Schritte in dieser Reihenfolge (von innen nach aussen):
- Skalierung - nicht-uniform, macht das Dreieck doppelt so hoch (Spitze wandert von auf ), Breite bleibt.
- Rotation - dreht die Spitze nach unten (auf ).
- Translation - hier keine weitere Verschiebung nötig, die Spitze liegt bereits bei .
Reihenfolge-Begründung: Skalierung und Rotation wirken relativ zum Ursprung. Würde man zuerst verschieben und dann rotieren/skalieren, drehte bzw. streckte sich das Dreieck um den Ursprung statt um seine eigene Mitte. Bei Spaltenvektoren gilt , d.h. die zuerst anzuwendende Transformation () steht ganz rechts (direkt am Punkt).
Vererbung: Kind-Objekte erben die Transformationen des Elternknotens Eiswaffel. Eine gemeinsame Transformation (z.B. die ganze Waffel kippen) notiert man einmal am Elternknoten; sie wird mit den blattspezifischen Matrizen verkettet.
Teil b - Rotation um den Punkt .
1. Matrizen aufstellen. Für : , .
Idee: erst in den Ursprung schieben (), dort um drehen (), dann zurückschieben ().
2. Kombinierte Matrix. Zuerst :
Dann :
3. Anwendung auf :
Also .
Geometrische Probe: relativ zu : . Drehung um CCW: , also . Zurückschieben : ✓ - stimmt mit überein.
Drehung um den Ursprung (zum Vergleich): . Der Drehpunkt verschiebt das Ergebnis: um landet bei , um den Ursprung bei .
Kapitelbezug: Kapitel 5: Transformationen (homogene Koordinaten, Rotation um einen Punkt, Verkettung, Nicht-Kommutativität).
Typischer Fehler: Bei der Rotation um einen Punkt das Zurückschieben vergessen oder und vertauschen. Merke die Sandwich-Form : erst hin zum Ursprung, drehen, wieder zurück.
4. Aufgabe: Beleuchtung nach Phong mit 3D-Vektoren (16 Punkte)
An einem Oberflächenpunkt sind gegeben (alle in einem gemeinsamen Koordinatensystem, Skala bis ):
- Flächennormale ,
- Lichtvektor (von zur Lichtquelle) ,
- Blickvektor (von zur Kamera) .
Alle drei Vektoren sind bereits normiert.
Teil a (4 P): Nennen Sie die vier für Phong nötigen Vektoren. Berechnen Sie und den Reflexionsvektor . Bestätigen Sie .
Teil b (6 P): Berechnen Sie die diffuse Helligkeit und die spekulare Helligkeit (Konstanten ) mit dem Glanzexponenten . Nutzen Sie .
Teil c (6 P): Berechnen Sie die Gesamthelligkeit an mit der vollständigen Phong-Formel (einkanalig) und den Konstanten , , , . Was bewirkt ein grösserer Exponent ?
Lösung anzeigen
Teil a - Vektoren und Reflexion. Die vier normierten Vektoren an sind (Normale), (Lichtvektor zur Quelle), (Reflexionsvektor) und (Blickvektor zur Kamera).
Reflexionsvektor:
Länge: ✓
Teil b - diffuse und spekulare Helligkeit (Konstanten ).
Diffus (Lambert): .
Spekular (Phong): zuerst :
Teil c - vollständige Phong-Formel (einkanalig, eine Lichtquelle):
Einsetzen mit und :
Die Gesamthelligkeit an beträgt rund (ambienter Sockel , diffus , spekular ).
Wirkung von : Ein grösserer Glanzexponent macht das Glanzlicht kleiner und härter (schärferer Glanzpunkt), weil ausserhalb von mit steigendem schneller gegen null fällt. Beispiel hier: , aber - der spekulare Beitrag verschwindet fast überall ausser exakt in Spiegelrichtung.
Kapitelbezug: Kapitel 9: Visualisierungstechniken (Phong-Reflexionsmodell), Kapitel 4: Vektoren (Skalarprodukt, Reflexion).
Typischer Fehler: Beim Reflexionsvektor das Vorzeichen verdrehen (, nicht ) oder vergessen, dass immer gilt. Ausserdem: der ambiente Term steht ausserhalb der Klammer und hat keinen -Faktor.
5. Aufgabe: Farbinterpolation im gedrehten Dreieck (10 Punkte)
Ein Dreieck hat die Vertices mit Farbe Rot , mit Farbe Grün und mit Farbe Blau . Das Dreieck ist im Raster schräg gelegen (kein rechter Winkel an einer Achse). Gesucht ist der interpolierte RGB-Farbwert im Punkt .
Teil 1 (4 P): Beschreiben Sie das Vorgehen (baryzentrische Interpolation) und die verwendete Flächenformel. 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:
Die Fläche eines Dreiecks berechnet man mit
Diese Formel funktioniert für beliebig gedrehte Dreiecke (die Achsenlage spielt keine Rolle).
Teil 2 - Rechnung.
Gesamtfläche mit , , :
- mit :
- :
- :
Probe: ✓
Farbwert:
Der Punkt liegt gleich weit von und und etwas näher an der -Kante als an , daher überwiegen Grün und Blau zu gleichen Teilen, Rot ist am schwächsten.
Kapitelbezug: Kapitel 8: Rendering-Pipeline (lineare Farbinterpolation im Dreieck).
Tipp: Immer die Probe machen. Das Gewicht gehört zur gegenüberliegenden Teilfläche . Die Betragsstriche in der Flächenformel nicht vergessen, sonst können bei gedrehten Dreiecken negative "Flächen" entstehen.
6. Aufgabe: Bildverarbeitung, lokale Operatoren (16 Punkte)
a (3 P): Was bewirkt der folgende Faltungskern? Begründen Sie über die Koeffizientensumme.
b (6 P): Wenden Sie den Laplace-Operator (4er-Nachbarschaft) 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 | 100 | 100 |
|---|---|---|---|
| 20 | 60 | 80 | 100 |
| 20 | 80 | 60 | 100 |
| 20 | 20 | 100 | 100 |
c (4 P): Berechnen Sie den Median für das folgende -Fenster und vergleichen Sie ihn mit dem Mittelwert. Warum ist der Median hier robuster?
| 30 | 200 | 34 |
|---|---|---|
| 32 | 33 | 31 |
| 35 | 30 | 4 |
d (3 P): Bestimmen Sie die Anzahl der Zusammenhangskomponenten (ZHK) der folgenden Binärgrafik (X = Vordergrund) einmal für die N4- und einmal für die N8-Nachbarschaft.
| X | . | . | . | X |
|---|---|---|---|---|
| . | X | . | X | . |
| . | . | X | . | . |
| . | X | . | X | . |
| X | . | . | . | X |
Lösung anzeigen
a) Koeffizientensumme. Die Summe der Koeffizienten ist . Ein Kern mit Summe liefert auf konstanten Flächen den Wert (keine Änderung wird ausgegeben) und schlägt nur an Grauwertsprüngen aus. Es handelt sich um einen Laplace-artigen Kantenoperator (zweite Ableitung) mit 8er-Nachbarschaft: Das Zentrum () wird mit der Summe aller acht Nachbarn ( je Nachbar) verglichen. Er hebt Kanten in allen Richtungen (auch diagonal) hervor.
b) Laplace-Operator (4er-Nachbarschaft).
Bei einem -Kernel auf einem -Bild bleiben die inneren Pixel (Zeilen/Spalten und , -indiziert):
- Pixel : oben , unten , links , rechts :
- Pixel : oben , unten , links , rechts :
- Pixel : oben , unten , links , rechts :
- Pixel : oben , unten , links , rechts :
Deutung: Pixel ergibt , weil es genau zwischen dunklem und hellem Bereich ausgeglichen liegt; die grossen Beträge bei und markieren die stärksten lokalen Grauwertsprünge.
c) Median vs. Mittelwert. Die 9 Werte sortiert: .
Der Median ist der 5. Wert: .
Der Mittelwert ist
Robustheit: Das Fenster enthält zwei Ausreisser, ein Salz-Pixel () und ein Pfeffer-Pixel (). Der Mittelwert wird durch das helle auf hochgezogen, obwohl fast alle Werte um liegen. Der Median ignoriert beide Ausreisser vollständig, weil sie beim Sortieren an die Ränder (, ) wandern und nie die mittlere Position einnehmen. Deshalb ist der Median bei Impulsrauschen klar überlegen.
d) Zusammenhangskomponenten. Es gibt Vordergrundpixel (X), die eine diagonale "X"-Figur bilden:
- N4 (nur oben/unten/links/rechts): Kein X hat einen direkten (nicht-diagonalen) X-Nachbarn, alle Kontakte sind rein diagonal. Also ist jedes X isoliert -> 9 Komponenten.
- N8 (zusätzlich Diagonalnachbarn): Beide Diagonalen sind lückenlose Ketten, die sich im Zentrum treffen: und . Über das gemeinsame Zentrum sind alle Pixel verbunden -> 1 Komponente.
Das zeigt anschaulich: dasselbe Bild hat mit N8 gleich viele oder weniger ZHK als mit N4 (hier extrem: gegenüber ).
Kapitelbezug: Kapitel 12: Bildverarbeitung - Lokale Operatoren (Faltung, Laplace, Median, Segmentierung/ZHK).
Typischer Fehler: Beim Median den Durchschnitt statt des Rangs bilden. Bei der ZHK-Zählung diagonale Kontakte fälschlich schon bei N4 als verbunden werten - diagonale Nachbarn zählen erst bei N8.
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. Prüfen Sie zusätzlich, auf welchen Wert der Eingabewert abgebildet wird. 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). Warum muss der dritte Parameter echt grösser als sein?
Lösung anzeigen
Allgemein: ; so wählen, dass auf fällt (bekannten Punkt einsetzen und auflösen).
a) :
Probe: ✓, ✓.
Zusatzwert: (die Intervallmitte landet erwartungsgemäss in der Mitte von ).
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 (von Breite auf Breite ), das Ergebnis ist kontrastärmer. Alle Grauwerte drängen sich um zusammen, das Bild wirkt flau.
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)
muss echt grösser als sein, weil die perspektivische Projektion durch dividiert (perspektivische Division). Bei käme eine Division durch null vor, ausserdem läge die Projektionsebene in der Kamera selbst. Zu kleine -Werte führen zudem zu ungünstiger Verteilung der Tiefenwerte und damit zu z-Fighting.
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) - unabhängig davon, wo das Zielintervall liegt.
Original-Klausur WS2025 (Lösungen) · Probeklausur 1 · Kapitelübersicht