- Bei gleichmäßiger Umgebungsbeleuchtung darf ein zu 100 % reflektierendes Objekt nicht vom Hintergrund zu unterscheiden sein; mit dieser Eigenschaft lässt sich die physikalische Konsistenz eines Renderers schnell überprüfen.
- Ob matt, spiegelnd oder ein Material dazwischen: Wenn es vollständig reflektiert und gleichmäßig beleuchtet wird, muss es genauso wie die Umgebung aussehen und dadurch scheinbar verschwinden.
- Frischer Schnee kann eine Albedo von 90–98 % erreichen; trifft er auf bewölktes Wetter oder Nebel, kann ein Whiteout entstehen, bei dem Himmel und Schnee nicht mehr zu unterscheiden sind.
- Der Test prüft, ob eine BRDF Energie verliert oder erzeugt; in einer grauen Umgebung fällt übermäßige Reflexionsenergie heller auf, wodurch Fehler leichter zu finden sind.
- Eine rein weiße Lambertian-BRDF ist einfach und ihre Energieerhaltung ist klar, daher eignet sie sich als grundlegender Check, um Integrationsfehler wie fehlende Sampling-Verteilungen, Gewichtungen, PDFs oder π- bzw. 2-Faktoren aufzudecken.
Warum ein Objekt bei gleichmäßigem Licht verschwinden sollte
- Wird ein zu 100 % reflektierendes Objekt durch eine gleichmäßige Umgebung beleuchtet, darf es nicht vom Hintergrund zu unterscheiden sein.
- Diese Eigenschaft ist unabhängig davon, ob das Objekt matt, spiegelnd oder aus einem Material dazwischen besteht.
- Wenn das Objekt im Rendering nicht sichtbar ist, ist das ein Hinweis darauf, dass das Ergebnis mathematisch der Erwartung entspricht.
Ähnlicher Fall in der Realität: Whiteout
- Frischer Schnee kann eine Albedo von 90–98 % haben und damit nahezu perfekt weiß sein.
- Kommen bewölktes Wetter oder Nebel hinzu, kann ein Whiteout entstehen, bei dem Schnee und Himmel nicht mehr unterscheidbar sind.
- Dann wirken alle Richtungen gleichmäßig weiß, sodass selbst ein Hang direkt vor einem mit den Augen schwer zu erkennen sein kann.
Prüfung der Energieerhaltung einer BRDF
- Der White-Furnace-Test wird häufig verwendet, um zu prüfen, ob eine BRDF die Energieerhaltung erfüllt.
- Entscheidend ist zu prüfen, ob bei der Reflexion Energie verschwindet oder neu entsteht.
- So lassen sich beispielsweise Probleme erkennen, bei denen ein Material mit zunehmender Rauheit (roughness) dunkler wirkt, oder Situationen, in denen Mehrfachreflexionen nicht mehr vernachlässigbar sind.
- Neben einer weißen Umgebung ist auch eine graue Umgebung nützlich.
- Ist die reflektierte Energie zu hoch, erscheint sie heller als die Umgebung, wodurch der Fehler sichtbar wird.
Wie man die Integration im Renderer überprüft
- Der White-Furnace-Test ist nicht nur für die BRDF selbst wirksam, sondern auch zur Prüfung des Integrationsteils eines Renderers.
- Eine Lambertian-BRDF mit 100 % Albedo erhält Energie vollständig und ist einfach zu implementieren, wodurch sich Implementierungsfehler im Renderer gut aufdecken lassen.
- Mögliche Fehlerquellen gibt es mehrere:
- Sampling-Verteilung
- Sample-Gewichtung
- PDF-Berechnung
- fehlende Faktoren wie π oder 2
- Solche Fehler sind schwer zu finden, weil das Ergebnisbild trotzdem noch plausibel wirken kann.
Fehlbeispiele und Einsatz beim Debugging
- Wenn man einen Path Tracer oder eine Variante davon schreibt, eine pre-convolved Environment Map erstellt oder andere Sampling-Verteilungen testet, ist es hilfreich, zuerst mit einer rein weißen Lambertian-BRDF den White-Furnace-Test zu bestehen.
- Hat die Implementierung diesen Schritt bestanden, kann man ihr bis zu einem gewissen Grad vertrauen und anschließend die BRDF selbst testen.
- Nach einem Kommentar auf Hacker News wurde dem ShaderToy-Beispiel ein Makro namens
SIMULATE_INCORRECT_INTEGRATIONhinzugefügt, mit dem sich ein fehlgeschlagener Test beobachten lässt. - Dieses Makro imitiert fehlerhafte Integrations-Bugs, etwa wenn man vergisst, dass das Halbkugel-Integral 2π entspricht, oder die Sampling-Verteilung nicht berücksichtigt.
- Ist der Bug aktiviert, reflektiert die Kugel nicht die korrekte Energiemenge und wird dadurch auf dem Bildschirm sichtbar.
1 Kommentare
Hacker-News-Kommentare
Ich habe kürzlich anhand des PBR-Tutorials von learnopengl einen physically based Renderer (PBR) implementiert, aber er hat den White-Furnace-Test nicht bestanden.
Dadurch wurde mir klar, dass ich die von mir implementierte Mathematik nicht besonders gut verstanden hatte; und wie der Autor sagt, ließ sich das nicht dadurch passend machen, dass man willkürlich π oder 2 dazumultipliziert.
Es gibt auch Modelle, die gegenseitige Reflexionen zwischen den theoretischen Mikrofacetten berücksichtigen, aus denen die Normalenverteilung einer BRDF besteht, und die sind besser; aber selbst bei ihnen bin ich mir nicht sicher, ob sie diesen Test unverändert bestehen.
Tatsächlich verlieren die meisten der verbreitet eingesetzten Modelle Energie, und in manchen Fällen wird zur Korrektur noch eine Lookup-Tabelle über die BRDF gelegt.
Es ist interessant, dass dieser Artikel auf HN oben gelandet ist. Tatsächlich gibt es zwei Furnace-Tests; der andere ist ein Test, bei dem unter der Bedingung von 0,5 Emission und 0,5 Albedo als Ergebnis 1,0 herauskommen muss, abgesehen von Fehlern durch verrauschte Pixel.
Vor langer Zeit wurde in https://graphics.stanford.edu/~boulos/papers/brdftog.pdf versucht, Energieerhaltung gegen Reproduzierbarkeit von Daten einzutauschen und dafür Reziprozität aufzugeben.
Am Ende hat sich kaum jemand groß darum gekümmert, Materialdaten automatisch aus BRDFs anzupassen; und selbst wenn Interesse bestand, bevorzugte man eher symmetrische und ausreichend konservative BSDFs.
Auch spätere Forschung hat überwiegend diese Richtung verbessert, zumal Verfahren wie bidirektionales Path Tracing ziemlich seltsam werden, wenn man die Symmetrie bricht.
Ich frage mich, warum im Namen des Tests furnace vorkommt. Das Grundkonzept verstehe ich, aber der Name wirkt ziemlich willkürlich; ich frage mich, ob es dafür eine Begründung gibt.
Auch hier ist das Konzept ähnlich: Ein Objekt ist in einem Hohlraum mit gleichmäßigem Emissionsspektrum eingeschlossen. Nur handelt es sich in diesem Fall nicht um einen schwarzen, sondern um einen weißen Körper.
Zufällig ist mir vor ein paar Tagen in den YouTube-Empfehlungen ein Video zu diesem Thema aufgetaucht; es ging um den geplanten Blender-4.0-Release.
In die BSDF kommt eine neue Multiscatter-GGX-Funktion; das Video geht deutlich tiefer ins Detail und zeigt viele Beispiele.
https://www.youtube.com/watch?v=v6qXbV_Q7z4
Ich weiß nicht, wie das eingebettete ShaderToy eigentlich aussehen soll. Wenn ich auf Play drücke und warte, passiert über eine Minute lang nichts.
Schon ein paar Screenshots fehlgeschlagener Tests würden den Artikel deutlich besser machen.
Danach erscheinen die rote und die blaue Kugel erneut, und auf der mittleren Kugel ist etwas wie eine Reflexion zu sehen; die mittlere Kugel „verschmilzt“ aber mit dem Hintergrund, sodass sie kaum noch als Kugel zu erkennen ist.