next up previous contents
Next: Radiosity Up: Computergrafik Previous: Allgemein

Raytracing

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.

picture192

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.

math210

Ein großer Vorteil ist die Möglichkeit, die Objekte analytisch zu berechnen. Eine Kugel kann in Form ihrer mathematischen Definition math212

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.


next up previous contents
Next: Radiosity Up: Computergrafik Previous: Allgemein

Helmut Fahrion
Sun Apr 13 15:58:19 GMT 1997