Ich werde die einfache / naive / Brute-Force-Antwort auf diese Frage geben, die funktioniert und genaue Ergebnisse liefert.
Es gibt jedoch bessere Antworten, die die Konvergenz des Renderings mit weniger Samples beschleunigen, aber fortgeschrittenere Mathematik verwenden. Ich hoffe, dass jemand anderes eine Antwort in diese Richtung gibt.
Die einfache Antwort lautet: Flächenlichter sind nur Geometrien, die einen Emissionswert haben.
Zum Glück ist es ziemlich einfach, der Pfadverfolgung Unterstützung für emittierende Werte hinzuzufügen.
Wie Sie wissen, ist die Lichtmenge, die auf ein Pixel zusteuert, die Lichtmenge, die die Oberfläche verlässt, die ein Strahl auf diesem Pixel schneiden würde.
Das wird rekursiv berechnet, indem man sieht, wie viel Licht auf diesen Punkt trifft, das BRDF integriert, mit dem Kosinus und dem ganzen Jazz multipliziert.
Zu diesem Ergebnis wird nur eine emittierende Beleuchtung hinzugefügt. Was auch immer Sie jetzt als "ausgehendes Licht" von einer Oberfläche haben, fügen Sie einfach die emittierende Farbe dieser Oberfläche hinzu. (Optional können Sie auch etwas Ähnliches wie die Texturabbildung ausführen und die Emissionswerte über das Objekt variieren lassen, möglicherweise basierend auf einer Textur.)
Das ist alles, es ist sehr einfach und leicht.
In der folgenden Rendering-Gleichung L.e(ωÖ)stellt den emittierenden Term dar (dafür steht das e, emittierend), und der Rest der Gleichung ist das über der Hemisphäre integrierte Licht. Sie können sehen, dass Sie dem Ergebnis, das Sie als ausgehendes Licht von einem Punkt aus zurückgeben, nur den Emissionsgrad hinzufügen (L.Ö(ωÖ)), um diese emittierende Beleuchtung anzuwenden.
L.Ö(ωÖ) =L.e(ωÖ) +∫Ωf(ωich,ωÖ)L.ich(ωich) (ωich⋅ n ) dωich
Weitere Informationen zu einem einfachen Pfad-Tracer mit Flächenbeleuchtung finden Sie unter diesem Link, der auch C ++ - Quellcode kommentiert hat.
http://blog.demofox.org/2016/09/21/path-tracing-getting-started-with-diffuse-and-emissive/