Skip to main content

マルチスキャタリングの誤解

7月

10, 2020

by coberst


テック

物理ベースレンダリング向けに独自の最先端のマルチスキャタリング、GGX BRDF(双方向反射率分布関数)を作成しましょう。

もちろん、これらはすべて数学と物理の知識を使って洗練された解決方法を作り出す非常に賢い人たちによって、作成されたことがあるものです。 資料をたくさん読んで似たような結果を達成したい場合は、以下の素晴らしい記事を読んでみてください。

しかし、このような資料を読むのはすべて飛ばして、簡単にしようと思います。 準備はいいですか?

すべての相関するSmith修正つきの現代GGXの基本から始めましょう。 以下の画像の連続は、ディズニーのBRDFエクスプローラ環境照明モードで生成されました。 通常のパラメータ表示 alpha = 粗さ2乗を使用した0.3から0.9の様々な粗さのメタリックなGGXを示しています。

粗さの度合いが高いときに素材が暗く見えすぎることに注目してください。 また、賢い人たちはこの問題を解決するために苦労して作業しました。

上の画像を以下と比較してみましょう。Kulla/Conty’s Multiscattering GGX BRDF

修正しました!

これで、この解決方法が機能するかを試すことができます。 計算はすでにしてあるので、たぶんするべきでしょう。 他の関連した問題を理解するのに興味深く、役立つものでもあります。 しかし、それはここではすべて飛ばすことを覚えておいてください。

最初から始めましょう。 なぜ私たちはPBR(物理ベースレンダリング)のほうを好むのでしょうか? それは、私たちが物理学が好きだからではありません(少なくとも、私は好きではありません)。 そして、もし物理学に深いこだわりがあるなら、画像パイプラインの端から端までにおいてはもっと深刻な罪を確実に犯していることを考慮すると、これは小さなエラーです。

コンピュータグラフィックスは、予測レンダリングではありません。 リアリズムのために物理学を模倣しているのではありません。それが目標ではありません。 きれいな絵を描こうとしているのです。

きれいな絵を作成するために物理学を模倣することでワークフローがより簡単になることに気づきました。照明から素材を非干渉化し、ハックとパラメータの数を減少させ、現実の素材のライブラリを使用できるようになどしました。

どうやって進めるかについての決定をするとき、技術的なことよりも先に芸術的なことを考えなければなりません。 もし、芸術的な問題を認識できたとしたら、それから技術的な解決方法があるかを見るために物理に照らし合わせます。 当社の現在のBRDFでは、問題は素材パラメータが直交であればそれはいいことで、粗さを変更するにしたがって色が濃くなることは理想的ではありません。

それでは、物理学がどのように役立つのでしょうか? このように色が黒くなることは、物理的に正しいことなのでしょうか? どうやってテストをするのでしょうか? 炉に入ってください! 当社のGGXコーティングされたメタリックなオブジェクトを均等に照明で照らされた環境に置いて、何が起きるか見てみましょう。

照明が表面に当たると、マイクロファセット(微細表面)に当たります。 マイクロファセットは、フレネルによると照明の一部を反射し、一部は取り消されます。 もし、この表面が金属であることを仮定しているとすれば、物理学は表面の「内側」に行く屈折光線は吸収され、決して外に出ることはないと言うでしょう(熱に変換されるため)。

エネルギーの一部が吸収されるので、炉の中でさえも当社のメタリックなオブジェクトには色がついていることは妥当なことです。 しかし、マイクロファセットを取り出して、照明のすべてを吸収なしで常に反射するようにしたら、どうでしょうか?

これは、f0 を 1 に設定する必要があるという意味です(フレネルは、マイクロファセットがどれだけの照明を散乱させるかをコントロールすることを覚えておいてください)。 やってみて、どうなるか見てみましょう。

オブジェクトは、まだ白くありません。 何かが間違っています! ここで、詮索好きな読者は「それが間違っていることをどうやって知るんだ?もしかすると、特定の方向は、他の方向よりも照明をより多く散乱させるのか」と言うかもしれません。 正しい解決方法を直感するのは必ずしも簡単なことではありません。

かわりに、手始めにカメラから照明のパスがどんな風に見えるかを考慮しましょう。 それは、マイクロファセットの1つか複数に当たり、跳ね返り、そして最終的に逃れて、与えられた一定のエネルギーを常に放射する炉の環境と結合します。

では、どれだけのエネルギーがカメラに到達するべきでしょうか? 全部です! なぜなら、設定に基づくと、どれだけのマイクロファセットに到達しようともすべてのエネルギーは反射されるべきだからです。 すべての照明のパスは、最終的にカメラに通じます。

それが上の画像が完全に白であるべき理由です。 そうではないので、計算に問題があるに違いありません。

もし、BRDFを学んだことがあれば、マイクロファセットモデルにおいて、どのマイクロファセットが他から遮断されるかの雛形となる幾何減衰可視機能があることをご存知でしょう。 一般的に私たちが雛形にしないのは、これらの遮断そのものがマイクロファセットであるという事実であり、光は跳ね返り、最終的には破棄されることなく外に出るべきだからです。

これがマルチスキャタリングがモデルと修正の雛形となるもので、もしもKullaとContyのGGXを炉に入れたら、粗さに関わらず完全に反射する素材のためのまったく退屈でまったく正しい白い画像を生成します。

しかし、Kullaのモデルはシンプルではなく、数多くの場合においてはそのような小さな問題のために使う価値がありません。 では、さらに解決方法を簡素化することはできるのでしょうか? 特定の粗さと表示角度(また f0=1に固定)に対してBRDFが炉の中でどれだけの光を放射するかを知っていたらどうでしょうか? その値をただ取って、それでBRDFを正常化させることができるでしょうか?

