Answer to Question 1
a) Auf Monitor A'' können die Farben kräftiger wirken, da die Farbfläche A'' größer ist als die Farbfläche A'.

b) Die Chromazitärswerte, die mit Hilfe des zu A' gehörigen Monitors korrekt gedruckt werden können, sind alle Punkte innerhalb der Fläche A'.

c) Die Berechnung der Chromazitärswerte für den gegebenen Tristimuluswert (X, Y, Z) = (0.5, 0.3, 0.2) erfolgt durch die Formeln:
\[ x = \frac{X}{X+Y+Z} = \frac{0.5}{0.5+0.3+0.2} \]
\[ y = \frac{Y}{X+Y+Z} = \frac{0.3}{0.5+0.3+0.2} \]

Die berechneten Werte für x und y müssen in das Chromatizitätsdiagramm eingetragen werden.

d) Der gekrümmte Rand des Chromatizitätsdiagramms repräsentiert alle Farben, die durch eine Mischung der Grundfarben erzeugt werden können.

e) Um die vollgesättigte Farbvalenz zur Farbe c mit Hilfe des Weißpunkts w zu bestimmen, würde ich von der Farbe c eine Linie durch den Weißpunkt w ziehen, die die Farbe c mit dem Rand des Diagramms verbindet. Der Punkt, an dem diese Linie den Rand schneidet, gibt die vollgesättigte Farbvalenz für die Farbe c an.





****************************************************************************************
****************************************************************************************




Answer to Question 2
a) 
- Pfad (1): Kann durch Whitted-Style Raytracing erzeugt werden. Bei diesem Pfad findet eine Reflexion an der roten Wand und eine Transmission durch den Glasblock statt, was durch Whitted-Style Raytracing modelliert werden kann.
- Pfad (2): Kann durch Whitted-Style Raytracing erzeugt werden. Es findet eine Reflexion an der roten Wand und eine Transmission durch den Glasblock statt, was beide Phänomene von Whitted-Style Raytracing berücksichtigt.
- Pfad (3): Kann nicht durch Whitted-Style Raytracing erzeugt werden. Dieser Pfad beinhaltet eine Refraktion im Glasblock, die von Whitted-Style Raytracing nicht direkt modelliert wird.
- Pfad (4): Kann durch Whitted-Style Raytracing erzeugt werden. Es findet eine Reflexion an der roten Wand und eine Transmission durch den Glasblock statt, welche beide von Whitted-Style Raytracing abgedeckt werden.

b) 
Um das Bild der Kamera zu skizzieren, würde ich die Bildebene in Bereiche gleicher Farbe unterteilen, wobei jeder Bereich die Farbe des reflektierten oder transmittierten Lichts entsprechend des Pfads in Teilaufgabe a) darstellt. Danach würde ich die Bereiche mit ihrer jeweiligen Farbe beschriften.





****************************************************************************************
****************************************************************************************




Answer to Question 3
(a) 
- Abbildung (a): Ambiente Reflektion
- Abbildung (b): Diffuse Reflektion
- Abbildung (c): Spiegelnde Reflektion
- Abbildung (d): Gemischte Reflektion

(b) 
Die Variation in Abbildung (c) und (d) wird durch den Glanzgrad (Exponent) des Phong-Beleuchtungsmodells verursacht. In Abbildung (c) mit einem niedrigeren Glanzgrad ist die reflektierte Intensität breiter verteilt, während in Abbildung (d) mit einem höheren Glanzgrad die reflektierte Intensität stärker gebündelt ist.

(c) 
Bei Gouraud Shading wird das Beleuchtungsmodell pro Eckpunkt des Dreiecks ausgewertet, also insgesamt 3 Mal. Bei Phong Shading wird das Beleuchtungsmodell pro Pixel ausgewertet, also insgesamt 5 Mal. Dies liegt daran, dass bei Gouraud Shading die Beleuchtungsinformationen an den Ecken interpoliert werden, während bei Phong Shading die Beleuchtungsinformationen für jeden Pixel individuell berechnet werden müssen.





