Werbung
In Kooperation mit Zotac
Eine vollständige Darstellung mittels Raytracing ist der heilige Gral des Renderings. Licht, Schatten, Reflexionen – dies alles entspräche dem Realismus, den wir alle mit unseren Augen wahrnehmen. Doch auch wenn die Entwicklung von Raytracing bereits Ende der 70er Jahre begann, bis heute ist es nicht möglich, eine komplette Szene in Echtzeit mithilfe von Raytracing zu berechnen. Für Renderings einzelner Bilder und auch in der Filmindustrie werden verschiedenste Raytracing-Techniken bereits seit Jahren angewendet, hier aber darf das Rendern eines Bildes auch mehrere Minuten oder gar Stunden dauern – von Echtzeit kann also keine Rede sein.
Mit der Ampere-Architektur und den darin verwendeten RT Cores der zweiten Generation will NVIDIA die Raytracing-Leistung weiter gesteigert haben. Vor allem aber sind die Raytracing-Effekte inzwischen nicht mehr nur auf dem PC präsent, sondern auch durch die beiden aktuellen Konsolengenerationen von Microsoft (Xbox Series X) und Sony (PlayStation 5) vertreten. Entsprechend haben Spieleentwickler eine viel breitere Basis für die Umsetzung des Raytracing, da dies nicht mehr nur auf den PC beschränkt ist.
Wie funktioniert Raytracing?
Raytracing kann mit Strahlenverfolgung übersetzt werden und dieser eingedeutschte Begriff erklärt auch teilweise die Funktionsweise der Technik – es geht also darum, den Weg von Lichtstrahlen zu verfolgen und diese zu berechnen. Anhand dieser Beschreibung könnte man nun davon ausgehen, dass ein Raytracing immer von der oder den Lichtquellen ausgehend berechnet wird. Dies ist aber nicht der Fall, denn eigentlich handelt es sich beim Ray Tracing in der Computergrafik um ein rückwärtiges Raytracing – vom Betrachter wird der Weg der Strahlen also in die Szenerie in umgekehrter Reihenfolge berechnet. Daher hört man auch immer wieder den Begriff Backward Raytracing.
In erster Linie ist ein Raytracing aber ein Verfahren zur Verdeckungsberechnung. Es geht darum zu ermitteln, ob ein Objekt für den Betrachter sichtbar ist oder nicht. Diese Berechnung über einen Strahl erfolgt für jedes Pixel, welches sich auf der Bildebene mit Ausgangspunkt des Betrachters befindet. Diese Berechnung erfolgt für jedes Objekt (Primitiv) im 3D-Raum. Per geometrischer Verfahren wird vom Betrachtungspunkt aus, jedes Pixel auf der Bildebene auf sichtbare und nicht mehr sichtbare Objekte hin überprüft.
Zieht man nun nicht nur die Verdeckungsberechnung heran, sondern erweitert die Berechnung der Strahlen um weitere Schritte, lassen sich daraus zusätzliche Informationen zur Beleuchtung ermitteln. Dazu muss natürlich die Materialbeschaffenheit eines jeden Primitives hinterlegt sein. Handelt es sich um eine matte oder glänzende Oberfläche? Wie groß ist der Grad der Reflexion, Streuung oder Transparenz? Viele weitere Faktoren bestimmen, wie sich Licht, welches auf eine Oberfläche trifft, verhält. Man kann sich sicherlich leicht vorstellen, dass bei einem Backward Raytracing die Anzahl der Strahlen exponentiell wächst, je mehr Ebenen man in die Berechnung mit einbezieht. Ein Vollbild-Raytracing bei UHD-Auflösung in Echtzeit und mehreren hundert oder gar tausend Primitives mit dazugehörigen Streu- und Reflexionseigenschaften ist auch mit den Karten der GeForce-RTX-40-Serie nicht zu berechnen. Einige Ausnahmen bilden eine RT Umsetzung für Quake II RTX oder auch die Raytracing-Version von Minecraft. Es handelt sich dabei aber um Spiele, die schon in der klassischen Rasterization-Technik nicht besonders herausfordernd sind.
Es gibt zudem einige Tricks, die den Rechenaufwand reduzieren. Dazu gehören lokale Beleuchtungsmodelle oder bereits vordefinierte Beschreibungen der Lichtquellen, welche die Berechnungen vereinfachen.
Ein Raytracing kann aber mehr als eine Verdeckungsberechnung und Berechnung von Beleuchtung sein. Es ist nicht nur möglich, Lichtstrahlen über den Betrachtungspunkt und die Bildebene sozusagen rückwärts zu berechnen, sondern auch von beliebigen anderen Punkten des Raums. Bereits kurz angesprochen haben wir dies für Lichtquellen, möglich ist dies aber auch für Schatten. Arthur Appel zeigt dies bereits 1968. Ein Schatten wird immer dann erzeugt, wenn sich zwischen einem Punkt auf einer Oberfläche und der Lichtquelle ein Objekt befindet. Nun ist die Realität selten von nur einer Lichtquelle beleuchtet, über Reflexion und Streuung kommt es abhängig vom Betrachtungsabstand zu harten und weichen Schatten und vielem mehr. Für ein klassisches Rendering kann man entweder auf vordefinierte Schatten (prebacked, sehr aufwändig für große Szenen und 3D-Welten) zurückgreifen oder aber verwendet bestimmte Tricks, wie das Enhanced Horizon Based Ambient Occlusion (HBAO), Hybrid Frustum Traced Shadows (HFTS) und andere Verfahren. Allesamt sind diese aber nur Annäherungen und keine echten Berechnungen für Schatten.
Noch komplizierter ist das Raytracing mit durchlässigen, halbdurchlässigen und spiegelnden Objekten. Dabei werden weitere Strahlen von den Schnittpunkten ausgesendet und müssen dementsprechend auch berechnet werden. Insbesondere Reflexionen waren bisher häufig nur über Tricks im Rendering-Prozess möglich, denn lagen die reflektierten Objekte außerhalb des Screen Space, wurden sie in der Rendering-Pipeline bereits zu einem früheren Zeitpunkt verworfen und daher auch nicht mehr berechnet.
Bei spiegelnden Flächen muss lediglich die Richtung des von der Fläche ausgehenden Strahls gemäß des Reflexionsgesetzes (Einfallswinkel gleich Reflexionswinkel) berücksichtigt werden. Bei lichtdurchlässigen Objekten muss zur physikalisch korrekten Berechnung auch noch das Brechungsgesetz mit einbezogen werden. Generell reflektieren transparente Objekte auch einen Teil des Lichts, wie zum Beispiel Glasoberflächen. Diese Sekundärstrahlen bringen natürlich weitere Komplexität in die Szene und erhöhen damit den Rechenaufwand.
Da diese Sekundärstrahlen auf weitere Objekte fallen können, wird das Raytracing an dieser Stelle rekursiv angewendet, um mehrfache Spiegelungen und Lichtbrechungen zu ermöglichen. Das rekursive Raytracing wurde etwa 1980 von Kay und Whitted entwickelt und wird heute von NVIDIA auch technisch umgesetzt. Rekursives Raytracing ermöglicht neben Lichtbrechung und -reflexion die Simulation von eben bereits angesprochenen Schatten. Lichtquellen werden in den Engines häufig als Lichtpunkte angenommen. In Wirklichkeit haben sie jedoch eine bestimmte Größe, was dazu führt, dass Schatten weich und verschwommen wirken. Um dies zu berechnen, werden statt eines Strahls gleich mehrere ausgesendet und aus den errechneten "Farben" ein Mittelwert gebildet. So entsteht nicht nur ein Schatten, sondern ein Kernschatten und ein Halbschatten. Ein Nachteil dieser Methode ist, dass es zu einem Bildrauschen kommen kann, wenn zu wenig Strahlen verwendet werden.
Als letzter Punkt kann auch noch das Pathtracing angeführt werden, welches nicht nur vom Betrachtungspunkt ausgehend eine Berechnung vornimmt, sondern auch von den Lichtquellen aus. Dies ist aber extrem aufwendig und funktioniert daher noch nur in einigen wenigen Spielen, bei denen sich auch die weiteren Details in Grenzen halten.
Ein Raytracing kann also extrem komplex werden und ist auf eine komplette Szene in voller Ausführung nur in Ausnahmefällen möglich. Per DirectX-Schnittstelle bietet NVIDIA aber einige Teileffekte an:
- Reflexionen und Refraktionen
- Schatten und Beleuchtung
- Global Umgebungsbeleuchtung
- Physikberechnungen, Kollisionserkennung, Partikelsimulation
- Audio-Simulation (NVIDIA VRWorks Audio)
- In-Engine Pathtracing
Spielen setzen dabei meist nur einen Teilbereich der Effekte auch um. Es gab aber auch hier schon Weiterentwicklungen. So verfügte Metro: Exodus in seiner ersten Version nur über eine rudimentäre Berechnung der Schatten und Umgebungsbeleuchtung per Raytracing. In der Enhanced Edition hat man deren Umfang deutlich ausgebaut und unter anderem um die Verfolgung mehreren Bounces des Lichtstrahls erweitert.
In Kooperation mit Zotac