この記事はレイトレアドベントカレンダー 2022 24日目の記事です. この記事では様々なマテリアルを表現する際に使われる複合BSDFの評価とサンプリングの方法について解説しています.
複合BSDFとは
物理ベースレンダリングにおいては、物体の質感はBRDF, またはBTDFと呼ばれる以下のような関数で表現されます.
- : 位置
- : 光の入射方向
- : 光の出射方向
が反射を表現する場合はBRDF, 透過, 屈折を表現する場合はBTDFと呼ばれます.
複合BSDF とは複数のBRDF, BTDFの集まりで構成される以下のような関数のことを言います.
- : 番目のBRDF, BTDFの係数
- : 番目のBRDF, BTDF
物理ベースレンダリングにおいては, 様々な見た目のマテリアルを1つのBSDFで表現するために, このような複合BSDFが使われます. 例えば有名なマテリアルモデルであるDisney BRDFは以下のように5つのBRDFからなる複合BSDFになっています.
(各項の詳細についてはmemoRANDOM - Disney Principled BRDFを参照してください)
それぞれのBRDFの係数やパラメーターを変化させることで, 1つのBSDFで様々な見た目のマテリアルを再現することが出来ます. 以下はDisney BRDFで表現することの出来るマテリアルの例です.
現在はDisney BRDFをベースにUE4 BRDF, Disney BSDF, Arnold Standard Surfaceなど様々なマテリアルモデルがありますが, いずれも複合BSDFの形になっています.
レイトレーシングで複合BSDFを扱う場合, 複合BSDFの評価と方向ベクトルのサンプリングが必要です. 以下では複合BSDFの評価とサンプリングの方法について見ていきます.
複合BSDFの評価
位置, 出射方向, 入射方向が与えられた時の評価は単純に式(1)に従い, 各BRDF, BTDFの評価結果に係数をかけて足し合わせるだけです.
複合BSDFからの方向ベクトルのサンプリング
複合BSDFから方向ベクトルをサンプリングする場合, 式(1)の個のBRDF, BTDF(以降まとめてBxDFと呼びます)の中から1つのBxDFを選び, 選んだBxDFから方向ベクトルをサンプリングするという流れを踏みます. ここでは1つのBxDFを選ぶという過程をBxDFサンプリングと呼ぶことにします.
BxDFサンプリング
最も簡単なのはランダムに1つのBxDFを選ぶことですが, これは選んだBxDFの係数がである場合に非効率です. そこで, ランダムではなく, 係数の大きさに比例するようにBxDFをサンプリングすることを考えます.
何番目のBxDFが選択されたかを表す確率変数をとすると, の確率質量関数を次のように設定すれば, 係数の大きさに比例するようにBxDFがサンプリングされます.
ここでは係数は全て正の実数であると仮定します. 実際にはDisney BRDFなどでは係数がRGBになったりします. この場合はRGBをLuminanceに変換するなどして, 正の実数に変換しておきます.
からは次のようにしてBxDFのインデックスをサンプリング出来ます.
// BxDFのインデックスをサンプリングして返す
// p: 確率質量関数
// N: BxDFの数
uint32_t sample_bxdf(const float* p, uint32_t N)
{
const float xi = random(); // [0, 1]の乱数を生成
float cdf = 0.0f;
for(uint32_t i = 0; i < N; ++i)
{
cdf += p[i];
if(xi < u) return i;
}
return N - 1;
}
これでBxDFのサンプリングが出来るようになりました. 今番目のBxDFがサンプリングされたとすると, 方向ベクトルはBxDF の重点的サンプリングで生成すれば良いです. 例えばがLambert BRDF, Oren-Nayar BRDFならCosine weighted hemisphere sampling, Microfacet BxDFならVNDF samplingをすれば良いです.
方向ベクトルの確率密度の評価
複合BSDFからサンプリングされた入射方向ベクトルを使い, レンダリング方程式をモンテカルロ積分で評価することを考えます.
この式を評価するためには方向ベクトルの確率密度関数の値が必要です. 今のサンプリング方法の場合, これは以下のような式で計算出来ます.
- : 番目のBxDFから方向ベクトルをサンプリングする時の確率密度関数
つまり, は各BxDFの方向ベクトルサンプリングの確率密度関数をで重みづけた平均になっています. この式はMulti importance samplingの1サンプルモデルと対応しています. 方向ベクトルのサンプリング戦略はBxDFの個数分だけあるので, そこにMulti importance samplingを適用すると, この形の式が得られます.