拡散反射光と鏡面反射の用語を適切に組み合わせる方法


18

私が理解する限り、BRDFでは、フレネル項は、光子が表面に衝突したときに反射または屈折する確率を示しています。

反射した光子は鏡面反射の項に寄与し、屈折した光子は拡散の項に寄与します。したがって、物理的な方法で、材料の色に対する光の寄与を決定するとき、私はただ書きたいと思う:

// Assuming for example:
//   diffuse = dot(L, N);
//   specular = pow(dot(H, N), alpha) * (alpha + 2.0) / 8.0;
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
color = lightIntensity * Lerp(diffuse * albedo, specular, fresnel);

しかし、このように書かれたのを見たことがありません。フレネル項に従って重み付けされた鏡面反射項を見ましたが、拡散反射光項は見ていません。主に参照されているPBRに関する記事で、セバスチャンラガルドは、拡散項の重み付けにを使用することは正しくないと述べています。1F

私は何が欠けていますか?
これがなぜ間違っているのかを明白な方法で強調する説明を歓迎します。

回答:


14

2つのフレネル項を使用することは、任意の拡散パスがサーフェスを2回通過するという意味で正しいです。再び跳ね返るまで媒体を通るパスをトレースして拡散を解決する場合、サーフェスと相互作用するときにそのパスに対して2つ(またはそれ以上)のフレネル項が得られます。

ただし、それは拡散BRDFで行っていることではありません。拡散BRDFは、考えられるすべての拡散パスの平均を表すことを目的としています。ランベルトの場合、その平均は均一反射としてモデル化され、単一のアルベド値は拡散中の内部エネルギー損失を測定しますが、より複雑なモデルが可能です。重要:拡散BRDFには、さらに拡散するために媒体に反射されるいくつかのパスと、すぐに通過するいくつかのパスの集約効果が既に含まれています。はすでにBRDF¹に「ベイクイン」されており、再度ファクタリングする必要はありません。1Foあなたはt

ランベルトの用語に含まれていないのは、光が拡散媒体に入る前に反射されることによって失われるエネルギーの部分です。これはビューに依存しますが、その上の正確な光沢のあるローブに依存します。反映されていないすべてはあなたが実際にしたいことはすなわち、すべての発信方向の上に表面における全エネルギー損失を統合することであることを意味し、屈折されますので(非金属)の表面界面で何のエネルギーロスがありません。1glossy_bsdfでるdでる

特定のBRDFの積分の近似値を事前に計算することができます。最終結果は、一般に、少なくともビューの方向、材料の粗さ、IORに依存します。最初の近似として、光沢のあるローブが完全な鏡面反射体であると仮定できます。それは重みを与え。これはまさにあなたが最初に提案したものです。1つやつやdでる=1Fn

さらに、ランベルトBRDFはアルベドを除算したものであり、コサイン項は入射光が表面でどの程度減衰したかの尺度であることに注意してください。光沢反射率と拡散反射率の両方に適用されます。π

だから、大体:

// Assuming for example:
//   diffuse = albedo / PI;
//   specular = my_favorite_glossy_brdf(in_dir, out_dir, roughness);
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
//   total_surface_reflection = fresnel
color = lightIntensity * dot(L, N) * Lerp(diffuse, specular, total_surface_reflection);

¹ 本当にあなたのアウト方向をもたらす可能性のあるすべての入射内部拡散出口経路上のの積分ですが、私は脱線します。F


8

質問を適切に作成するためにブラウジングしているときに、実際に答え見つかりましたが、これは非常に簡単です。

別のフレネル項もまた、フォトンがマテリアルから外に出て(したがって空気中に屈折する)拡散項になるため、重みが付けられます。したがって、拡散項の正しい係数は次のようになります。

1Fn1Foあなたはt

1
ディズニーBRDF紙セクション5.3は、あなたの答えに式を参照し、別のモデルを指定するために行きます。光沢のあるBRDF実装を開始したばかりなので、私はそれを理解していると主張しません!
PeteUK

私はこれをここから続け、内部で反射された光が内側から反対側で再び表面に当たり、その後何度も何度も、無限に:P(またはサブに)表面散乱hehe)
アランウルフ

別のフレネル項をどのように計算しますか?
プラズマセル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.