next up previous contents
Next: Parallelverarbeitung Up: No Title Previous: Patchkörper

Das Zwei-Phasenverfahren

Die grundlegende Idee vom Zwei-Phasen-Verfahren ist, die Vorteile beider Verfahren zu einem zu verbinden. Radiosity-Verfahren bilden gut die diffusen Interreflexionen ab, und die Schwächen liegen bei der gerichteten Reflexion. Beim Ray-Tracing werden genau anders die gerichteten Reflexionen besonders gut abgebildet, und bei den diffusen Interreflexionen wird nur ein ambienter Term eingesetzt.

Zur Zeit sind zwei Phasen Verfahren nur Gegenstand der Forschung und in der Literatur meist nur mit einigen Worten angedeutet.

Ziel ist es eine Radiosity-Iteration durchzufüren und anschließend mit dem Raytracing das Datenmodell anzuzeigen. Dies führt zu dem Vorteil daß durchsichtige und spiegelnde Körper dargestellt werden können. Zum zweiten werden die noch grobe Aufteilung in Patches etwas verschleiert.

Eine einfache Addition der Farbwerte soll nicht implementiert werden, dies ist nicht sinnvoll und gibt nicht alle Effekte wieder.

Wenn nur der einfache Radiosity- Algorithmus angewendet wird führt das dann zu dem Problem daß Radiosity keine durchsichtigen und keine spiegelnden Körper kennt, also wird die Fläche hinter einer durchsichtigen Wand zwar angezeigt aber sie ist dunkel. Das sieht auf jedem Fall unnatürlich aus. Deshalb wird in diesem Programm die Lichtstärkenverteilung angewendet.

Da mit der Lichtstärkenverteilung alle Optischen Eigenschaften berechnet werden können, kann das Licht auch durch durchsichtige Oberflächen scheinen, bei spiegelnden Oberflächen wird es je nach Reflextionsrichtung weitergeleitet. Bei der Lichtstärkenverteilung ist ein Zwei-Phasen Verfahren nicht notwendig, da alle Lichteffekte in die Iteration eingebaut werden können. Die 2 Phasen sind indirekt vorhanden, da erst Iteriert werden muß und dann das Bild angezeigt wird.

Es ist nur noch notwendig das in der zweiten Phase eine Berechnung der Glanzlichter erfolgen muß. Da diese Lichteffekte von dem Standpunkt des Betrachters erfolgt ist es nicht möglich diese in die Iteration aufzunehmen.

Falls eine Kameraanimation erfolgen soll, ist es nicht notwendig die Iteration bei jedem Bild neu durchzuführen. Die Verteilung des Lichtes ist von der Geometrie der Objekte einschließlich der Lichtquellen abhänig, nicht von der Kameraposition.

Algorithmisch sieht die Zusammenfassung der Algorithmen so aus:

void twopass::twopasscalc(void)
{  
  calcradio();  // Lichtverteilung nach Radiosity
  calcray();    // Anzeige nach Raytracing
}
Hinter den Funktionsaufrufen stecken folgende Funktionen:
void twopass::calcray(void)
{
  if (pwelt->observ.opixel)
    pray.raytraceboxR(x1, y1, x2, y2, s, p);
  else
    pray.raytracebox(x1, y1, x2, y2, s);
}

void twopass::calcradio(void)
{
  radios 
    r(x1, y1, x2, y2, s, p, pwelt->teile, pwelt->diff);
  r.verteile();
}
Damit die Einflüsse des Lichtes richtig addiert werden ist der Raytracer erweitert worden. Der Radiosity Algorithmus in diesem Programmsystem ist zur Lichtstärkenverteilung abgeändert worden, so das vom originalen Radiosity nur noch die Iterationsmethode übriggeblieben ist. Die Anzeige der Daten wurden um die Glanzlichter erweitert.

Hier der else-Zweig für die Anzeige der Iteration:

....
  else
    {
      // nur Glanzlichter durchsuchen
      // alle Punktlichtquellen durchsuchen!
      for (lamp = pwelt->lampe; lamp; lamp = lamp->next)
	lc += lamp->get_color_spec(int_point, dir, normal, obj);

      // alle Strahler durchsuchen!
      for (spotp = pwelt->strahler; spotp; spotp = spotp->next)
	lc += spotp->get_color_spec(int_point, dir, normal, obj);

      // alle Licht-Flächen durchsuchen!
      for (lp = pwelt->lichtpolyp; lp; lp = lp->next)
	lc += lp->get_color_spec(int_point, dir, normal, obj);

      if (pwelt->methode != RAYTRACING)
	lc.max(obj->surfaceColRadio(int_point, point, dir));
    }

  if (pwelt->methode == RAYTRACING)
    lc += pwelt->ambient;
...

An dieser Stelle wird der ambiente- Term nicht mehr gebraucht. Er wird nur noch dann verwendet wenn das Bild mittels Raytracing angezeigt wird.

In der vorletzten if Anweisung sieht man deutlich das das zwei-Phasen Verfahren im Raytracer kein Problem darstellt, es wird anstelle des Durchsuchens aller Lichtquellen nur das Objekt gefragt welche Farbe es hat. Das Objekt gibt dann den Farbwert der in der vorherigen Berechnung wieder.

An dieser Stelle ist keine Addition sondern ein Maximalwert notwendig, da eine Glanzstelle die schon Weiß ist nicht Weißer werden kann.


next up previous contents
Next: Parallelverarbeitung Up: No Title Previous: Patchkörper

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