| Mit Raytracing berechnete Bilder |
Raytracing (in englischer Schreibweise meist ray tracing) oder Strahlverfolgung ist ein auf der Aussendung von Strahlen basierender Algorithmus zur Verdeckungsberechnung, also zur Ermittlung der Sichtbarkeit von dreidimensionalen Objekten ab einem bestimmten Punkt im Raum. Ebenfalls mit Raytracing bezeichnet man mehrere Erweiterungen dieses grundlegenden Verfahrens, die den weiteren Weg von Strahlen nach dem Auftreffen auf Oberflächen berechnen.
Prominenteste Verwendung findet Raytracing in der 3D-Computergrafik. Hier ist der grundlegende Raytracing-Algorithmus ebenso wie Scanline Rendering eine Möglichkeit zur Darstellung einer 3D-Szene. Erweiterungen, die den Weg von Lichtstrahlen durch die Szene simulieren, dienen, ebenso wie das alternative Radiosity-Verfahren, der Berechnung der Lichtverteilung.
Weitere Anwendungsgebiete von Raytracing sind die Auralisation und Hochfrequenztechnik.
Als Entwickler des Raytracing-Algorithmus gelten Appel, Goldstein und Nagel, die den Algorithmus Ende der 1960er Jahre veröffentlichten A. Appel: “Some Techniques for Shading Machine Renderings of Solids”, Proceedings of the Spring Joint Computer Conference, 1968 Mathematical Applications Group, Inc.: “3-D Simulated Graphics Offered by Service Bureau”, Datamation 13(1), 1969 R.A. Goldstein, R. Nagel: “3-D Visual Simulation”, Simulation 16(1), 1971. Raytracing basiert jedoch auf der geometrischen Optik, bei der das Licht als eine Gruppe von Strahlen verstanden wird. Die beim Raytracing verwendeten Techniken wurden bereits wesentlich früher, unter anderem von Linsenherstellern, verwendet.
Einfache Formen des Raytracing berechnen nur die direkte Beleuchtung, also das direkt von den Lichtquellen eintreffende Licht. Raytracing wurde seit seiner ersten Verwendung in der Computergrafik jedoch mehrmals wesentlich erweitert. Höher entwickelte Formen berücksichtigen auch das indirekte Licht, das von anderen Objekten reflektiert wird; man spricht dann von einem globalen Beleuchtungsverfahren.
Heute verwenden alle hochwertigen Renderer (Computerprogramme zur Erzeugung von Bildern aus einer 3D-Szene) Raytracing, eventuell in Kombination mit weiteren Verfahren.
Der Begriff Raycasting bezeichnet meist eine vereinfachte Form des Raytracings, wird teils aber auch synonym dazu gebraucht.
In der Szenenbeschreibung werden zumindest folgende Daten angegeben:
Daneben wird beim Raytracing auch die Position eines Augpunktes sowie einer Bildebene angegeben, die zusammen die Perspektive angeben, aus der die Szene betrachtet wird. Der Augpunkt ist ein Punkt im Raum, der der Position einer virtuellen Kamera oder allgemein, eines Beobachters entspricht. Die Bildebene ist ein virtuelles Rechteck, das sich in einiger Entfernung zum Augpunkt befindet. Sie ist die dreidimensionale Entsprechung des zu rendernden Rasterbildes im Raum. Die Bildebene kann man sich in Quadrate unterteilt denken, die den Pixeln des zu erzeugenden Rasterbildes entsprechen.
Raytracing arbeitet mit einer Datenstruktur, Strahl genannt, die den Anfangspunkt und die Richtung einer Halbgeraden im Raum angibt. Es wird für jedes Pixel die Richtung des Strahls berechnet, der vom Augpunkt aus zum entsprechenden Pixel der Bildebene weist. Für jedes Primitiv der Szene wird nun mittels geometrischer Verfahren der eventuelle Schnittpunkt, bei dem der Strahl auf das Primitiv trifft, ermittelt. Dabei wird gegebenenfalls die Entfernung vom Augpunkt zum Schnittpunkt berechnet. Der „Gewinner“, also das vom Augpunkt aus sichtbare Primitiv, ist dasjenige mit der geringsten Distanz.
Das Prinzip der Aussendung der Strahlen vom Augpunkt aus ähnelt dem Aufbau einer Lochkamera, bei der ein Objekt auf einem Film abgebildet wird. Beim Raytracing sind allerdings „Film“ (Bildebene) und „Loch“ (Augpunkt) vertauscht. Ähnlich wie bei der Lochkamera bestimmt der Abstand zwischen Bildebene und Augpunkt die „Brennweite“ und damit den Blickwinkel, mit dem die Szene betrachtet wird.
Da die Strahlen nicht wie in der Natur von den Lichtquellen, sondern vom Augpunkt ausgehen, spricht man auch von backward ray tracing. Raytracing beschäftigt sich mit der Frage, woher das Licht kommt (einige Publikationen nennen das Verfahren allerdings kurioserweise auch forward ray tracing).
Bei Kugeln ist der Schnittpunkttest eine relativ kurze und einfache Prozedur, was die Popularität dieser Objekte auf Raytracing-Testbildern erklärt. Viele Renderprogramme lassen jedoch aus Gründen der Einfachheit nur Dreiecke als Primitiven zu, aus denen sich jedes beliebige Objekt zusammensetzen lässt.
Prozedur Bild_Rendern Strahl.Ursprung = Augpunkt Für jedes (x,y)-Pixel der Rastergrafik Strahl.Richtung = des Pixels der Bildebene - Augpunkt Farbe des (x,y)-Pixels = Farbe_aus_Richtung(Strahl)
Funktion Farbe_aus_Richtung(Strahl) Schnittpunkt = Nächster_Schnittpunkt(Strahl) Wenn Schnittpunkt.Gewinner ≠ (kein) dann Farbe_aus_Richtung = Farbe_am_Schnittpunkt(Strahl, Schnittpunkt)
Funktion Nächster_Schnittpunkt(Strahl) MaxDistanz = ∞ Schnittpunkt.Gewinner = (kein) Für jedes Primitiv der Szene Schnittpunkt = Teste_Primitiv(Primitiv, Strahl) Wenn Schnittpunkt.Distanz < MaxDistanz dann MaxDistanz = Schnittpunkt.Distanz Schnittpunkt.Gewinner = Primitiv Nächster_Schnittpunkt = Schnittpunkt
Jeder Raytracer, unabhängig von der verwendeten Raytracing-Variante, folgt einer ähnlichen Struktur, die einen Schnittpunkttest (Teste_Primitiv) und einen Shader (Farbe_am_Schnittpunkt) enthält.
Raytracing-Voxel.svg, durch die der Strahl wandert (grau eingefärbt), müssen auf einen Schnittpunkt getestet werden. Insgesamt müssen nur die beiden Dreiecke getestet werden.]] Bei den Beschleunigungsverfahren wird die Szene meist in irgendeiner Form automatisch aufgeteilt und die Primitiven diesen Unterteilungen zugewiesen. Wenn ein Strahl durch die Szene wandert, so wird er nicht gegen die Primitiven, sondern zunächst gegen die Unterteilungen getestet. Dadurch muss der Strahl nur noch gegen die Primitive derjenigen Unterteilung getestet werden, die der Strahl kreuzt.
Es wurden eine Vielzahl derartiger Beschleunigungstechniken für Raytracing entwickelt. Beispiele für Unterteilungsschemas sind Voxelgitter, BSP-Bäume, sowie Quader, die die Primitiven umschließen und eine Hierarchie bilden. Mischformen dieser Techniken sind ebenfalls populär. Auch für Animationen gibt es spezielle Beschleunigungstechniken. Die Komplexität dieser Techniken lassen einen Raytracer schnell zu einem größeren Projekt anwachsen. Die Wahl einer bestimmten Technik gestaltet sich als schwierig, da deren Effizienz szenenabhängig und keine generell optimal ist. Allerdings reduziert jedes dieser Verfahren die Laufzeit enorm und macht Raytracing erst zu einem praktikablen Algorithmus. Die Entwicklung und Analyse von Beschleunigungsverfahren ist eines der Gebiete, auf denen beim Raytracing weiterhin Forschung betrieben wird. Mehrfach festgestellt wurde jedoch, dass die asymptotische Laufzeit von Raytracing in Abhängigkeit von der Anzahl der Primitiven logarithmisch ist.
Es wurde gezeigt, dass auf modernen Rechnern nicht die Prozessorleistung, sondern die Speicherzugriffe den Flaschenhals beim Raytracing darstellen. Durch sorgfältige Nutzung von Caching durch den Algorithmus ist es möglich, die Laufzeit wesentlich zu verringern. Ebenfalls möglich ist die Nutzung der SIMD-Fähigkeit moderner Prozessoren, die parallele Berechnungen ermöglicht, sowie speziell darauf optimierter Unterteilungsschemas I. Wald u. A.: “Interactive Rendering with Coherent Ray Tracing”, Eurographics 2001 Proceedings A. Reshetov u. A.: “Multi-Level Ray Tracing Algorithm”, SIGGRAPH 2005 Proceedings. Damit ist das gleichzeitige Verfolgen mehrerer, in „Paketen“ zusammengefasster, Strahlen möglich. Grund dafür ist, dass die vom Augpunkt ausgesendeten Strahlen meist sehr ähnlich sind, also meist die gleichen Objekte schneiden. Mit dem Befehlssatz SSE etwa können vier Strahlen gleichzeitig auf einen Schnittpunkt mit einem Primitiv getestet werden, was diese Berechnung um ein Vielfaches beschleunigt. Auf entsprechenden Hardwareimplementationen – zum Beispiel auf FPGAs – können auch größere Pakete mit über 1000 Strahlen verfolgt werden. Allerdings büßen Caching- und SIMD-Optimierungen bei erweiterten Formen des Raytracings viel von ihrem Geschwindigkeitsvorteil ein.
Weiterhin ist es möglich, den gesamten Raytracing-Vorgang zu parallelisieren. Dies lässt sich etwa dadurch trivial bewerkstelligen, dass verschiedene Prozessoren bzw. Maschinen unterschiedliche Ausschnitte des Bildes rendern. Lediglich gewisse Beschleunigungstechniken oder Erweiterungen müssen angepasst werden, um parallelisierungstauglich zu sein.
Bei größeren Objekten, die mehrmals in der Szene vorhanden sind und sich nur durch ihre Position und Größe unterscheiden (etwa bei einem Wald voller Bäume), muss nicht die gesamte Geometrie neu gespeichert werden. Durch diese Instancing genannte Technik lässt sich bei bestimmten Szenen erheblich Platz einsparen.
Ebenso lässt sich der Speicherbedarf durch eine Wahl kompakterer Repräsentationen der Szenengeometrie drastisch verringern. So wurden punktbasierte Repräsentationen entwickelt, die gegenüber den herkömmlichen Dreiecksprimitiven weniger Speicher belegen, bisher jedoch keine weite Verbreitung gefunden haben.
Grundsätzlich gilt, dass mit jeder Erweiterung die erreichbare Qualität der gerenderten Bilder sowie der relative Zeitbedarf stark anstieg und mit Path Tracing das Maximum erreichte. Erst nachfolgende Entwicklungen zielten darauf ab, den Zeitaufwand von Path Tracing zu verringern, ohne an Qualität einzubüßen.
Ein beliebiger Punkt einer Oberfläche befindet sich genau dann im Schatten, wenn sich zwischen ihm und der Lichtquelle ein Objekt befindet. Indem vom Schnittpunkt an der Oberfläche ein Schattenstrahl in Richtung der Lichtquelle ausgesendet wird, lässt sich bestimmen, ob ein Objekt dessen Weg kreuzt. Ist dies der Fall, so befindet sich der Schnittpunkt im Schatten und es wird als Helligkeit des Strahls 0 zurückgegeben. Im anderen Fall findet normales Shading statt.
Bei lichtdurchlässigen Objekten wird ein Strahl gemäß dem Brechungsgesetz ausgesendet, diesmal ins Innere des betreffenden Objektes. Generell reflektieren transparente Objekte auch einen Teil des Lichts. Die relativen Farbanteile des reflektierten und des gebrochenen Strahls lassen sich mit den Fresnelschen Formeln berechnen. Diese Strahlen werden auch Sekundärstrahlen genannt.
Da die Sekundärstrahlen auf weitere Objekte fallen können, wird der Algorithmus rekursiv aufgerufen, um mehrfache Spiegelungen und Lichtbrechungen zu ermöglichen. Die hierarchische Gesamtheit der Aufrufe wird auch Renderbaum genannt.
Rekursives Raytracing wurde um 1980 von Kay und Whitted entwickelt D.S. Kay: Transparency, Refraction and Ray Tracing for Computer Synthesized Images, M.S. Thesis, Cornell University, Ithaca NY, 1979 T. Whitted: “An Improved Illumination Model for Shaded Display”, Communications of the ACM 23(6), 1980.
In Pseudocode sieht der Shader beim rekursiven Raytracing in etwa wie folgt aus:
Funktion Farbe_am_Schnittpunkt(Strahl, Schnittpunkt) Wenn Schnittpunkt.Gewinner.Material = spiegelnd oder transparent dann Reflektierter_Anteil = Fresnel(Strahl, Schnittpunkt) Farbe = Reflektierter_Anteil × Farbe_aus_Richtung(Reflexionsstrahl) + (1 - Reflektierter_Anteil) × Farbe_aus_Richtung(Gebrochener Strahl) ansonsten Farbe = 0 Für jede Lichtquelle Schattenstrahl = Lichtquelle.Position - Schnittpunkt.Position SchattenSchnittpunkt = Nächster_Schnittpunkt(Schattenstrahl) Wenn SchattenSchnittpunkt.Gewinner ≠ (kein) dann Farbe = Farbe + Direkte_Beleuchtung(Strahl, Lichtquelle) Farbe_am_Schnittpunkt = Farbe
Der Rest des Programms kann wie beim einfachen Raytracing bleiben. Die hier aufgerufene Funktion Farbe_aus_Richtung kann wiederum Farbe_am_Schnittpunkt aufrufen, woraus der rekursive Charakter des Verfahrens deutlich wird.
Rekursives Raytracing ermöglicht neben Lichtbrechung und -reflexion die Simulation von harten Schatten. In Wirklichkeit haben Lichtquellen jedoch eine bestimmte Größe, was dazu führt, dass Schatten weich und verschwommen wirken.
Dieser Effekt, sowie Antialiasing, glänzende Reflexion und mehr, lassen sich mit diffusem Raytracing (auch stochastisches Raytracing oder distributed ray tracing genannt) simulieren, das 1984 von Cook u. A. veröffentlicht wurde R.L. Cook u. A.: “Distributed ray tracing”, SIGGRAPH 84 Proceedings. Die Idee ist, in verschiedenen Situationen statt eines Strahls mehrere Strahlen auszusenden und aus den errechneten Farben den Mittelwert zu bilden. Beispielsweise lassen sich weiche Schatten mit Kern- und Halbschatten erzeugen, indem die Richtungen der Schattenstrahlen zufällig verteilt die Oberfläche der Lichtquelle abtasten. Der Nachteil ist, dass dabei Bildrauschen entsteht, wenn zu wenig Strahlen verwendet werden. Es gibt jedoch Möglichkeiten wie Importance Sampling, die das Rauschen reduzieren. Auch Photon Mapping lässt sich dazu verwenden, das Rauschen weiter zu verringern.
Obwohl diffuses Raytracing zahlreiche Effekte ermöglicht, ist es immer noch nicht in der Lage, die globale Beleuchtung mit Effekten wie diffuser Interreflexion und Kaustiken (durch Bündelung von Licht erzeugte helle Lichtflecken) zu simulieren. Dies liegt daran, dass zwar bei spiegelnden Reflexionen, nicht jedoch bei diffusen Oberflächen Sekundärstrahlen ausgesendet werden.
In seiner 1986 veröffentlichten Publikation beschrieb James Kajiya die Rendergleichung, die die mathematische Basis für alle Methoden der globalen Beleuchtung bildet J. Kajiya: “The rendering equation”, Proceedings of the 13th annual conference on Computer graphics and interactive techniques, 1986. Dabei zeigte er, dass zur globalen Beleuchtung Sekundärstrahlen von allen Oberflächen ausgesendet werden müssen. Daneben wies er auch darauf hin, dass ein Renderbaum den Nachteil hat, dass zu viel Arbeit für die Berechnungen in großer Hierarchietiefe verschwendet wird und es besser ist, jeweils einen einzigen Strahl auszusenden. Diese Methode ist heute als Path Tracing bekannt, da ein Strahl sich vom Augpunkt aus seinen „Weg“ durch die Szene sucht. Das Supersampling findet einzig auf Pixelebene statt. Path Tracing hat eine rigorose mathematische und physikalische Basis.
Obwohl Path Tracing theoretisch die globale Beleuchtung simulieren kann, nimmt die Effizienz des Verfahrens bei kleinen Lichtquellen ab. Insbesondere Kaustiken und deren Reflexionen sind mit Path Tracing sehr verrauscht. Deshalb werden meist andere, auf Path Tracing basierende Verfahren oder Erweiterungen verwendet.
Forward Raytracing ist eine seltene Variante, bei der die Lichtstrahlen nicht vom Augpunkt, sondern von den Lichtquellen ausgesendet werden. Die Pixel, die vom Strahl auf der Bildebene getroffen werden, werden eingefärbt. Dadurch lassen sich bestimmte Effekte wie Kaustiken gut, andere Effekte jedoch nur sehr ineffizient simulieren, da viele Strahlen die Bildebene verfehlen.
Siehe auch: Vierdimensionales Raytracing
Raytracing wird vornehmlich bei der Erzeugung von Darstellungen eingesetzt, bei denen eher die Qualität als die Berechnungszeit im Vordergrund steht. In Bereichen wie der Virtuellen Realität, in der räumliche Darstellungen in Echtzeit berechnet werden müssen, konnte sich Raytracing bisher nicht durchsetzen. Es wurde allerdings manchmal von der Demoszene genutzt.
Dennoch existieren Bestrebungen, echtzeitfähige Raytracer für komplexe Szenen zu implementieren, was bereits unter bestimmten Voraussetzungen mit prozessor- und speicheroptimierten Softwarelösungen gelungen ist. Auf Hardware optimierte Implementierungen von Raytracing zeigen, dass die künftige breite Nutzung von Raytracing im Echtzeitbereich denkbar ist. Auch direkt auf Mikroprozessoren wurde Raytracing bereits implementiert J. Schmittler u. A.: “A Hardware Architecture For Ray Tracing”, Graphics Hardware 2002 Proceedings. Gegenüber Scanline-Renderern hat Raytracing mehrere Vorteile:
In der Akustik ist Raytracing neben der Spiegelschallquellenmethode und der Diffusschallberechnung eine Möglichkeit zur Lösung dieses Problems. Zur Simulation müssen die Materialeigenschaften der verschiedenen Körper sowie die Dämpfung des Schalls durch die Luft berücksichtigt werden.
Eine Möglichkeit zum Auffinden der Übertragungswege besteht darin, Strahlen von einer Quelle isotrop (in alle Richtungen) auszusenden, eventuell mit Energieverlust an den Gegenständen zu reflektieren und die Gesamtenergie der auf den Empfänger auftreffenden Strahlen zu ermitteln. Diese Methode wird Ray launching genannt. Strahlen können auch eine bestimmte „Form“ – etwa die einer Röhre – haben, um punktförmige Empfänger simulieren zu können. Der Nachteil dieser Methode ist ihre Langsamkeit, da viele Strahlen nie den Empfänger erreichen und für präzise Statistiken eine hohe Anzahl vonnöten ist.
Ein weiteres Problem ergibt sich dadurch, dass die Wellenlänge oft nicht gegenüber den Abmessungen der Körper innerhalb einer Szene vernachlässigbar ist. Sofern die Beugung von Strahlen nicht berücksichtigt wird, kann es daher zu merklichen Fehlern in der Simulation kommen.
Sonstiges:
3D-Computergrafik | 3D-Computergrafik | Algorithmus
Sledování paprsku | Ray tracing | Raytracing | Lancer de rayon | レイトレーシング | Ray Tracing | Raytracing | Işın izleme | 光线跟踪
This article is licensed under the GNU Free Documentation License.
It uses material from the
"Raytracing".
Home Page • arts • business • computers • games • health • hospitals • home • kids & teens • news • physicians • recreation• reference • regional • science • shopping • society • sports • world