prev up inhalt next


20.1.4 Schrittweise Verfeinerung

In Anbetracht des hohen Aufwands beim bisher beschriebenen Radiosity-Algorithmus stellt sich die Frage, ob man die Ergebnisse der Beleuchtungsberechnung inkrementell approximieren kann. Die Auswertung der i -ten Zeile des Gleichungssystems liefert eine Schätzung für die Strahlung Bi des Flächenelements, die auf den Schätzungen für die Strahlungswerte der anderen Flächenelemente basiert. Jeder Term in der Summe der Gleichung beschreibt die Auswirkung des Elements j auf die Strahlung des Elements i :

BjBi = BjFijj .

Diese Methode ``sammelt'' also das Licht der restlichen Szene ein. Der Ansatz zur schrittweisen Verfeinerung verteilt dagegen die Strahlung eines Flächenelements auf die Szene. Dazu bietet sich die Anpassung obiger Gleichung zu

BiBj = BiFjij .

an. Wenn man eine Schätzung für Bi hat, kann man den Beitrag des Flächenelements i zum Rest der Szene ermitteln, indem man vorstehende Gleichung für jedes Element j auswertet. Dazu braucht man leider Fji für alle j . Jeder dieser Werte wird mit einem separaten Halbwürfel bestimmt. Dies erfordert ebensoviel Aufwand an Speicherplatz und Rechenzeit wie der ursprüngliche Ansatz. Man kann die Gleichung jedoch umschreiben, wenn man die Reziprozitätsbeziehung berücksichtigt.

BiBj = BiFijj .

Zur Auswertung dieser Gleichung für alle j sind nur die Formfaktoren nötig, die mit einem einzigen Halbwürfel um das Flächenelement i berechnet wurden. Kann man die Formfaktoren des Elements i schnell berechnen (z.B. mit z -Puffer-Hardware), kann man sie wieder löschen, sobald die Strahlungen vom Flächenelement i aus berechnet sind. Man muß also immer nur einen einzigen Halbwürfel und dessen Formfaktoren gleichzeitig berechnen und speichern.
Sobald die Strahlung eines Elements verteilt wurde, wählt man ein anderes Element aus. Ein Element kann wieder Strahlung verteilen, sobald es neues Licht von anderen Elementen erhält. Dabei wird nicht die gesamte geschätzte Radiosity des Elements i verteilt, sondern nur der Betrag Bi , den das Element i seit dem letzten Verteilen empfing. Der Algorithmus läuft so lange weiter, bis die gewünschte Genauigkeit erreicht ist. Es ist sinnvoll, das Element mit der größten Differenz zu nehmen, statt die Elemente in zufälliger Reihenfolge auszuwählen. Man wählt also das Element, das noch am meisten Energie abzustrahlen hat. Da die Strahlung pro Flächeneinheit gemessen wird, wählt man ein Flächenelement, bei dem BiFi maximal ist. Am Anfang gilt für alle Flächenelemente Bi = Bi = Ei . Dieser Wert ist nur bei Lichtquellen ungleich Null.

Im folgenden bezeichnet Bi also die noch nicht verteilte Strahlung, d.h. die Differenz zwischen der Radiosity im letzten und im gegenwärtigen Iterationsschritt. Es wird ausgenutzt, daß gilt Fji = (Fij · Fi)/Fj .


for i:= 1 to n do                     { initialisiere }
     if patch i ist Lichtquelle                { für jede Fläche }
          then Bi := Bi := Emissionswert           { Strahlung und Differenz }
          else Bi := Bi := 0
end;

repeat
     for {jede Fläche i, beginnend bei der mit der größten Ausstrahlung} do begin
          Plaziere Hemicube auf Fläche i
          Berechne Fij für alle 1 j n
          for j := 1 to n do begin           {für jede Fläche j tue}
               R : = *Bi*Fij*Fi/Fj      { Strahlung von Fläche i }
               Bj : = Bj + R      { Differenz erhöhen }
               Bj : = Bj + R      { Strahlung erhöhen }
          end;
          Bi : = 0 ;           { Überschuß ist verteilt }
     end
until fertig                     { bis zur Konvergenz }

Bei jeder Ausführung der äußeren FOR-Schleife verteilt ein weiteres Flächenelement seine unverbrauchte Strahlung auf die Szene. Daher werden nach der ersten Ausführung nur die Flächen beleuchtet, die selbst Lichtquellen sind sowie solche, die beim Verteilen der Strahlung des ersten Elements direkt beleuchtet werden. Rastert man am Ende jeder Ausführung des Codes ein neues Bild, so wird das erste Bild relativ dunkel und die nachfolgenden Bilder immer heller.


prev up inhalt next