ネタバレ注意: できます。簡単に。 人気のある分割合計画像ベース照明概算で使われる最もモダンなエンジンの検索テーブルにこの「炉」の値がすでにあります。

分割合計テーブルは、「炉の中にあるBRDF」(方向性反射光線、または方向性半球反射率としても知られる)をスケールとバイアス(追加)係数をフレネル f0値に適用するところに行きつきます。

私たちの場合、 f0=1を考慮して正常化させたいので、BRDF突起を縮尺するだけで bias(roughness,ndotv) + scale(roughness,ndotv)より1上にします。 これが結果です。

高い粗さでエネルギーが返ってきていて、もしこれを炉の中でテストしたら、白くなるでしょう。正しく f0=1で。 しかし、それはKullaのとも違います。 特に、粗い素材では色の彩度はそれほど高くなりません。 なぜでしょうか。 また、もしもこの問題をすでに学んだことがあるなら(ずるしたな!)、もう答えはご存知でしょう。

適切なマルチスキャタリングは、表面から逃れる前に照明がさらに多くのマイクロファセットに当たるにつれて彩度を加え、さらに多くの色(物理的な力で色を上げることで、さらに彩度を高くする結果となります)を拾います。 これが物理的には間違っているのに、当社のテストではなぜ正しくなっているのでしょうか?

この追加の彩度を模倣しないことで、まだエネルギーを節約していますが、BRDF パラメータの意味を変えてしまいました。 私たちの「無知」なマルチスキャタリングBRDFでの f0 の「意味」は、Kullaのとは同じではないのです。 これは、違った反射率という結果になりますが、BRDFそのものは依然としてエネルギーを節約しています。 それは単に違うパラメータ化です。

最も重要なことは、それはさらにいいパラメータ化であるといえます! 目的を思い出してください。 物理学のために物理学を使うのではなく、制作の助力にするために使っているのです。

アーティストが粗さの高いBRDFを人工的に「明るくする」必要がなくなるように、パラメータをより直交にすることが好ましいです。 もし、私たちが「もっと正しい」解決法(それについてはNarkowiczによるこの最近の記事が素晴らしい読み物です)を使うなら、違う依存性を追加して、素材を暗くするかわりに粗さがそれらの彩度(これは本来の目的にはそぐわない)を高めます。 これがより望ましい状況をいくつか想定できると思いますが、これはほぼ常に使用例においては間違いであると言えます。

もし、彩度の追加を模倣したかったら、いくつか簡単な方法があります。 また、最も「無知」(シンプル)なものを選ぶことで、BRDFを1+f0*(1/(bias(roughness,ndotv) + scale(roughness,ndotv)) – 1)にただスケールすることができます。その結果は以下の通りになります。

ここで、だんだんKullaの解決方法に近づいてきました。 もし、どうしてKullaの概算のほうがいいのか考えているとしたら、画像では見えないかもしれませんが、私たちのものは相互作用を尊重しないからです。

ソニー・イメージワークス(特定のオフラインのパス追跡照明輸送アルゴリズムが必要とされるため) にとっては重要なことかもしれませんが、私たちにとってはほとんど無関係です。

これで、私たちが満足できる概算が見つかったので、一歩先に進み(それをすべきで)、私たちが本当は何をしているのかを見ることができます。 そうです。私たちには方程式がありますが、それは一部の検索テーブルによります。

これは、大きな問題(画像ベースの照明にはどのみちこれらのテーブルが必要)ではありませんが、追加テクスチャの取得となり、常に計算を再チェックすることが重要です。 では、使用している 1/[bias(roughness,ndotv) + scale(roughness,ndotv)] 関数をイメージしてみましょう:

これは、画期的にシンプルに見えます! 実は、これはとてもシンプルなもので、これを見つけるのに洗練されたツールは必要ありません。ですから、これをただお見せします: 1 + 2*alpha*alpha * ndotv。 とてもいいですね。

正しい正常化関数(グレーの表面)と比較した概算

炉のテストの中で少しエラーがあるのが見えるかもしれません。 適切な多項式合致(上の方程式の「2」と「1」は、最適な定数ではないことが分かりました)をすることで向上できますが、何が「最適」かを定義することは、正常化係数でシンプルな平均二乗最小化をすることはあまり意味を成さないため(最終的なビジュアル、知覚的な方法、どの角度がより大切かなどを気にするべきです)それ自体が問題です。 このような小さな修正のために、すでに時間を使い過ぎてしまいました。 しかも、実際のレンダリングされた画像は、テーブルベースの解決方法と識別するのは本当に難しいのです。

では、ndotvへの依存をやめることでさらに簡素化したかったら、何が達成できるか見てみましょう。 分かったことは、この場合は、1+alpha*alpha でも十分に効果があるということです。

高い粗さで明るくするために、BRDFに倍数因子を適用させていますが、これはよく意味が分かります。

もちろん、これによってさらにエラーが追加されるようになり、BRDFの形が変化するにしたがって見え始めます。 粗い表面にある仰角でエネルギーをさらに獲得しますが、必要性によって十分な可能性もあります。

ハイライトするには露出不足で、よりシンプルな概算では光が失われることがあるので、これを追加することがあります。

ここで、大きな課題を理解したことと思います。 もちろん、現実世界の物理を完璧に模倣したグラフィックを追い求めることに専心することもできます。 しかし、単にずるをすることもできます。 そして、パフォーマンスや簡素化、または純粋に怠惰からであっても、時にはずるをすることが正しい答えであることがあります。


Robloxコーポレーションとこのブログは、いかなる企業もサービスも推奨も支持もしません。 また、このブログに含まれる情報の正確さまたは完全性について、いかなる保証または約束もしません。

このブログ記事は、元は Robloxテックブログ に掲載されたものです。