****************************************************************************************
****************************************************************************************




Answer to Question 4
(a) Um die Reihenfolge der traversierten Hüllkörper für die eingezeichneten Strahlen zu bestimmen, betrachten wir Abbildung 2. Die Hüllkörper werden in der Reihenfolge A - E - B - C - D traversiert.

(b) Um die Hüllkörper der neuen Hüllkörper-Hierarchie zu skizzieren, die bei Wiederverwendung der Hierarchie aus Abbildung 2 entstehen würden, würde ich auf der unteren Abbildung nachverfolgen, wie sich die Hüllkörper entsprechend der Animation verändern und diese aufzeichnen.

(c) Ein Vorteil des Vorgehens aus Teilaufgabe b) gegenüber der vollständig neuen Erzeugung einer Hüllkörper-Hierarchie ist die Zeitersparnis bei der Berechnung der Hierarchie. Ein Nachteil könnte jedoch sein, dass die Repräsentation der sich verändernden Geometrie möglicherweise ungenau wird.

(d) Zwei Beispiele für Alternativen zu achsenparallelen Boxen als Hüllkörper für Hierarchien sind Kugeln und konvexe Polytope. Ein Vorteil von Kugeln ist, dass sie weniger Luft (leeren Raum) um die Geometrie haben und somit effizientere Hierarchien erzeugen können. Ein Nachteil könnte sein, dass Kugeln komplexer in der Berechnung sind. Ein Vorteil von konvexen Polytopen ist, dass sie die Geometrie genauer umschließen können und somit präzisere Kollisionserkennung ermöglichen. Ein Nachteil ist jedoch, dass die Berechnung der Hierarchie komplexer sein kann als bei achsenparallelen Boxen.





****************************************************************************************
****************************************************************************************




Answer to Question 5
a) Um eine affine Transformation M zu erstellen, die das Objekt wie in der Abbildung "transformation_first.png" transformiert, müssen die Matrizen A bis F in der richtigen Reihenfolge multipliziert werden. Also: M = F * E * C.

b) Um die schrittweise Transformation des Objekts durch die Matrizen F, C und B zu skizzieren, betrachten Sie die Abbildung "transformation_second.png" und gehen Sie folgendermaßen vor: Zuerst wird das Objekt durch die Matrix F transformiert, dann durch die Matrix C und schließlich durch die Matrix B.

c) Die Normalen von o werden bei der Transformation mit der Matrix T = E * C * F richtig transformiert, da die Normalen als Zeilenvektoren der inversen transponierten Matrix transformiert werden müssen. Um Normalen korrekt zu transformieren, gegeben eine affine Transformation T', müssen die Normalen als Zeilenvektoren behandelt und mit der inversen transponierten Matrix von T' multipliziert werden.





****************************************************************************************
****************************************************************************************




Answer to Question 6
a) Zwei Alternativen zu bilinearer Interpolation bei Texturen sind:
1. Baryzentrische Interpolation
2. Nearest-Neighbor Interpolation

b) Um die Interpolationsgewichte für die Stellen (x, y) bei bilinearer Interpolation zu berechnen, müsste die Abbildung "interpolation.png" betrachtet werden. Da diese jedoch nicht vorliegt, kann die genaue Berechnung hier nicht durchgeführt werden.

c) Die Auflösungsstufe bei Mip-Mapping einer Textur sollte idealerweise so gewählt werden, dass sie der Entfernung des Texturfragments zur Kamera entspricht. Das ermöglicht eine effiziente Darstellung und Nutzung des Speichers. Probleme, die auftreten können, wenn die Auflösungsstufe nicht ideal gewählt wird, sind:
1. Aliasing-Effekte
2. Texturschwimmen

