VG Raytracer
Version 0.4.2: Spekulare Lichter
Freitag, 3. Juli 2009 von Casiopaya
Überblick :
Und wieder hatte ich einige Stunden Zeit um mich meinem Raytracer bzw. dessen Verbesserung zu widmen. Manchmal überkommt es mich und ich MUSS einfach eine weitere Sache in das Rendering einbauen, davor bekomm ich keine Ruhe. Diesmal habe ich meinem Raytracer Spekulare Lichter verpasst. Anfangs hatte ich diese ignoriert, da sie mir unwichtig schienen, wenn ich mir das Ergebnis aber so anschaue hat sich der Einbau gelohnt. Ganz davon abgesehen, dass es wirklich keine große Sache war.
Die so genannten "Specular Lights" werden im Deutschen oft mit "Glanzlichtern" übersetzt. Diese Übersetzung ist an sich passend, denn was versucht wird mit dieser Render-Komponente zu simulieren sind Glanzeffekte auf Oberflächen. Je rauer eine Oberfläche, desto stärker wird das einfallende Licht diffus in alle Richtungen zerstreut und desto matter erscheint er uns. Nun kann man mit Raytracing zwar sehr einfach perfekt diffuse, als auch perfekt spiegelnde Oberflächen simulieren (denn beide Typen stellen einen physikalischen "Grenzwert" dar), jedoch muss man sich bei nicht perfekten Flächen etwas einfallen lassen um das Lichtverhalten möglichst gut anzunähern. Fast alle in der Natur vorkommenden Flächen hätten in ihrer Raytracing-Entsprechung eine spekulare Komponente. Als Anschauunsbeispiel kann man sich einen mit Sandpapier aufgerauten Kupferkessel vorstellen. Der Kessel ist zwar kein Spiegel (denn seine Oberfläche ist aufgeraut) wenn man jedoch auf ihn schaut und ein Licht in der Nähe ist, dann glänzt stets ein ganzer Bereich des Kessels. Bei diesem Glanz handelt es sich nicht um das perfekte Spiegelbild der Lichtquelle, sondern um die Addition vieler Lichtstrahlen, die von einem ganzen Bereich des Kessels diffus "etwa" in Richtung des Betrachters reflektiert werden.
Und da haben wir auch schon den größten Unterschied zu direkten Spiegelungen. Die Glanzlichter wandern -im Gegensatz zu direkten Spiegelungen- "mit dem Betrachter mit". Sind also abhängig vom Betrachtungswinkel. Man stelle sich nur vor man läuft um den glänzenden Kupferkessel...
Nun aber genug des Ausflugs in die Theorie, hier das Ergebnis. Auf dem Bild hab ich drei Stellen markiert, an denen die Glanzlichter besonders auffällig sind. Insgesamt treten diese Lichter (in sehr schwacher Form) aber an vielen Stellen auf. Das gerenderte Bild wird einfach allgemein realistischer. Für Interessierte: Ich verwende die Spekularen Lichter aus dem Blinn-Beleuchtungsmodell.
Was ebenfalls in Version 0.4.2 hinzugekommen ist, ist die Ambiente Beleuchtung. Diese ist aber wohl so langweilig, dass ich sie hier nicht näher erkläre. Letztlich wird der Helligkeitswert eines Objekts nur um einen konstanten Anteil verschoben.
Änderungen:
- Spekulare Lichter wurden eingebaut. Jedes Objekt kann stufenlos von "sehr rau" bis "sehr glatt" eingestellt werden
- Jedes Objekt hat nun eine Ambiente Beleuchtungskomponente, in der Umwelt gibt es nun ein Ambientes Licht (siehe http://de.wikipedia.org/wiki/P...ungsmodell)
- Ein Bug wurde entfernt, der die Helligkeitsabhängigkeit von der Licht-Entfernung betraf. Die bisher gerenderten Bilder waren zwar korrekt, aber nur wenn man die Körper als "sehr klein" ansah.
Links
Bild:
Und das mittlerweile schon obligatorische Video :
http://www.youtube.com/watch?v=KRpRlkgFl1Q
Eine Exe hab ich diesmal nicht dazugepackt, die gibts bei der nächsten großen Änderung.
Und wieder hatte ich einige Stunden Zeit um mich meinem Raytracer bzw. dessen Verbesserung zu widmen. Manchmal überkommt es mich und ich MUSS einfach eine weitere Sache in das Rendering einbauen, davor bekomm ich keine Ruhe. Diesmal habe ich meinem Raytracer Spekulare Lichter verpasst. Anfangs hatte ich diese ignoriert, da sie mir unwichtig schienen, wenn ich mir das Ergebnis aber so anschaue hat sich der Einbau gelohnt. Ganz davon abgesehen, dass es wirklich keine große Sache war.
Die so genannten "Specular Lights" werden im Deutschen oft mit "Glanzlichtern" übersetzt. Diese Übersetzung ist an sich passend, denn was versucht wird mit dieser Render-Komponente zu simulieren sind Glanzeffekte auf Oberflächen. Je rauer eine Oberfläche, desto stärker wird das einfallende Licht diffus in alle Richtungen zerstreut und desto matter erscheint er uns. Nun kann man mit Raytracing zwar sehr einfach perfekt diffuse, als auch perfekt spiegelnde Oberflächen simulieren (denn beide Typen stellen einen physikalischen "Grenzwert" dar), jedoch muss man sich bei nicht perfekten Flächen etwas einfallen lassen um das Lichtverhalten möglichst gut anzunähern. Fast alle in der Natur vorkommenden Flächen hätten in ihrer Raytracing-Entsprechung eine spekulare Komponente. Als Anschauunsbeispiel kann man sich einen mit Sandpapier aufgerauten Kupferkessel vorstellen. Der Kessel ist zwar kein Spiegel (denn seine Oberfläche ist aufgeraut) wenn man jedoch auf ihn schaut und ein Licht in der Nähe ist, dann glänzt stets ein ganzer Bereich des Kessels. Bei diesem Glanz handelt es sich nicht um das perfekte Spiegelbild der Lichtquelle, sondern um die Addition vieler Lichtstrahlen, die von einem ganzen Bereich des Kessels diffus "etwa" in Richtung des Betrachters reflektiert werden.
Und da haben wir auch schon den größten Unterschied zu direkten Spiegelungen. Die Glanzlichter wandern -im Gegensatz zu direkten Spiegelungen- "mit dem Betrachter mit". Sind also abhängig vom Betrachtungswinkel. Man stelle sich nur vor man läuft um den glänzenden Kupferkessel...
Nun aber genug des Ausflugs in die Theorie, hier das Ergebnis. Auf dem Bild hab ich drei Stellen markiert, an denen die Glanzlichter besonders auffällig sind. Insgesamt treten diese Lichter (in sehr schwacher Form) aber an vielen Stellen auf. Das gerenderte Bild wird einfach allgemein realistischer. Für Interessierte: Ich verwende die Spekularen Lichter aus dem Blinn-Beleuchtungsmodell.
Was ebenfalls in Version 0.4.2 hinzugekommen ist, ist die Ambiente Beleuchtung. Diese ist aber wohl so langweilig, dass ich sie hier nicht näher erkläre. Letztlich wird der Helligkeitswert eines Objekts nur um einen konstanten Anteil verschoben.
Änderungen:
- Spekulare Lichter wurden eingebaut. Jedes Objekt kann stufenlos von "sehr rau" bis "sehr glatt" eingestellt werden
- Jedes Objekt hat nun eine Ambiente Beleuchtungskomponente, in der Umwelt gibt es nun ein Ambientes Licht (siehe http://de.wikipedia.org/wiki/P...ungsmodell)
- Ein Bug wurde entfernt, der die Helligkeitsabhängigkeit von der Licht-Entfernung betraf. Die bisher gerenderten Bilder waren zwar korrekt, aber nur wenn man die Körper als "sehr klein" ansah.
Links
Bild:
Und das mittlerweile schon obligatorische Video :
http://www.youtube.com/watch?v=KRpRlkgFl1Q
Eine Exe hab ich diesmal nicht dazugepackt, die gibts bei der nächsten großen Änderung.
Version 0.4.1
Montag, 2. März 2009 von Casiopaya
Überblick :
Tcha, was soll man sagen: Auch wenn man es sich ganz fest vornimmt kommt es doch meistens anders als man denkt. Ich z.B. habe mir vor über einem halben Jahr ganz fest vorgenommen, den nächsten Worklog-Eintrag zu meinem Raytracer NICHT erst in einem halben Jahr zu machen. Hat leider nicht funktioniert... Aber immerhin habe ich zwischen Uni und Praktikum wenigstens ein wenig Zeit gefunden.
Falls es vielleicht jemanden gibt, der die Fortsetzung dieses Worklogs tatsächlich erwartet hat: Da der letzte Eintrag schon so lange zurück liegt wird dieser hier etwas ausführlicher .
Was ich als nächstes realisieren wollte war die TRANSPARENZ. Nun hab ich mir diese anfangs ziemlich einfach vorgestellt. Mein Sichtstrahl trifft auf einen (teilweise) transparenten Körper. Ein Anteil wird diffus zurückgeworfen, einer rekursiv als Reflexion (also die beiden Komponenten die mein Raytrayer schon beherrscht) und ein Teil wird eben "durch" die getroffene Fläche weitergesendet. Aus diesen 3 Komponenten bastle ich mir dann den resultierenden Strahl. Soweit also an sich nicht kompliziert, oder?
Stimmt genau, allerdings trifft diese einfache Annahme nur dann zu, wenn es in meinem Raytracer nur transparente Objekte mit der Optischen Dichte von Luft geben soll. Denn sobald man dickeres Glas oder Wasser darstellen will kommt noch etwas anderes auf einen zu. Das Zauberwort heist hier "Brechung".
Reine Transparenz "an sich" ist ziemlich langweilig. Zum Farbwert eines Objekts kommt -vereinfacht ausgedrückt- noch der Farbwert eines dahinterliegenden Objekts hinzu. Was in diesem Fall aber vernachlässigt wird ist, dass das Licht an der Oberfläche des transparenten Objekts evt. gebrochen oder reflektiert wird.
Der Teil, der vor einem halben Jahr bei der Programmierung der Reflexion einfacher als gedacht war, war nun tatsächlich schwieriger. Programmiererfahrene kennen dieses Phänomen . Ich musste mir zunächst einige Formeln zur Brechnung, optischer Dichte und partieller Reflexion durchlesen, bis ich die Brechnung korrekt programmieren konnte. Nach ein paar Tagen war das aber zum Glück auch geschafft.
"Brechung" und "Partielle Reflexion" heisen im Klartext folgendes: Ein Sehstrahl trifft auf ein transparentes Objekt (z.B. eine Glaskugel). Zur Darstellung der Transparenz wird der Sehstrahl
a) um einen bestimmten Winkel gekippt und weitergeleitet (= "Brechung")
b) in einen Transparenz-Strahl (siehe a)) und einen Reflexions-Strahl aufgeteilt (= "Partielle Reflexion").
Zu bemerken ist hier, dass beide Größen von der Objekt-Brechzahl und vom Einfallswinkel abhängen. Die Formeln dazu sind (zumindest für die Partielle Reflexion) nicht ganz trivial.
Änderungen:
- Transparente Objekte sind nun möglich (anteilig 0 - 100 %).
- Die transparenten Objekte besitzen eine eigene Optische Dichte. D.h. deren Brechzahl ist ggf. ungleich der von Luft (= 1.0).
- Dadurch ist die korrekte Darstellung von Lichtbrechung möglich.
- Zusätzlich ist die korrekte Darstellung von Partieller Reflexion möglich.
- Implizit ist dadurch auch die Darstellung von Totalreflexion möglich (tritt auf, wenn man z.B. von unter Wasser schräg auf die oben liegende Wasseroberfläche schaut).
- Das Tastenmenü wurde um das Ein- und Ausschalten der Transparenz erweitert.
- Über die Konfig-Datei ist nun der komplette Grafik-Modus konfigurierbar.
Über die Konfig-Datei kann man neben dem Grafik-Modus auch noch einstellen, ob Reflexion und Transparenz überhaupt aktiviert sein sollen. Dies geht auch im laufenden Programm über die Tasten F3 und F4 (Tastenmenü aufrufen durch F12). Wenn man abwechselnd Transparenz und Reflexion abschaltet offenbart sich einem evt. am besten die "Technik" die hinter der Darstellung der Objekte steckt.
Links
Bild:
Exe:
http://www.vgsolutions.de/webspace/vgrt/0_4.rar
Video (Diesmal über RS, um den Traffic klein zu halten):
http://rapidshare.com/files/204326997/0_4.avi
Tcha, was soll man sagen: Auch wenn man es sich ganz fest vornimmt kommt es doch meistens anders als man denkt. Ich z.B. habe mir vor über einem halben Jahr ganz fest vorgenommen, den nächsten Worklog-Eintrag zu meinem Raytracer NICHT erst in einem halben Jahr zu machen. Hat leider nicht funktioniert... Aber immerhin habe ich zwischen Uni und Praktikum wenigstens ein wenig Zeit gefunden.
Falls es vielleicht jemanden gibt, der die Fortsetzung dieses Worklogs tatsächlich erwartet hat: Da der letzte Eintrag schon so lange zurück liegt wird dieser hier etwas ausführlicher .
Was ich als nächstes realisieren wollte war die TRANSPARENZ. Nun hab ich mir diese anfangs ziemlich einfach vorgestellt. Mein Sichtstrahl trifft auf einen (teilweise) transparenten Körper. Ein Anteil wird diffus zurückgeworfen, einer rekursiv als Reflexion (also die beiden Komponenten die mein Raytrayer schon beherrscht) und ein Teil wird eben "durch" die getroffene Fläche weitergesendet. Aus diesen 3 Komponenten bastle ich mir dann den resultierenden Strahl. Soweit also an sich nicht kompliziert, oder?
Stimmt genau, allerdings trifft diese einfache Annahme nur dann zu, wenn es in meinem Raytracer nur transparente Objekte mit der Optischen Dichte von Luft geben soll. Denn sobald man dickeres Glas oder Wasser darstellen will kommt noch etwas anderes auf einen zu. Das Zauberwort heist hier "Brechung".
Reine Transparenz "an sich" ist ziemlich langweilig. Zum Farbwert eines Objekts kommt -vereinfacht ausgedrückt- noch der Farbwert eines dahinterliegenden Objekts hinzu. Was in diesem Fall aber vernachlässigt wird ist, dass das Licht an der Oberfläche des transparenten Objekts evt. gebrochen oder reflektiert wird.
Der Teil, der vor einem halben Jahr bei der Programmierung der Reflexion einfacher als gedacht war, war nun tatsächlich schwieriger. Programmiererfahrene kennen dieses Phänomen . Ich musste mir zunächst einige Formeln zur Brechnung, optischer Dichte und partieller Reflexion durchlesen, bis ich die Brechnung korrekt programmieren konnte. Nach ein paar Tagen war das aber zum Glück auch geschafft.
"Brechung" und "Partielle Reflexion" heisen im Klartext folgendes: Ein Sehstrahl trifft auf ein transparentes Objekt (z.B. eine Glaskugel). Zur Darstellung der Transparenz wird der Sehstrahl
a) um einen bestimmten Winkel gekippt und weitergeleitet (= "Brechung")
b) in einen Transparenz-Strahl (siehe a)) und einen Reflexions-Strahl aufgeteilt (= "Partielle Reflexion").
Zu bemerken ist hier, dass beide Größen von der Objekt-Brechzahl und vom Einfallswinkel abhängen. Die Formeln dazu sind (zumindest für die Partielle Reflexion) nicht ganz trivial.
Änderungen:
- Transparente Objekte sind nun möglich (anteilig 0 - 100 %).
- Die transparenten Objekte besitzen eine eigene Optische Dichte. D.h. deren Brechzahl ist ggf. ungleich der von Luft (= 1.0).
- Dadurch ist die korrekte Darstellung von Lichtbrechung möglich.
- Zusätzlich ist die korrekte Darstellung von Partieller Reflexion möglich.
- Implizit ist dadurch auch die Darstellung von Totalreflexion möglich (tritt auf, wenn man z.B. von unter Wasser schräg auf die oben liegende Wasseroberfläche schaut).
- Das Tastenmenü wurde um das Ein- und Ausschalten der Transparenz erweitert.
- Über die Konfig-Datei ist nun der komplette Grafik-Modus konfigurierbar.
Über die Konfig-Datei kann man neben dem Grafik-Modus auch noch einstellen, ob Reflexion und Transparenz überhaupt aktiviert sein sollen. Dies geht auch im laufenden Programm über die Tasten F3 und F4 (Tastenmenü aufrufen durch F12). Wenn man abwechselnd Transparenz und Reflexion abschaltet offenbart sich einem evt. am besten die "Technik" die hinter der Darstellung der Objekte steckt.
Links
Bild:
Exe:
http://www.vgsolutions.de/webspace/vgrt/0_4.rar
Video (Diesmal über RS, um den Traffic klein zu halten):
http://rapidshare.com/files/204326997/0_4.avi
Version 0.3
Donnerstag, 3. Juli 2008 von Casiopaya
Überblick :
Es hat sich einiges getan bei meinem Raytracer, zumindest sehen die Bilder danach aus . In Wirklichkeit sind die Code-Änderungen aber kleiner als man denken möge, das liegt mal wieder daran, dass der Raytracing-Algorithmus so extrem gut erweiterbar ist. Eigentlich wollte ich nur eine primitive Spiegelung erreichen, da jedes Objekt aber alle Eigenschaften (gewichtet) besitzt (momentan Farbe und Reflexionswert, bald auch Transparenz) habe ich, ohne dass das beabsichtigt war, auch gleich einen tollen Glanzeffekt kreiert. Als ich zum ersten Mal die Metallkugel gesehen habe (und deren "Endlos"-Spiegelung im Spiegel), bin ich fast vom Stuhl gerutscht, sah sie einen Tag vorher doch noch aus wie in Version 0.2.1 .
Die Exe ist nun durch eine ini-Datei konfigurierbar, ich habe auch ein Video hochgeladen, was -wenn man es genau nimmt- meine erste völlig selbst erstellte Computer-Animation ist. Dazu hab ich einfach die erzeugten Einzelframes in eine Avi-Datei mit 25 FPS gepackt.
Änderungen:
- Spiegelungen. Objekte haben sowohl Diffus- als auch Reflexions-Eigenschaften, und zwar stufenlos anteilig! Damit sind nun auch alle Glanzeffekte möglich.
- Objektfarben und -Helligkeiten nun beliebig im RGB-Farbraum festlegbar.
- Lichtfarben und -Helligkeiten nun beliebig im RGB-Farbraum festlegbar.
- Konfiguration durch eine INI-Datei.
- Steuerung der Einstellungen mit Tasten + Einblendung der Tastenbeschreibungen.
Links
Bild:
Exe:
http://www.vgsolutions.de/webspace/vgrt/0_3.rar
Video:
http://www.vgsolutions.de/webspace/vgrt/0_3.avi
Es hat sich einiges getan bei meinem Raytracer, zumindest sehen die Bilder danach aus . In Wirklichkeit sind die Code-Änderungen aber kleiner als man denken möge, das liegt mal wieder daran, dass der Raytracing-Algorithmus so extrem gut erweiterbar ist. Eigentlich wollte ich nur eine primitive Spiegelung erreichen, da jedes Objekt aber alle Eigenschaften (gewichtet) besitzt (momentan Farbe und Reflexionswert, bald auch Transparenz) habe ich, ohne dass das beabsichtigt war, auch gleich einen tollen Glanzeffekt kreiert. Als ich zum ersten Mal die Metallkugel gesehen habe (und deren "Endlos"-Spiegelung im Spiegel), bin ich fast vom Stuhl gerutscht, sah sie einen Tag vorher doch noch aus wie in Version 0.2.1 .
Die Exe ist nun durch eine ini-Datei konfigurierbar, ich habe auch ein Video hochgeladen, was -wenn man es genau nimmt- meine erste völlig selbst erstellte Computer-Animation ist. Dazu hab ich einfach die erzeugten Einzelframes in eine Avi-Datei mit 25 FPS gepackt.
Änderungen:
- Spiegelungen. Objekte haben sowohl Diffus- als auch Reflexions-Eigenschaften, und zwar stufenlos anteilig! Damit sind nun auch alle Glanzeffekte möglich.
- Objektfarben und -Helligkeiten nun beliebig im RGB-Farbraum festlegbar.
- Lichtfarben und -Helligkeiten nun beliebig im RGB-Farbraum festlegbar.
- Konfiguration durch eine INI-Datei.
- Steuerung der Einstellungen mit Tasten + Einblendung der Tastenbeschreibungen.
Links
Bild:
Exe:
http://www.vgsolutions.de/webspace/vgrt/0_3.rar
Video:
http://www.vgsolutions.de/webspace/vgrt/0_3.avi
Version 0.2.1
Freitag, 27. Juni 2008 von Casiopaya
Ein Kleiner Add zwischendurch, ging schneller als gedacht:
Änderungen:
Kugeln können nun dargestellt werden.
Links
Bild (Berechnung braucht bei meinem 3500+ 11 Sekunden):
Änderungen:
Kugeln können nun dargestellt werden.
Links
Bild (Berechnung braucht bei meinem 3500+ 11 Sekunden):
Version 0.2
Dienstag, 24. Juni 2008 von Casiopaya
Und nach nur einem Tag stell ich auch gleich die nächste Version rein, da es doch eine ganz wichtige Änderung gibt.
Änderungen:
Das Licht wird nun in Abhängigkeit der Entfernen und des Eintreffwinkels berechnet. Nun erkennt man ganz deutlich den Nachteil, den man hat, wenn man kein globales Beleuchtungsmodell hat. Die Bilder sehen unrealistisch aus, da ein Licht, das sehr nah vor einer Wand steht diese Wand praktisch nicht, wogegen die Wand am anderen Ende des Raums hell beleuchtet wird.
Physikalisch ist das (ohne globale Beleuchtung, die es in der Natur aufgrund von diffuser Reflexion aber immer gibt) korrekt, sieht aber eben seltsam aus.
Links
Bild:
Exe:
http://www.vgsolutions.de/webspace/vgrt/0_2.rar
Änderungen:
Das Licht wird nun in Abhängigkeit der Entfernen und des Eintreffwinkels berechnet. Nun erkennt man ganz deutlich den Nachteil, den man hat, wenn man kein globales Beleuchtungsmodell hat. Die Bilder sehen unrealistisch aus, da ein Licht, das sehr nah vor einer Wand steht diese Wand praktisch nicht, wogegen die Wand am anderen Ende des Raums hell beleuchtet wird.
Physikalisch ist das (ohne globale Beleuchtung, die es in der Natur aufgrund von diffuser Reflexion aber immer gibt) korrekt, sieht aber eben seltsam aus.
Links
Bild:
Exe:
http://www.vgsolutions.de/webspace/vgrt/0_2.rar
Version 0.1
Dienstag, 24. Juni 2008 von Casiopaya
Warum nicht die nette Möglichkeit eines Worklogs nutzen, die sich einem hier bietet.
Voller Stolz stelle ich hier meinen VG Raytracer Version 0.1 vor.
Features:
- Beliebige Trapeze im 3D-Raum können perspektivisch korrekt dargestellt werden.
- Lichtpunkte können beliebig positioniert werden.
- Schatten werden berechnet, allerdings nicht diffus.
In Planung
- Lichtfarben beliebig einstellbar
- Objektfarben beliebig einstellbar (momentan alles weiss)
- Kugeln
- Spiegelungen
- Brechung
- Transparenz
- Diffuse Schatten
- (Globales Beleuchtungsmodell?)
Links
Bild:
Exe:
http://www.vgsolutions.de/webspace/vgrt/0_1.rar
Voller Stolz stelle ich hier meinen VG Raytracer Version 0.1 vor.
Features:
- Beliebige Trapeze im 3D-Raum können perspektivisch korrekt dargestellt werden.
- Lichtpunkte können beliebig positioniert werden.
- Schatten werden berechnet, allerdings nicht diffus.
In Planung
- Lichtfarben beliebig einstellbar
- Objektfarben beliebig einstellbar (momentan alles weiss)
- Kugeln
- Spiegelungen
- Brechung
- Transparenz
- Diffuse Schatten
- (Globales Beleuchtungsmodell?)
Links
Bild:
Exe:
http://www.vgsolutions.de/webspace/vgrt/0_1.rar