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.''
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.
E ist ein n-dimensionaler Vektor, der aller Emmisionen
beinhaltet; B sind die Energien
, und A sind die Therme
.
Durch Umstellen nach:
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:
Dieses Verfahren ist als progressive radiosity bekannt. Es wurde 1988 erstmals veröffentlicht.
Bei der Verteilung der Formfaktoren ist zu beachten, daß und dementsprechend bei der Verteilung der Faktor
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
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.