d) Es ist akzeptabel, die Stufen in einer Mip-Map jeweils in halbierter Auflösung zu speichern, da dies eine effiziente Speichernutzung darstellt. Bei der Texturdarstellung wird ohnehin die passende Mip-Map-Stufe entsprechend der Entfernung zur Kamera ausgewählt und interpoliert.

e) Um zu begründen, dass ein Schnittpunkt des Strahls mit dem Dreieck vorliegt, wenn die baryzentrischen Koordinaten \(\lambda_1 = 0.5\) und \(\lambda_2 = 0.4\) für den Punkt \(x\) bezüglich der Eckpunkte des Dreiecks \(v_1, v_2, v_3\) berechnet wurden, kann man feststellen, dass \(\lambda_1 + \lambda_2 < 1\) ist. Dies zeigt, dass der Punkt \(x\) innerhalb des Dreiecks liegt.

f) Um die baryzentrischen Koordinaten \(\lambda'_1, \lambda'_2, \lambda'_3\) von \(x' = x + \frac{1}{2}(v_2 - v_1)\) zu berechnen, müsste die Abbildung "barycentric.png" betrachtet werden. Da die Abbildung jedoch nicht vorliegt, kann die genaue Berechnung hier nicht durchgeführt werden.





****************************************************************************************
****************************************************************************************




Answer to Question 7
### Frage a:
#### Pipeline-Stufen:
1. Vertex-Shader:
   - Eingabedaten: Vertex-Koordinaten
   - Ausgabedaten: Transformierte Vertex-Koordinaten
   - Anzahl der Eingabeelemente: 1
   - Anzahl der Ausgabeelemente: 1

2. Primitive Assembly:
   - Eingabedaten: Vertex-Koordinaten
   - Ausgabedaten: Geometrie-Primitive
   - Anzahl der Eingabeelemente: N
   - Anzahl der Ausgabeelemente in Bezug auf die Eingabeelemente: M

#### Antwort b:
Die Pipeline muss bis einschließlich zur Primitive Assembly-Stufe durchlaufen werden, bevor entschieden werden kann, ob ein Teil der Eingabevertices durch OpenGL Backface-Culling verworfen werden kann, da die Information über die Ausrichtung der Primitive (z.B. welche Seite nach außen zeigt) erst nach der Primitive Assembly-Stufe verfügbar ist.

#### Antwort c:
Um jeweils zwei Dreiecke im Geometry Shader zu erzeugen, können die Rauchpartikel als Punkte (z.B. in einem Triangle Strip) dargestellt werden, wobei im Geometry Shader für jedes Eingabepartikel zwei zusätzliche Vertices erzeugt werden, um die Dreiecke zu formen.

#### Antwort d:
Eine alternative Möglichkeit, ohne den Geometry Shader zwei Dreiecke pro Partikel zu erzeugen, besteht darin, die Dreiecke bereits im Vertex Shader zu generieren, indem jeder Rauchpartikel als Dreieck mit den entsprechenden Eckpunkten gezeichnet wird.

#### Antwort e:
Um Bereiche in der Textur, die nicht gezeichnet werden sollen, abzudecken, ohne Blending zu verwenden, kann ein Discard-Befehl im Fragment-Shader genutzt werden. Dies ermöglicht es, Fragmente basierend auf einer Bedingung (z.B. Farbwert in der Textur) zu verwerfen.

### Hinweis zur Zeichnung:
Bitte überprüfen Sie die angegebenen Pfade für die Abbildungen und beziehen Sie sich auf diese, um ggf. notwendige Informationen zu visualisieren.





****************************************************************************************
****************************************************************************************




Answer to Question 8
a) In der OpenGL-Pipeline findet das Blending nach dem Rasterisieren und dem Tiefentest statt.

