Aufgabenstellung

Recherchieren sie die Technik des Toon-Shading (auch bekannt als Cell-Shading).

Phong- und Toon-Shading

Modifizieren sie den Phong-Shader aus Beispiel 2 so, dass die berechnete Oberflächenintensität, wie im Bild zu sehen, in vier Abstufungen diskretisiert wird. Achten sie dabei besonders auf die korrekte Wiedergabe des Glanzlichts.

Wählen sie zur Demonstration Ihrer Implementierung eine andere Geometrie aus dem TDL-Angebot als die im Beispiel verwendeten Kugeln. Toon-Shading auf Kugeln sieht nicht so toll aus.

Controls

Erläuterungen zur Übung

Der wesentliche Unterschied im Toon Shading gegenüber dem normalen Phong Shader (Phong Beleuchtungsmodell) ist, dass die berechnete Lichtintensität für ein Fragment diskretisiert wird, d.h. anstelle eines glatten Farbverlaufes gibt es eine bestimmte Anzahl an farblichen Abstufungen. Konkret habe ich fünf Abstufungen und eine Outline in Form einer einfachen, schwarzen Silhouette implementiert.

Ein Fragment wird Teil der Silhouette/Outline und somit auf die Farbe Schwarz gesetzt, wenn des Ergebnis des Skalarprodukts aus dem Normalenvektor und dem Richtungsvektor in Blickrichtung des Betrachters (der Kamera) einen definierten Wert unterschreitet (Zeile 216-219). Je kleiner dieser Wert gesetzt wird, desto weniger Fragmente werden Teil der Outline. Dieser Berechnungsvorschrift liegt zu Grunde, das bei glatten Oberflächen Punkte bzw. Fragmente Teil der Silhouette sind, wenn der Normalenvektor orthogonal zum Richtungsvektor der Kamera steht (N·V=0). Da dies in der Praxis nur selten der Fall ist und die Outline auch für ein schönes Ergebnis deutlich sichtbar ausfallen sollte, näher ich den Wert lediglich an 0 an (konkret 0.3), da diese Fragmente natürlich trotzdem sehr nahe an der Silhouette liegen. Mehr dazu unter Silhoutte Enhancement. Abschließend sollte man erwähnen, das überlicherweise die Outline über ein Edge-Detection-Algorithmus in einem Post-Processing-Schritt abgehandelt wird.

Wie beim Phong Shader wird auch der diffuse Farb-Anteil eines Fragments beim Toon Shading über die diffuse Beleuchtungskomponente nach dem Phong Beleuchtungsmodell (N·L) berechnet. Danach wird dieser Wert, wie Eingangs schon erwähnt, so diskretisiert, dass das Fragment nur eine von fünf Helligkeitsstufen annehmen kann (Zeile 223-233).

Im letzten Schritt wird das Glanzlicht berechnet (Zeile 235-240). Da dieses auch diskret sein soll, existieren nur zwei Fälle: ein Fragment reflektiert Glanzlicht oder nicht. Um das zu berechnen, wird das Ergebnis der spiegelnden Beleuchtungskomponente nach dem Phong Beleuchtungsmodell, sprich das Skalarprodukt zwischen dem an der Oberflächennormalen reflektierten Lichtstrahl und dem Richtungsvektor in Blickrichtung des Betrachters (R·V), ausgewertet. Im Gegensatz zum klassischem Phong-Shader wird nun aber das Glanzlicht ab einen gewissen Schwellwert direkt auf Weiß gesetzt, ohne das zusätzliche Helligkeitsstufen auf den diffusen Term hinzuzuaddiert werden, was zur Folge hat, das es keinen glatten Verlauf mehr gibt, sondern das Glanzlicht eine harte Kontur besitzt.

Sourcecode Toon-Shader

Verwendete Ressourcen und Quellcode