Modell Laufzeitoptimierungen Schnittalgorithmen Szenendatenstrukturen Thomas Jung Verbesserung der Bildqualität Realzeitanforderungen begrenzen Bildqualität Fotorealismus nur mit globalen Beleuchtungsmodellen kann fotorealistische Grafiken generieren OpenGL- Mehrpassverfahren Belegarbeit Friedemann Schmidt WS1998/99 Lokale Beleuchtungsmodelle Echtzeitfähig Reflection mapping (1-stufige Reflexion) Transparenz ohne Lichtbrechung Schatten nur mit Mehrpassverfahren (shadow volumes oder shadow mapping) oder sehr eingeschränkt: (scene space) ambient occlusion Globale Beleuchtungsmodelle Meist nicht echtzeitfähig Berücksichtigen Interobjektreflektion Diffuse Reflexion: Radiosity Spiegelnde Reflexion: Brechung und Reflexion lange bekannt seit Rene Descartes (1637!) Zur Erklärung der Form des Regenbogens in der Computergrafik Hidden-Surface-Removal: Appel 68, Goldstein 71 Beleuchtung: Kay/Greenberg 79, Whitted 80 Whitted 1
Basis: Teilchenmodell Licht breitet sich in Form von Strahlen aus Strahlen werden an Oberflächen reflektiert oder gebrochen Einige Strahlen gelangen in das Auge des Betrachters Strahlen die nicht das Auge treffen sind egal Strahlen verfolgen vom Ziel zur Quelle Lichtausbreitung Strahlen treffen selten Lichtquelle genau Diffuse Beleuchtung berücksichtigen Verfolgung von Strahlen durch die Szene Beginn vom Auge durch alle Pixel des Bildes Bei Auftritt auf Objekt Verfolgung des reflektierten und des gebrochenen Strahls Jeweils Strahlen zu allen Lichtquellen für diffuse Beleuchtung Terminierung bei erreichter Reflexionstiefe Steuerung des Strahls w s a d Drehung der Szene mit der Mouse Strahlen, die nichts treffen, werden nicht dargestellt Für jede Zeile des Bildes Für jeden Pixel der Zeile Bestimme Strahl vom Auge zum Pixel Pixelfarbe = Raytrace(Strahl) Raytrace(Strahl) Falls weiterverfolgen Wenn Strahl Objekt schneidet und Schnittpunkt ist bisher am nächsten notiere Schnitt Wenn kein Schnitt dann Ergebnis := Hintergrundfarbe sonst Ergebnis := Raytrace(reflektierten Strahl) + Raytrace(gebrochenem Strahl) 640 x 480 Für alle Lichtquellen Wenn Strahl zur Lichtquelle Objekt schneidet Schleifenabbruch, nächste Lichtquelle Wenn kein Schnitt gefunden Ergebnis += lokale Beleuchtung 2
Lokale Beleuchtung Keine Brechung Spiegelung der Lichtquelle lokale Beleuchtung Zusätzlich reflektierter Strahl Zusätzlich gebrochener Strahl Reflektanzvektor R Augvektor A Normale N Halbvektor H Lichtvektor L So nur bei der ersten Reflexion (nicht bei Whitted) ist sehr rechenintensiv Die meiste Zeit finden Schnitttests statt Ansätze zur Beschleunigung Effiziente Schnittberechnungen Hüllobjekte, um Schnitte auszuschließen Szenendatenstrukturen, um Anzahl der Schnittkandidaten einzugrenzen Effiziente Schattenberechnung Schnell für Primitivobjekte Kugeln, Quader, Zylinder Eignen sich als Hüllobjekte Polygonale Oberflächen Müssen polygonweise getestet werden Aufwand steigt linear mit der Polygonanzahl Freiformflächen Müssen eigene Schnittfunktion anbieten Oder in Polygone konvertiert werden Strahl mit jeweils zwei parallelen Ebenen schneiden tklein, tgross(vorzeichenbehaftet!) Wenn größtes tklein kleiner als kleinstes tgross dann Schnitt Aufwand: 8 Skalarprodukte und ca. 6 Vergleiche -7 xklein Xklein (7) größer als ygross () -3-3 yklein yklein Start yklein (-3) kleiner als ygross () 0 0 Start ygross 7 ygross 8 xklein xgross Normalerweise Schnitt mit allen Objekten nötig Schnitt Strahl-Octree erübrigt Schnitt mit den meisten (Hüll-) Objekten Potentiell getroffenenes Objekte Strahl Diese Objekte müssen nicht betrachtet werden Aufbau Lege Quader q um Szene Für alle Objekte o Einfügen(o, q) Einfügen (Objekt o, Quader q) Für alle acht Teilquader t von q Wenn o ganz in t passt Ggf. t erstellen Einfügen(o, t) return Ordne Objekt o Quader q zu Schnitt Schnitt ( Quader q, Strahl s) Wenn q leer return NULL Wenn Schnitttest(q, s) Für alle acht Teilquader t von q res += Schnitt (t, s) Für alle zugeordnenten Objekte o res += Schnitttest(o, s) return nächsten Schnitt(res) 3
Shadow feeler erfordert pro Lichtquelle Schnitt mit Gesamtszene Light Buffer Quader um die Lichtquelle Alle potentiell verdeckenden Objekte der Umgebung werden in Light buffer abgebildet Verdeckungstest durch Zugriff auf Light Buffer bzw. Test mit allen dort vermerkten Polygonen Pro Lichtquelle Light Buffer erforderlich! Shadow feeler (Ausschnitt RT-Algorithmus) Für alle Lichtquellen Wenn Strahl zur Lichtquelle Objekt schneidet Schleifenabbruch, nächste Lichtquelle Wenn kein Schnitt gefunden Ergebnis += lokale Beleuchtung ist globales Beleuchtungsmodell Strahlen vom Auge durch Pixel in die Szene Aufteilung in reflektierten und gebrochenen Strahl Lokale Diffuse Beleuchtung durch nicht verdeckte Lichtquellen Light Buffer beschleunigt Verdeckungstest Beschleunigung durch Hüllobjekte (Quader) Nur Schlagschatten Weiche Schatten z. B. durch Radiosity Halbtransparente Objekte schwierig Keine indirekte Beleuchtung Z. B. über Spiegel Lichtreflexion nur in eine Richtung Sogar Phong-Modell erzeugt ausgedehntes Highlight Lichtquellen, die über Spiegel diffus beleuchten Erster Pass: Lichtstrahlen werden von der Lichtquelle ( rückwärts ) zu interessanten Flächen gesendet und dort vermerkt Zweiter Pass: Normales (Strahlen vom Betrachter zur Szene) wobei diffuse Terme vermerkte Lichtquellen berücksichtigen Spiegelnde Reflexion nicht nur in eine Richtung Strahl wird gestreut Statt infinitesimalem Strahl wird Kegel verwendet Praktisch kaum zu implementieren Phong-Modell? Cone Tracing Ermöglicht Halbschatten, Bewegungsunschärfe und begrenzte Tiefenschärfe Für jedes Pixel 16 Strahlen Stochastisches Antialiasing Jeder Strahl wird bei der Reflexion in der Richtung gemäß seiner Nummer verändert Wichtigkeitsfunktion garantiert Häufung um die Hauptreflexion Zufällige Abweichung ( Jittering ) innerhalb der 16 initialen Subpixel Bei der Reflexionsänderung innerhalb des Intervalls Monte Carlo Integration Wahrscheinlichkeit Richtungsänderung Strahl 12 4
Klassisches -Verfahren unterstützt weder weiche Schatten noch indirekte Beleuchtung Weiche Schatten durch Radiosity-Verfahren oder Distributed Indirekte Beleuchtung durch Backwards Antialiasing beim Distributed oder durch Super Sampling