Es wird der Lichtstrahl von der Kamera durch den Bildschirm ``geschossen'' bis er auf ein Objekt trifft, der Strahl wird durch Spiegelung oder Brechung solange verfolgt bis er in die Unendlichkeit geht. Der Farbwert der ermittelt wird ist der Wert den das Pixel auf dem Bildschirm bekommt.
Dieses Vorgehen ist mit der Abtastung des Bildschirmes zu vergleichen.
Vorteile:
Das Raytracing stellt eine Szene so am Bildschirm dar, wie es eine Kamera oder das menschliche Auge sieht. In einer echten Szene gehen die Lichtstrahlen von der Lichtquelle aus und werden von den Körpern reflektiert, bis sie in die Kamera eintreten.
Da die Anzahl der Strahlen nahezu unendlich ist, wird beim Raytracing die Richtung umgekehrt verfolgt. Die Anzahl der Lichtstrahlen von der Kamera aus kann identisch mit der Auflösung des Bildes bestimmt werden (ohne Spiegelungen und ohne transparente Körper). Der Strahl wird von der Kameraposition aus durch jedes Pixel geschossen und dann weiter in die Szene geschickt, das nennt man auch Abtastung. Das Ende des Strahles ist erreicht, wenn der Strahl kein Objekt mehr schneidet und in die Unendlichkeit geht. Das Raytracing eignet sich hervorragend für scharfe Kanten, Spiegelungen und transparente Objekte. Der wichtigste Übergabeparameter ist der Strahl, der verfolgt werden soll. Ein Strahl ist ein Richtungsvektor. Die Anfangsstrahlen werden von einer Abtastfunktion ermittelt.
Raytracing ist ein einfacher und rekursiver Algorithmus. Mit Worten etwa so zu beschreiben:
float raytrace(...) { suche erstes Objekt ist kein Objekt getroffen, dann Hintergrundfarbe ermitteln und return 0 ansonsten ermittle die Farbe des Schnittpunktes local_color() ist die maximale Rekursionstiefe erreicht? nein gibt es reflektierendes Licht ja berechne Vektor raytrace(...) nein reflektierendes Licht = schwarz ist Objekt durchsichtig ja berechne Vektor raytrace(...) nein Licht aus Durchlaessigkeit = schwarz ja alles ist schwarz berechne Farbe aus Objektfarbe, Material, Reflexion, Spiegelung, Durchlaessigkeit und Textur return Entfernung }
Durch die Rekursivität ist der Algorithmus verblüffend einfach und lastet trotzdem jeden Supercomputer vollständig aus. Wenn der Lichtstrahl, der durch den Bildschirm geschossen wird, kein Objekt trifft oder in einer bestimmten Rekursionstiefe kein Objekt mehr schneidet, ist die Strahlenverfolgung abgeschlossen. Es kann der Farbwert schwarz oder der des Hintergrundes verwendet werden. Aber wenn zwei spiegelnde Flächen sich genau gegenüberstehen, kann es zu einer endlosen Rekursion kommen. Aus diesem Grund wird eine maximale Rekursionstiefe als Abbruchbedingung definiert. Ein Wert von mindestens 7 bis etwa 50 ist denkbar.
Eine besondere Bedeutung kommt der Funktion local_color() zu, welche durch alle Lichtquellen läuft und die Helligkeit des Punktes berechnet.
In der nächsten Verzweigung werden die Strahlen nach dem Brechungsgesetz weiterverfolgt, bis diese keinen Körper mehr schneiden.
Beim Austritt aus der Rekursion werden die Farben zu einer Gesamtfarbe addiert. Bei dem Beispielraytracer bestehen die Farben aus Rot-, Grün- und Blauanteilen.
Ein großer Vorteil ist die Möglichkeit, die Objekte analytisch zu
berechnen. Eine Kugel kann in Form ihrer mathematischen Definition
in das Programm übernommen werden. Es ist nicht notwendig, sie in einzelne Facetten zu zerlegen. Durch die analytische Berechnung der einzelnen Strahlen ist es sehr einfach, die unterschiedlichsten Effekte einzubauen, da alle Lichtstrahlen mit der Vektorrechnung berechnet werden können. So können die Effekte von Wellen durch die Änderung des Normalvektors eines Polygons mit Hilfe von Sinusschwingungen nachgebildet werden.
Der Nachteil des Raytracings ist der hohe Rechenaufwand. Falls keine interaktive Bearbeitung der Szene erfolgen soll, kann die Berechnung im Hintergrund erfolgen und ist weniger störend. Durch den Einsatz von Netzwerken und Mehrprozessor-Systemen kann die Geschwindigkeit des Raytracings durch echte parallele Verarbeitung linear zur Anzahl der Prozessoren gesteigert werden.
Ein weiterer Nachteil ist die Annahme einer konstanten Umgebungshelligkeit. Dieser Wert wurde eingeführt, um die nicht ausgeleuchteten Stellen im Bild aufzuhellen und darstellen zu können. In einer natürlichen Umgebung wird von jedem Körper eine bestimmte Menge Licht diffus reflektiert. Dieses reflektierte Licht beeinflußt die benachbarten Körper. Ein Verfahren, welches sich für die diffusen Anteile des Lichtes eignet, ist das Radiosity-Verfahren, dieses Verfahren ist in diesem Programm nicht implementiert, in den Folgenden Abschnitten erfahren Sie wie eine Verfahren welches dem Radiosity ähnlich ist implementiert werden kann.
Wenn nur die Vorteile des Raytracings genutzt werden sollen, so ist auf jeden Fall die Genauigkeit des Raytracings zu nutzen. Die Genauigkeit des Raytracings paßt sich mit der Auflösung des Bildschirmes an, wenn kein Antialiasing verwendet wird. Das Raytracing kann somit den z-Buffer Algorithmus ablösen. Dies hat den Vorteil, daß spiegelnde und durchsichtige Körper dargestellt werden können. Durch Raytracing können auch viele andere Effekte leicht in das Programm eingebaut werden, wie Bump-Mapping und Turbolenzen.