Ich habe eine naive Implementierung eines diffusen / emittierenden Materialpfad-Tracers (Lochkamera) und sehe, dass eine sehr große Anzahl von Abtastwerten pro Pixel erforderlich ist, um zu konvergieren - wie wahrscheinlich in Millionenhöhe - und habe mich gefragt, ob dies für einen "naiven" Pfad-Tracer normal ist Implementierungen?
Hier sind 10.000 Samples pro Pixel:
Und hier ist ein Bild mit 10.000 Seiten pro Sekunde unter Verwendung von kosinusgewichteten Hemisphärenproben als Vergleich:
Für jedes Pixel mache ich das:
- Wirf einen Strahl in die Szene für das Pixel (beginnend in der nahen Ebene, von der Richtung der Kamera bis zur Position des Pixels in der nahen Ebene).
- Wenn ein Objekt getroffen wird, berechne ich eine einheitliche Zufallsrichtung in der durch die Normalen definierten Halbkugel und fahre fort.
- Auf jeder Ebene gebe ich emittierend + (2 * Punkt (normal, bounceRayDir) * ColorFromBounceRay * DiffuseColor / pi) zurück.
- Wenn nichts von einem reflektierten Strahl getroffen wird, kehre ich schwarz zurück.
- Ich arbeite mit 3 Gleitkomma-Farbkanälen, wobei die Absicht ist, dass 0-1 0-255 in der endgültigen Ausgabe uint8 pro Farbkanal entspricht.
- Ich erlaube max. 5 Bounces.
Nachdem ich alle Samples für das Pixel gemittelt habe, konvertiere ich es von HDR zu LDR:
- Für jeden Farbkanal mache ich eine Gammakorrektur: channel = powf (channel, 1.0f /2.2f)
- Ich multipliziere dann den Kanalwert mit 255, klemme ihn von 0-255 und wandle ihn für die endgültige Pixelfarbe auf uint8 um.
Der Quellcode ist hier im Folgenden zu sehen. Es enthält windows.h für Bitmap-Header, hat aber ansonsten keine nicht standardmäßigen Header und keine Bibliotheksabhängigkeiten: https://gist.github.com/anonymous/0dc9f7f5abf15f8fdb9aa84ecfcf67d5