Aufgabenstellung

Modifizieren sie Ihren Toon-Shader so, dass die Oberfläche nicht einfarbig erscheint, sondern mit gleichmäßig verteilten andersfarbigen Punkten übersät ist. Farbe, Dichte und Radius der Punkte sollen über drei Uniform-Variablen von geeignetem Typ aus der Anwendung heraus über die Tastatur steuerbar sein.

Phong- und Toon-Shading

Zur Implementierung benötigen sie Zugriff auf die Texturkoordinaten für jedes Fragment. Dazu müssen diese im Vertex-Programm per attribute Variable von der Anwendung entgegen genommen und mit einer varying Variable an das Fragment-Programm übergeben werden.

Einstellungen
Controls

Erläuterungen zur Übung

Neben den Änderungen am Vertex-Shader, welche schon in der Aufgabenstellung beschrieben wurden, wurde der Fragment-Shader dahingehend verändert, das die bis dahin konstante Farbe durch eine Funktion ausgetauscht wurde. Die Fragmentfarbe wird also im Shader selbst bestimmt und nicht mehr von der Anwendung. Die Funktion bestimmt anhand der Texturkoordinate, welche Farbe für das aktuelle Fragment verwendet werden soll.

Um das zu bestimmen wird zunächst ermittelt, ob ein Fragment innerhalb oder außerhalb eines zu zeichnenden Punktes (eines Kreises) liegt. Dies geschieht über die Abstandberechnung Punkt-Kugel (Abstand zum Mittelpunkt). Wenn also ein Punkt p und ein Kreismittelpunkt m gegeben sind, gilt für die Distanz d=|m-p|. Ist d > r, wobei r als Kreisradius definiert ist, befindet sich der Punkt respektive das Fragment außerhalb des Kreises und es wird auf die definierte Hintergrundfarbe gesetzt. Andernfalls befindet sich das Fragment innerhalb des Kreises und wird auf die definierte Kreisfarbe gesetzt (Zeile 273-277).

GLSL bietet für Distanz-Berechnungen die distance()-Funktion an.

Weiterhin bestimmt die von Aussen definierte Dichte D die Anzahl der zu zeichnenden Kreise auf der Oberfläche, wobei das Texturkoordinatensystem abhängig von D unterteilt wird. Dabei ist das Koordinatensystem definiert mit Höhe und Breite von x=y=1. Dieses wird nun in kleinere Quadrate mit der Breite x1=x/D und der Höhe y1=y/D zerlegt (Zeile 266). Nun wird der lokale Radius eines Kreises in einem Quadranten mit lr = r/D berechnet, wobei r von Aussen definiert wurde (Zeile 265). Um den lokalen Kreismittelpunkt lm zu bestimmen, welcher mit p in einem Quadranten liegt, wird folgende Rechenvorschrift angewandt: lm=int(p/x1_y1) * x1_y1 + m/D (Zeile 268-271). Nun kann anhand der Distanz d=|lm-p| und dem berechneten, lokalen Radius lr, wie zuvor erwähnt, geprüft werden, ob ein Punkt sich im oder außerhalb des Kreises befindet und das Fragment entsprechend eingefärbt werden.

Für ein besseres, optisches Ergebnis wurde weiterhin die Berechnung der Outline/Silhouette entfernt.

Sourcecode Toon-Shader

Verwendete Ressourcen und Quellcode