- 均一な環境光の下では、100%反射する物体は背景と区別できないはずであり、この性質によってレンダラーの物理的一貫性をすばやく検証できる
- 拡散反射、鏡面反射、その中間の材質であっても、完全反射で均一に照らされていれば環境と同じに見え、消えたように見えるはず
- 新雪のアルベドは**90〜98%**まで高くなることがあり、曇天や霧と重なると、空と雪の区別がつかないホワイトアウトが起きることがある
- このテストはBRDFがエネルギーを失ったり生成したりしていないかを確認するもので、グレー環境では過剰な反射エネルギーがより明るく現れるため、エラーを見つけやすい
- 純白のLambertian BRDFは単純でエネルギー保存が明確なため、サンプリング分布・重み・PDF・πまたは2の係数抜けといった積分バグをあぶり出す基本チェックとして有用
均一な光の中で物体が消えるべき理由
- 100%反射する物体が均一な環境で照らされている場合、その物体は背景と区別できないはず
- この性質は、物体が拡散反射なのか、鏡のように反射するのか、あるいはその中間の材質なのかに関係しない
- レンダリング結果で物体が見えないなら、数学的に期待される結果と一致しているというサインになる
現実に近い例:ホワイトアウト
- 新雪のアルベドは**90〜98%**まで高く、ほぼ完全な白に近い場合がある
- 曇天や霧が重なると、雪と空の区別がつかないホワイトアウト状態が発生する
- このとき、あらゆる方向が均一な白のように見え、目の前の斜面でさえ目で判別しにくくなることがある
BRDFのエネルギー保存を確認する
- ホワイトファーネステストは、BRDFがエネルギー保存を満たしているかを確認するためによく使われる
- 反射過程でエネルギーが消えたり新たに生まれたりしていないかを確認することが核心
- たとえばroughnessが増えると材質がより暗く見える問題や、相互反射が無視しにくいレベルになる状況を確認できる
- 白い環境だけでなく、グレー環境も有用
- 反射エネルギーが過剰だと周囲より明るく現れ、エラーが露呈する
レンダラーの積分実装を点検する方法
- BRDFそのものだけでなく、レンダラーの積分部分を点検する際にもホワイトファーネステストは効果的
- アルベド100%のLambertian BRDFはエネルギー保存が完全で実装も単純なため、レンダラー実装のバグをあぶり出しやすい
- 問題が起きうる箇所はいくつもある
- サンプリング分布
- サンプルの重み
- PDF計算
- πまたは2のような係数の抜け
- こうしたエラーは、結果画像がなおもっともらしく見えることがあり、見つけにくい
失敗例とデバッグでの活用
- path tracerやその派生を作成する場合、pre-convolved environment mapを作る場合、別のサンプリング分布を試す場合には、まず純白のLambertian BRDFでホワイトファーネステストを通す方法が有用
- この段階を通過すれば、実装をある程度信頼したうえでBRDF自体をテストできる
- Hacker Newsのコメント後、ShaderToyの例にはテスト失敗を確認できる
SIMULATE_INCORRECT_INTEGRATIONマクロが追加された
- このマクロは、半球積分が2πに相当することを忘れたり、サンプリング分布を考慮しなかったりするような誤った積分バグを模倣する
- バグが有効になると、球が正しい量のエネルギーを反射できず、画面上に見えるようになる
1件のコメント
Hacker News のコメント
最近 learnopengl の PBR チュートリアルに沿って 物理ベースレンダラー(PBR) を実装したのですが、ホワイトファーネステストに合格しませんでした。
そのおかげで、自分が実装した数学をあまり理解できていなかったことに気づき、筆者が言うように π や 2 を適当に掛けるだけでは辻褄が合いませんでした。
BRDF となる法線分布を構成する理論上の微小面同士の相互反射を考慮するモデルもあり、そのほうが優れてはいますが、それらでさえこのテストをそのまま通過するかは確信しにくいです。
実際、広く使われているものの多くはエネルギーを失っており、それを補正するために BRDF の上にルックアップテーブルを載せて使うケースもありました。
HN のトップにこの記事が上がっているのが面白いです。実際にはファーネステストは 2 種類あり、もう一つは 0.5 の発光と 0.5 のアルベドという条件で、ノイズピクセルの誤差を除いて結果が 1.0 になるべき、というテストです。
かなり前に https://graphics.stanford.edu/~boulos/papers/brdftog.pdf で、エネルギー保存とデータの再現性を天秤にかけ、その代償として相反性を諦める試みをしました。
結局、BRDF から材質データを自動的に合わせ込むことには誰も大きな関心を持たず、関心があったとしても対称的で十分に保存的な BSDF のほうが好まれました。
その後の研究も大半はそちらの改善に向かい、特に対称性を崩すと双方向パストレーシングのような手法がかなりおかしくなります。
テスト名になぜ furnace が入っているのか気になります。概念全体は理解できますが、名前はかなり恣意的に感じられるので、根拠のある名前なのか知りたいです。
ここでも概念は似ていて、物体が均一な放射スペクトルを持つ空洞の中に閉じ込められています。ただしこの場合は黒体ではなく白です。
ちょうど数日前、YouTube のおすすめにこのテーマを扱う動画が出てきました。予定されていた Blender 4.0 リリースの内容でした。
BSDF に新しい Multiscatter GGX 関数が入り、かなり深く掘り下げており、例もたくさん示しています。
https://www.youtube.com/watch?v=v6qXbV_Q7z4
埋め込まれた ShaderToy が本来どう見えるべきなのか分かりません。再生を押して待っても、1 分以上何も起きません。
失敗したテストのスクリーンショットが数枚あるだけでも、記事はずっと良くなると思います。
その後、赤い球と青い球が再び現れ、中央の球には反射のようなものが見えますが、中央の球が背景に「溶け込んで」球だと分かりにくくなります。