next up previous contents
Next: Formfaktoren Up: Computergrafik Previous: Raytracing

Radiosity

Radiosity ist eines der jüngsten Algorithmen (1984) der Computergrafik und erzeugt sehr realistische Bilder.

Dieses Verfahren simuliert keine Halbschatten, wie es allen anderen Verfahren gleich ist, sondern rechnet die Energie, wie sie in den Hauptsätzen der Thermodynamik beschrieben sind.

,,Die Energiesumme in einem abgeschlossenen System, dem weder Energie zugeführt noch entzogen wird, ist konstant.''

,,Die Radiosity einer Fläche ist die Energie, die diese Fläche verläßt, bezogen auf den Flächeninhalt.''

math215

Um die Lichtmenge einer Fläche zu berechnen, reicht es nicht aus, die Sichtbarkeit aller Flächen zu testen und dessen Lichtmengen zu addieren.

Denn die nach dieser Methode berechnete Fläche strahlt wiederum Licht aus. Dieses Licht beeinflußt die anderen Flächen, welche Ausgangsgrößen für die Berechnung waren. Die Flächen sind voneinander linear abhängig.

Durch diese Abhängigkeit kann ein Gleichungssystem aufgestellt werden; also n Gleichungen mit n unbekannten Größen.

math222

E ist ein n-dimensionaler Vektor, der aller Emmisionen tex2html_wrap_inline1453 beinhaltet; B sind die Energien tex2html_wrap_inline1453 , und A sind die Therme tex2html_wrap_inline1457 .

Durch Umstellen nach:

math226

könnte das Gleichungssystem gelöst werden. Es gibt Bibliotheken, in denen solche Verfahren fertig zur Verfügung stehen. Allerdings ist vorher der Aufwand abzuschätzen. Dieses Gleichungssystem wird durch Näherungsverfahren gelöst. Hier ist es nicht notwendig, das Gleichungssystem so exakt wie möglich zu lösen. Um eine schnelle Anzeige zu bekommen ist es sinnvoll, so exakt wie nötig zu rechnen.

Um das Geichungssystem mit so wenig wie möglich Aufwand lösen zu können, existiert eine iterative Lösung. Bei der hier vorliegenden Radiosity- Implementation wird wie folgt vorgegangen:

  1. Fläche mit der größten zu verteilenden Energie suchen,
  2. Formfaktoren berechnen,
  3. entsprechend der Formfaktoren verteilen,
  4. Gesamtsumme bilden,
  5. ist Abbruchkriterium erfüllt, dann Abbruch,
  6. von vorn beginnen.

Dieses Verfahren ist als progressive radiosity bekannt. Es wurde 1988 erstmals veröffentlicht.

Bei der Verteilung der Formfaktoren ist zu beachten, daß tex2html_wrap_inline1459 und dementsprechend bei der Verteilung der Faktor tex2html_wrap_inline1461 ist, wobei n die Anzahl der Formfaktoren ist.

Bei der Computergrafik wird nicht die Energie des Flächenstückes gebraucht sondern der Farbwert als rgb Tripel. Daraus folgt, daß die Energie eigentlich aus drei Werten, getrennt für Rot, Grün und Blau besteht. In jedem Patch ist die Energie als Faktor und als Farbe enthalten. Ein Patch strahlt die Farbe C mit der Energie E mit der Reflektivität r aus. Bei einem Formfaktor von ff ergibt sich die Farbe des Empfängers aus

displaymath1441

Für die iterative Lösung wurden verschiedene Abbuchkriterien festgelegt. Zum einen wurde eine Schranke für die Anzahl der Iterationen eingebaut, damit der Algorithmus auch im Fehlerfall endlich wird. Die zweite und die wichtigste Abbruchbedingung ist die noch zu verteilende Energie. Wenn die gesamte Energie, die noch zu verteilen ist, auch für nur ein Flächenstück so klein ist, daß es zu keiner sichtbaren Veränderung der Farbe kommt, braucht nicht weitergerechnet werden. Die dritte Abbruchbedingung ist die noch zu verteilende Gesamtenergie der Szene, sie muß nach jeder Iteration kleiner werden. Wird die Energie mehr, so ist im Algorithmus ein Fehler. Hier ist zu beachten, daß die Energie eines Patches durchaus schwanken kann, die Energie wird mehr, wenn es aufgehellt wird. Hier ist zu beobachten, daß sich die Abnahme der Energie mit dem Ansteigen der Iterationschritte immmer weiter abnimmt. Die Schleife sieht als Quellcode etwa so aus:

do
{
  patree = maxenergie(ptree, &env, &esumm, &mobj);
  verteile_groesstes(patree, env, mobj);
   
  konv = esumm <= (esummo+ABBEPS); // Konvergiert?
  de = esumm - esummo;
  esummo = esumm;

  anz++;  // Maximale Anzahl
  if (anz == 1) konv = true;  // nur beim Start
  if (!(z%AUSGABE))
    cout << "I: " << anz << " sum= " << esumm 
         << " de = " << de << "\n" << flush;
  z++;
  
} while 
(!( (env < ABBEPS) || (anz >= abbanz) || !konv));

cout << "Iteration beendet!\n";

Auf die Radiosity-Iteration soll jetzt nicht weiter eingegangen werden, da diese in diesem Programm nicht implementiert ist. Zu den Formfaktoren soll hier nocht etwas geschrieben werden, auch wenn diese in der Lichtstärkenverteilung nicht implementiert sind, ist es wichtig zu verstehen warum diese bei der Radiosity-Iteration benötigt werden.


next up previous contents
Next: Formfaktoren Up: Computergrafik Previous: Raytracing

Helmut Fahrion
Sun Apr 13 15:58:19 GMT 1997