Um die Ferien über nicht nur unnütz rumzuhocken und um mich etwas auf das nächste Semester vorzubereiten, habe ich in den letzten Monate viele Verbesserungen an meiner Rendering-Software vorgenommen. Das ist ein wahrhaft endloses Vorhaben, denn für jede neu eingebaute Funktion fallen mir noch zwei andere wichtige Dinge ein, die eigentlich auch noch drin sein sollten… Um das Programm einigermaßen auf den aktuellen Stand der Technik zu bekommen, mussten mehrere Teile nochmal ganz neu geschrieben werden.
Die meiste Zeit habe ich damit verbracht, die sogenannten kd-Bäume noch effizienter zu bauen und zu durchlaufen. Die benötigt man z.B., um Kollisionen zwischen Lichtstrahlen und dreidimensionalen Objekten in möglichst kurzer Zeit zu berechnen. Dabei gibt es alle möglichen Tricks, mit denen man das Programm noch weiter beschleunigen kann (Wenn zum Beispiel mehrere Lichtstrahlen sehr nahe beieinander liegen, treffen sie höchstwahrscheinlich auch auf dasselbe Objekt. Man kann viele Berechnungen einsparen, indem man diese sogenannte “Kohärenz” vorteilhaft ausnutzt). Nach allen Optimierungen können komplexe Szenen mit mehr als 400.000 Dreiecken in Echtzeit (ca. 8 Bilder pro Sekunde) komplett auf der CPU berechnet und dargestellt werden.
Anschließend habe ich noch “Environment map lighting” eingebaut. Hier wird ein dreidimensionales Panorama verwendet, um ein Objekt zu beleuchten – d.h. jemand macht ein Foto von einer realen Umgebung, die anschließend in eine virtuelle Lichtquelle umgewandelt und um das (ebenfalls virtuelle) Objekt platziert wird. Hier sind ein paar Bilder vom letzten Material-Test, der unter anderem auch “environment map lighting” verwendet:
Lambert-Material
Von mir kommt hier nur das Programm – der Drache ist ein
3D-Scan der UTIA und TU Prag und das Hintergrund-Panorama stammt von
Paul Debevec. Das “Lambert”-Material ist eine Art idealisierter diffuser Stoff. So etwas perfektes existiert in der realen Welt zwar nicht, wird in der Computergrafik aber gerne eingesetzt, um matt polierten Kunststoff zu imitieren.
Perfektes dielektrisches und reflektierendes Material
Das dielektrische Material hat einen einstellbaren Brechungsindex, mit den man Stoffe wie z.B. Glas, Wasser oder Diamant simulieren kann. Einen perfekten Spiegel gibt es ebenfalls nicht, weshalb man hier meist auf ein physikalisch etwas plausibleres Modell wechselt:
Mikrofacetten und Ward-Material
Das Mikrofacetten-Modell ist mein Favorit – es simuliert ein raues Object, dessen Oberfläche aus winzigen Facetten besteht. Die Häufigkeit der Facetten folgt außerdem noch einer gegebenen statistischen Verteilung, wodurch sich eine Vielzahl von verschiedenen Stoffen approximieren lässt. Das führt zu komplizierten Berechnungen, lohnt sich aber wegen der realistischen Ergebnisse.
Falls mir genug Zeit bleibt, will ich das Microfacetten-Modell noch erweitern, damit es auch durchsichtige Stoffe (z.B. Glas) darstellen kann, die eine raue Oberfläche besitzen. Und dann bräuchte es noch ein realistischeres Modell für Metalle… und, und, und….. man könnte ewig weitermachen!