Kann mir jemand Radiosity Lighting erklären?


8

Ich habe bereits die Grundlagen der Umgebungsokklusion verstanden. Ich habe einen Raycaster und bin in der Lage, gleichmäßig Strahlen über eine Hemisphäre zu schießen. Es scheint, dass dies die Grundlagen dessen sind, was für Radiosität benötigt wird, aber ich weiß nicht, wohin ich von dort aus gehen soll. Finde ich, wie viel Licht von jedem Gesicht kommt? (Ich mache mein Spiel aus Würfeln wie Minecraft.) Was mache ich danach?


3
Warum das Tag "Minecraft"?
Valmond

Antworten:


9

Das ist in der Tat alles, was Sie für Radiosität brauchen. Es gibt zwei verschiedene (aber gleiche) Formulierungen. Die erste besteht darin, Licht von jedem Patch (in Ihrem Fall wahrscheinlich von einem Gesicht) zu "strahlen" oder abzuschießen, und die andere darin, Licht in jeden Patch zu "sammeln" oder zu empfangen. Wenn Sie dies iterativ oft genug tun, werden Sie neugierig.

Der erste Schritt besteht darin, herauszufinden, woher das Licht stammt, da bei beiden Methoden eine Lichtquelle vorhanden sein muss. Wenn Sie die Sammelmethode durchführen möchten, muss ich Sie warnen, dass Punktlichter nicht sehr gut funktionieren. Sie müssen Flecken mit Licht besäen (separat berechnen), sonst erhalten Sie ungerade Ergebnisse. Bei der Strahlungsmethode senden Sie wie gewohnt von den Punktlichtern aus, ignorieren sie jedoch als Empfänger von anderen Patches.

Sie können nach einer beliebigen Anzahl von Bounces (oder Iterationen) anhalten. Je mehr Sie jedoch tun, desto besser ist die Lösung. Die Patch-Erstellung ist einfach, da Sie jede Seite Ihrer Cubes als Patch betrachten können. Wenn Sie etwas Detaillierteres wünschen, können Sie diese Gesichter noch weiter unterteilen.

In einem strahlenden Beispiel könnte dies als Grundlage für Ihre Schleife verwendet werden:

while(!done) {
   foreach Patch a {
     a.shootRays(n);
     foreach ray r {
       Patch b = r.firstIntersectingPatch();
       float modifier = 1 / ((distance(a,b)^2)
       b.incidentLight += (a.exidentLight / n) * modifier; 
     } 
   }
  foreach Patch a {
    float modifier = a.absorption;
    a.exidentLight = (a.incidentLight * modifier) + a.emission;
    a.incidentLight = 0;
  }

  done = goodEnough() ? true : false;
}

Für eine Sammelmethode hätten Sie die etwas andere erste Schleife:

      foreach Patch a {
         a.shootRays(n);
         foreach ray r {
           Patch b = r.firstIntersectingPatch();
           float modifier = 1 / ((distance(a,b)^2)
           a.incidentLight += b.exidentLight * modifier; 
         } 
         a.incidentLight /= n;
       }

Der erste Modifikator wird für die Modifikation des einfallenden Lichts pro Patch verwendet. Die häufigste Verwendung wäre ein Abfallen aus der Entfernung, wie ich es oben getan habe. Der zweite Modifikator dient zur globalen Modifikation der einfallenden lichtähnlichen Materialabsorption. Die Variable a.emission wäre für die meisten Patches 0.

Nur diejenigen, die Lichtquellen sind (oder direkt von Punktlichtquellen beeinflusst werden, wenn Sie eine Sammelmethode wie oben angegeben verwenden), sollten Emissionswerte ungleich 0 haben.

Die Funktion goodEnough () kann viele Dinge sein. Es könnte nur die Anzahl der Iterationen zählen, oder es könnte sich um die Gesamtlichtmenge in der Szene handeln, oder es könnte sich um einen anderen Test handeln, den Sie entwickeln. Dieser Teil liegt ganz bei Ihnen und was Sie denken, sieht gut genug aus, endet aber in angemessener Zeit.

Je mehr Strahlen Sie aufnehmen, desto genauer ist Ihre Lösung, aber desto langsamer ist der Prozess. Gleiches gilt für die Anzahl der Patches und die Anzahl der Iterationen durch die Schleife. Wie Sie den endgültigen Lichtwert speichern, liegt bei Ihnen. Es könnte in einer Textur vorliegen oder als Wert in Ihren Cubes gespeichert sein, aber ich denke nicht, dass dies mit einer anständigen Anzahl von Patches in Echtzeit möglich wäre.


Hallo Chewy. Funktioniert das wirklich? Ich bin mir ziemlich sicher, dass es Lamberts Kosinusgesetz berücksichtigen sollte. Aber vielleicht bekomme ich nichts.
Notabene

1
Es kann so genau werden, wie Sie möchten. Die Winkel zwischen den Patches können zusammen mit einer beliebigen Anzahl anderer Phänomene mit dem ersten Modifikatorwert berücksichtigt werden. Dies ist nur der allgemeine Überblick darüber, was passiert.
Chewy Gumball

OK. Sehr schön. Dies ist das erste Mal, dass ich von Radiosität im Ray Casting höre. Aber es macht vollkommen Sinn. Danke dafür.
Notabene

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.