b) 
- Die OpenGL-Konfiguration, um die lineare Interpolation F_s * A_s + F_d * (1 - A_s) zu erzeugen, ist Konstante GL_FUNC_ADD mit GL_SRC_ALPHA und GL_ONE_MINUS_SRC_ALPHA.
- Die OpenGL-Konfiguration, um die Multiplikation F_s * F_s + F_d * (1 - F_s) zu erzeugen, ist Konstante GL_FUNC_ADD mit GL_SRC_COLOR und GL_ONE_MINUS_SRC_COLOR.

c) Beim Alpha-Blending von semitransparenten Objekten ist eine Sortierung notwendig, da die Reihenfolge, in der die Objekte gezeichnet werden, das endgültige gemischte Ergebnis beeinflusst. Auch wenn der Tiefentest eingeschaltet ist, kann die Reihenfolge der Zeichnung die Durchlässigkeit und damit die korrekte Darstellung beeinträchtigen. Die Objekte werden nach ihrem Tiefenwert von der Kamera sortiert, wobei Objekte weiter hinten zuerst gezeichnet werden.





****************************************************************************************
****************************************************************************************




Answer to Question 9
a) Diese Einschränkung bei der Rasterisierung ist notwendig, da Lichtbrechung an jedem Punkt des Glasobjekts normalerweise zu Verzerrungen im Bild führen würde. Durch die Annahme, dass die Lichtbrechung nur am ersten Schnittpunkt eines Kamerastrahls mit dem Objekt stattfindet, wird die Berechnung vereinfacht und das Rendering effizienter.

b) Für das Rendering mit möglichst wenigen Shadern benötigen Sie mindestens zwei Shader: einen Vertex-Shader und einen Fragment-Shader. Der Vertex-Shader wird verwendet, um die 3D-Geometrie des Glasobjekts zu transformieren, während der Fragment-Shader für die Berechnung der Farben und Effekte zuständig ist.

c) 
- Vertex-Shader: Hier können Sie die Transformation der 3D-Geometrie vornehmen, da dies für jeden Vertex des Glasobjekts separat erfolgen muss.
- Fragment-Shader: In diesem Shader können Sie die Berechnungen für die Reflexion, Transmission, Normal Mapping und Environment Mapping durchführen, da dies für jeden Fragment (Pixel) des gerenderten Bildes separat erfolgt.





****************************************************************************************
****************************************************************************************




Answer to Question 10
a) Um die Funktion intersectDF zu vervollständigen, müsste man den Strahlenschritt für das Sphere-Tracing implementieren. Dabei wird in jedem Schritt überprüft, ob der Strahl das reflektierende und transparente Glasobjekt schneidet. Falls ein Schnittpunkt gefunden wird, muss die Funktion true zurückgeben und die Koordinate s sowie die Distanz entlang des Strahls t zurückgeben. Wenn nach einer bestimmten Anzahl von Schritten (maxSteps) kein Schnittpunkt gefunden wird, sollte die Funktion false zurückgeben.

b) In der Behandlung einer Refraktion ist es notwendig, den Schnittpunkt korrekt zu berechnen, da die Brechung des Lichts an Grenzflächen von Medien mit unterschiedlichen Brechungsindizes stattfindet. Die Berechnung der relativen Brechzahl ist wichtig, um den gebrochenen Strahl korrekt zu berechnen. Die if(DF(o))-Bedingung überprüft, ob der Ursprung des Strahls innerhalb des Objekts liegt, was entscheidend ist für die Berechnung der reflektierten und gebrochenen Strahlen.

c) Gloss-Mapping ist eine Technik, bei der die Glätte eines Materials auf der Oberfläche texturiert wird, um den Glanzgrad zu steuern. Bei der gewählten Schattierungstechnik ist es einfach und mit geringem Aufwand möglich, da das Normal Mapping und die Environment Map bereits genutzt werden, um Reflexionen und Brechungen zu simulieren. Durch Hinzufügen von Gloss-Mapping kann zusätzlich die Glätte des Materials beeinflusst werden.

