- 「ので、長い記事のために申し訳ありませんが、私はそのように行うことを好む悪魔は細部にある。」:)
私はスクラッチからパストレーサーを書いており、完全に拡散した(ランバート)表面に対してうまく機能しています(つまり、ファーネステストは-少なくとも視覚的に-それがエネルギーを節約しており、レンダリングされた画像がミツバレンダラーで生成されたものと一致することを示しますパラメーター)。現在、いくつかの金属表面をレンダリングするために、オリジナルのCook-Torranceマイクロファセットモデルの鏡面反射用語のサポートを実装しています。しかし、このBRDFは受け取ったエネルギーよりも多くのエネルギーを反映しているようです。以下のサンプル画像を参照してください。
上の画像:ミツバリファレンス(正しいと仮定)画像:直接光サンプリング、重要度半球サンプリング、最大パス長= 5、32層化spp、ボックスフィルター、表面粗さ= 0.2、RGBによるパストレーシング。
上の画像:実際のレンダリング画像:ブルートフォースナイーブパストレース、均一な半球サンプリング、最大パス長= 5、4096層化spp、ボックスフィルター、表面粗さ= 0.2、RGB。レンダリング設定に関していくつかの違いはありますが、レンダリングされたイメージが前に示した参照に収束しないことは明らかです。
私はそれが実装の問題ではなく、レンダリング方程式フレームワーク内でのCook-Torranceモデルの適切な使用に関する問題だと思う傾向があります。以下に、鏡面反射光BRDFをどのように評価するかを説明します。適切に行っているかどうか、そしてそうでない場合はその理由を知りたいです。
重要な詳細を説明する前に、レンダラーは非常に単純であることに注意してください。1)総当たり攻撃ナイーブパストレーシングアルゴリズムのみを実装します。直接光サンプリング、双方向パストレーシング、MLTはありません。2)すべてのサンプリングは、交点の上の半球で均一です-重要なサンプリングはまったくなく、拡散サーフェスでもありません。3)光線経路の最大長は5に固定されています-ロシアンルーレットなし; 4)放射輝度/反射率はRGBタプルで通知されます-スペクトルレンダリングはありません。
クックトーランスマイクロファセットモデル
次に、スペキュラBRDF評価式を実装するためにたどったパスを作成しようとします。レンダリング方程式ですべてが開始 pは表面での交点であります、W oは視線ベクトルであり、wは私
上記の積分(つまり、レンダリング方程式の反射項)は、次のモンテカルロ推定器1で近似できます。 ここでpは、サンプリングベクトルwkの分布を記述する確率密度関数(PDF)です。
実際のレンダリングでは、BRDFとPDFを指定する必要があります。クックトーランスモデルの鏡面反射項の場合、次のBRDF ここで、 D=1
滑らかな鏡面をレンダリングする場合は、重要度サンプリングを使用することが必須です。ただし、私は適度に粗い表面()のみをモデリングしているため、しばらくの間、均一なサンプリングを維持することにしました(レンダリング時間が長くなります)。この場合、PDFは 均一なPDFとCook-Torrance BRDFをモンテカルロ推定器に代入することにより(はランダム変数で置換)、
したがって、これは、反射率がCook-Torrance BRDFによって記述される鏡面に光線が当たるときに評価する表現です。それは受け取ったよりも多くのエネルギーを反映しているように見える表現です。私はそれ(または派生プロセス)に何か問題があるとほぼ確信していますが、それを見つけることはできません。
興味深いことに、上記の式にを掛けると、正しい結果が得られます。しかし、数学的に正当化できないため、それを拒否しました。
どんな助けも大歓迎です!ありがとうございました!
更新
以下に@wolleが指摘したように、このペーパーでは、パストレースに適した新しい定式化を示します。正規分布関数(NDF)にはファクターが含まれ、BRDFには要因。したがって、 および 上記の方程式を含めるレンダリング方程式、私は
更新2
PeteUKが指摘したように、私の質問の元のテキストで提示されたフレネル定式化の著者は、クックとトーランスに誤って起因していました。上記で使用されたフレネル定式化は、実際にはシュリックの近似として知られており、クリストフ・シュリックにちなんで命名されています。質問の元のテキストはそれに応じて変更されました。