Flächenlichter in der Pfadverfolgung

7

Ich habe die Scratchapixel- Raytracing-Tutorials online verfolgt, in denen die Theorie hinter allem und deren Implementierung hervorragend erklärt wurde. Ich habe jedoch den Punkt erreicht, an dem ich Area Lights implementieren möchte, aber ich weiß nicht, wie ich das machen soll. Das Tutorial auf der Website wurde noch nicht hochgeladen (obwohl es einen Platzhalter-Link mit einigen anderen gibt).

In Bezug auf die Implementierung ist nicht viel online, daher hat mich dies hierher geführt. Könnte jemand bitte erklären, wie ich Flächenlichter mit Ray Tracing im Gegensatz zu Punktlichtern implementieren kann ?

Geben Sie hier die Bildbeschreibung ein

Arjan Singh
quelle
Nur überprüfen ... das ist Raytracing richtig, nicht Pfadverfolgung?
Alan Wolfe
Ich wollte Path Tracing sagen, wird den Titel ändern.
Arjan Singh

Antworten:

7

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 Le(ωo)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 (Lo(ωo)), um diese emittierende Beleuchtung anzuwenden.

Lo(ωo)=Le(ωo)+Ωf(ωi,ωo)Li(ωi)(ωin)dωi

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/

Geben Sie hier die Bildbeschreibung ein

Alan Wolfe
quelle
Tolle Antwort, das hat wirklich alles geklärt, obwohl ich ein wenig vom Thema abkomme. Würdest du gute Ressourcen zur Implementierung der Schärfentiefe kennen?
Arjan Singh
1
Nein, tut mir leid, aber ich bin auch interessiert. Stellen Sie eine andere Frage IMO!
Alan Wolfe
Wie berechne ich die Lichtrichtung für die Verwendung in einem Ray Tracer, um zuerst die direkte Beleuchtung zu berechnen? Muss ich das überhaupt tun? Ich bin hier wenig verwirrt.
Arjan Singh
Das musst du nicht tun, nein. Sie schießen nur zufällige Strahlen in die Hemisphäre, und einige von ihnen treffen das Licht, andere nicht. Es gibt Techniken, um Strahlen direkter auf die Lichter zu schießen, während die Wahrscheinlichkeit berücksichtigt wird, dass Sie sie zufällig ausgewählt haben (damit das Bild gleich aussieht), aber es ist nicht erforderlich, nein.
Alan Wolfe
Ich bin immer noch sehr verwirrt (tut mir leid), aber würde dies nicht nur für indirekte Beleuchtung und nicht für direkte Beleuchtung funktionieren? Könnten Sie Ihrer Antwort einen Code hinzufügen, um dies klarer zu veranschaulichen? Ich habe mir die Quelle für den Pfad-Tracer im Blog-Beitrag auf GitHub angesehen, konnte aber nicht verstehen, was los war.
Arjan Singh