Ich mag Planar Reflections auch - fast alles ist besser als diese
volatile Screen-Space-Seuche -, allerdings sind sie kein Allheilmittel. Planar Reflections funktionieren, der Name sagt's schon, nur auf ebenen Flächen gut, also beispielsweise zur Wasserdarstellung oder für Wandspiegel. Aber was machst du, wenn dein Spiegel eine Krümmung hat, deine Fahrbahn wellig ist, auf Karosserien, Bad-Armaturen, dem Helm-Beispiel usw.? Das wird sehr fummelig oder ist unmöglich. Außerdem gibt es einen Punkt der Komplexität, wo das doppelte Rendern der Szene teurer wird als selektives Raytracing für Reflexionen. Man kann nicht jede Mini-Spiegelfläche mit Planars zukleistern.
Davon ab ist Ray- bzw. Pathtracing eben
viel, viel mehr als Reflexionen, auch wenn das gerne auf diesen gut sichtbaren Effekt reduziert wird. Wie genau simulierst du Refraktionen in milchigem oder brüchigem Glas? Gar nicht.
MfG
Raff
Lichtbrechung geht über Shader recht gut; auch in Kombination mit teiltransparenten Oberflächen. Ich glaube die Wasseroberfläche in Far Cry hat als erstes beides berücksichtigt. Natürlich gilt auch hier, ähnlich wie für Reflektionen: Rasterizer-Tricks skalieren sehr schlecht mit der Zahl der Effekte und gehen von vereinfachten Annahmen aus. Die treffen auf viele Spielsituationen zu und solange du eine Fläche hast, die einmal bricht/reflektiert eine Lichtquelle, die einen direkten Schatten wirft, bekommt man mit einer Technik, die bestimmte Aspekte für den ganzen Bildschirm abstrahiert, eine viel bessere Performance respektive bei gleichen Fps die bessere Bildqualität. Wenn dagegen dutzende kleiner Spiegel durch Linsen hinweg sich überlagernde Mehrfachschatten von multiplen indirekt-gestreuten Lichtquellen darstellen sollen, bekommt man ein Problem. Schon allein deswegen weil z.B. eine Planar Reflection, die in einer Planar Reflection sichtbar ist zwei komplette aufeinander folgende Renderdurchgänge benötigt, die hinterher auch noch kombiniert werden müsen. (Vergl. Portal ohne RTX.)
Pixelbasiertes Vorgehen wie bei Raytraycing ist in einem derart komplexen Szenario effizienter – es gibt quasi keinen Overhead und wenn am Ende sowieso jedes Pixel einen anderen Renderpfad als sein Nachbar erfordert, kann ein Rasterizer keine Detailschritte einsparen, ohne an Qualität einzubüßen. So ähnlich wie Voxel effizienter als Polygone sind, sobald man ein 9-Koordinaten-Polygon statt eines 3-Koordinaten-Voxel pro Pixel berechnen müsste. Aber hier wie dort stellt sich die Frage, wo genau der Break-Even liegt und ob man ihn mit aktueller Hardware überhaupt erreichen kann?
Bislang wird Raytraycing +überwiegend für einen Teil der direkten Beleuchtung und für deutlich zu sehende Reflektionen in Spiegeln und auf Pfützen genutzt. Das heißt als Ersatz für Stencil-Schatten und für Planar Reflections. Die Zahl der Spiegel ist dabei schon durch sinnvolles Leveldesign ziemlich begrenzt und die Zahl der berücksichtigten Lichtquellen scheint mir oft so niedrig zu sein, dass man fast schon an Doom 3 erinnert wird. Mit jeweils dutzenden wäre ein Rasterizer sicherlich überfordert, aber aktuelle GPUs scheinbar auch.
Gibt es einen Unterschied zwischen Raytracing und Pathtracing, oder sind es unterschiedliche Begriffe für dasselbe?
Beide Begriffe scheinen recht willkürlich verwendet zu werden, aber in der reinen Lehre wären beide identisch. Spätestens seitdem Nvidia alles mit einem Hauch von Zusatzeffekt als "RTX" brandmarkt steht Pathtraycing daher tendenziell für 100 Prozent Raytraycing. Das heißt also es wird für jedes Pixel der komplette Weg von der Betrachterkamera bis zu einer Lichtquelle zurückverfolgt. "Raytraycing" wäre es dagegen formell auch schon, wenn man nur Primärstrahlen auf eine statisch mit Lightmaps erhellte Szene feuern würde. Allerdings beinhaltet auch "Pathtraycing" in aller Regel keine unbegrenzte Anzahl an Folgestrahlen, die beispielsweise bei "Endlosspiegeln" näherungsweise ins unendlich gehen würden und somit unberechenbar wäre. Ebenso gibt es keinen Konsens darüber, wie viel "Echtzeit" denn in "Echtzeit Pathtraycing" stecken muss. In Raffs Video sieht man zum Beispiel an 1-2 Stellen, wie Beleuchtungsdetails nachträglich eingezeichnet werden. Das heißt hier wird bereits über eine ganze Reihe von Frames hinweg temporal integriert, weil die Performance nicht ausreicht um alles in einem Renderdurchgang/ohne Rückgriff auf vorgerenderte Informationen aus älteren Frames darzustellen. Komplett offen bleibt die Frage nach der indirekten Beleuchtung und deren Genauigkeit. Das ist die eigentliche Achillesferse von Raytraycern (Rasterizer liefern allgemein Grütze ab, das aber flott):
Nimmt man die Winkelauflösung eines UHD-Bildes als Grundlage und verlangt, dass für jede Oberfläche im Spiel zumindest mit 1 Prozent dieser Genauigkeit geprüft wird, ob eine indirekte Beleuchtung vorliegt, würde das allein pro Primärstrahl, der auf eine matte Oberfläche trifft (in HL ist praktisch alles matt) knapp 94000 Sekundärstrahlen erfordern. (Und jeder einzelne dieser Sekundärstrahlen erfordert dann seinerseits so viele Tertiärstrahlen, wie es Lichtquellen gibt – in Gegenwart leuchtender Schnellfeuermunition also gegebenenfalls hunderte.) Um in dieser Qualität gemäß der Naturgesetze realistisch zu Rendern, also das Raytaycing-Versprechen vollumfänglich umzusetzen*, bräuchte man Petarays/s, aktuelle Grafikkarten liegen aber noch im unteren GR/s-Bereich.
*: Das heißt in der Natur gibt es natürlich auch doppelt indirekte Beleuchtungen. Zum Beispiel wenn die Sonne eine weiße Wand anstrahlt, deren Licht auf einen Holzschrank fällt und dann dafür sorgt, dass der Boden vor dem Schrank nicht reinweiß beleuchtet ist. Wollte man das auch in besagter Genauigkeit berechnen (was sicherlich übertrieben ist), würde sich die Rechenlast erneut mit knapp 100.000 multiplizieren und vermutlich die Leistung sämtlicher bis heute gefertigter GPUs übersteigen.