d) Dispersionseffekte bei der Refraktion könnten einfach hinzugefügt werden, indem man die Wellenlängenabhängigkeit des Brechungsindex berücksichtigt. Man könnte dies beispielsweise durch die Verwendung von spektralen Texturen oder durch die Implementierung einer Dispersionseffekt-Funktion im Shader erreichen. Der Berechnungsaufwand im Shader würde sich dabei erhöhen, da zusätzliche Berechnungen für die Wellenlängenabhängigkeit des Brechungsindex erforderlich wären.





****************************************************************************************
****************************************************************************************




Answer to Question 11
### Antwort:

#### Teilaufgabe a)
Eine BVH B' , die mit $T_{K'}(x)$ mit $K' \leq K$ konstruiert wird, ist eine korrekt-funktionierende BVH für die Szene, da sie die Struktur und die Hierarchie der Objekte korrekt beibehält, während sie die Anzahl der Primitiven reduziert. Der Nachteil gegenüber einer BVH B, die mit $T_K(x)$ mit $K' < K$ generiert wurde, besteht darin, dass bei der Verwendung von $T_{K'}(x)$ möglicherweise mehr Schnitttests mit den AABBs durchgeführt werden müssen, da die Hierarchie weniger dicht ist und somit mehr Objekte in den Blättern enthalten sein können.

#### Teilaufgabe b)
Um den Schnittpunkt eines Strahls $r(i) = o + id$ mit $dz < 0$ durch Raymarching zu bestimmen, muss die Rauschfunktion $n(x)$ nur minimal oft ausgewertet werden, indem in jedem Schritt der Länge des Strahls entsprechend kleine Inkremente auf der Linie genommen werden und die Rauschfunktion nur an den neu berechneten Punkten ausgewertet wird, bis der Schnittpunkt gefunden ist.

#### Teilaufgabe c)
Eine Eigenschaft von Rauschfunktionen, die erfüllt sein sollte, ist die lokale Variation, d.h. eine kleine Änderung im Eingabewert sollte zu einer kleinen Änderung im Ausgabewert führen. Dennoch rate ich davon ab, die Funktion $n(x) = \sin(x), x \in \mathbb{R}$ als eindimensionale Rauschfunktion zu verwenden, da sie eine periodische Funktion ist und nicht die notwendige lokale Variabilität aufweist, um realistische Oberflächen zu generieren.

#### Teilaufgabe d)
Die Ableitungsregeln für ein L-System mit $V = \{F, +, -\}$, $\alpha = 60°$ und Startwort $F--F--F$ für die Erzeugung der Schneeflocke sind:
- $F \to F+F--F+F$

Die Schneeflocke wird interpretiert als Turtle-Grafik, in der die Ableitungen die Bewegungen der Turtle steuern.

### Hinweis zur Abbildung:
Um die Kochsche Schneeflocke mit L-Systemen zu generieren, würde ich eine gleichseitige Dreiecksfigur zeichnen und für jede Seite ein Drittel der Strecke durch ein gleichseitiges Dreieck mit 60° ersetzen. Das würde ich jeweils für alle Seiten der Figur wiederholen.





****************************************************************************************
****************************************************************************************




Answer to Question 12
a) 
Um den Punkt F(0.5) zu bestimmen, unterteile ich die Bézier-Kurve für u = 0.5. Dabei zeichne ich die Kanten und Punkte der Kontrollpolygone der Teilkurven ein. Anschließend nutze ich die Kontrollpolygone der entstehenden Teilkurven, um F(u) skizzieren.

b) 
Laut affiner Invarianz kann die Bézier-Kurve F durch eine affine Abbildung Φ rotiert, skaliert und verschoben werden. Dabei bleibt die Form der Kurve erhalten, lediglich ihre Lage im Raum ändert sich.

c) 
Unter Verwendung der Variationsreduzierung zeige ich zeichnerisch, dass die abgebildete Kurve nicht der kubischen Bézier-Kurve G(u) entspricht.





****************************************************************************************
****************************************************************************************




