要約
- IBLにてレンダリング方程式の積分を近似するために準モンテカルロ法を用いる
- 現実的な反復回数で真の値に近づけるために、鏡面反射率に応じたImportance Samplingを行う
レンダリング方程式
レンダリングの目的は、ピクセルごとに、ある方向に対して、照射された光がカメラ方向に向かって双方向反射率分布関数(BRDF)を持つ面で反射したときの光を、半球上で積分することに相当する。
Image-Based Lighting(IBL)では、この入射光を環境マップで近似するが、真面目に数値積分法でやろうとすると、テクスチャサンプリングが何百回と必要になり、リアルタイムレンダリングとして重くなりすぎる。
モンテカルロ求積法
モンテカルロ求積法はランダムな入力値から計算される出力値の相加平均で積分を近似する手法である。理論上、無限回繰り返すと真の値と同値になるが、現実的な有限回数では誤差が大きい。そこで、積分を上手く近似するような最も重要なサンプルをいくつか選択することで誤差を減らすことを考える。
Importance Sampling
光沢のある材質の場合、反射光の多くが鏡面反射方向に反射するため、その周辺に重点を置くのは理に適う。そこで、確率密度関数(PDF)を定義し、鏡面反射率に応じた重み付けを行うことを考える。具体的には以下を用いる。
ここで、は光源方向から入射した光が視線方向へ反射する確率を表す。
BRDFと入射光の積を用いたサンプリングは正確であるが極めて複雑である。一方、BRDFのみを用いたサンプリングは比較的簡単であり、フィルタリングと一緒に使うことで十分に良い画が得られる。
材質関数のサンプリング
累積分布関数(CDF)の逆関数に一様乱数を入力すると、その分布に従うサンプルが出力として得られることを利用する1。つまり、サンプルの方向を入力とするBRDFを正規化してPDFとし、そのCDFの逆関数を求め、そこに一様乱数のペアを入力することでサンプル方向を求める。
例えば、Phong BRDFのPDFは以下のようになる。
また、から以下が求まる。
従って、これらのCDFの逆関数から以下が求まる。
ここで、は表面のshininessを表す。
Quasirandom Low-Discrepancy Sequences
擬似乱数を用いたサンプリングはうまく分散せずに近似の正確性が損なわれるので、分布の均質性が本質的に保証されているdiscrepancy2の低い準乱数列 で代用する。ここでは、個の二次元のHammersley列を用いる。
ここで、はradical inverseの関数を表す。これは、2進数表現で小数点を境にを反転させたような値で、以下のように表される。
| (10進数) | (2進数) | (2進数) | (10進数) |
|---|---|---|---|
MIPMAPを用いたサンプリング
サンプル数が少ないことで起こるエイリアシングを減らすため、MIPMAPを積分の近似として用いる。つまり、PDFの値が小さいほど、サンプル同士が異なる方向を向くようになるため、ピクセルあたりに含まれるサンプルのより多い低詳細度のMIPMAPレベルが選択されるようにする。そのMIPMAPレベルは以下のように計算される。
ここで、はサンプルに対する立体角を表し、はレベル0のピクセルに対する立体角を表す。また、はマッピングの歪みを表し、環境マップの形式によって異なる。
マッピングと歪み
キューブマップは各面ごとにMIPMAPを生成するため、つなぎ目でアーティファクトが出やすい。そこで、ハードウェアのMIPMAP生成を活用しつつ、つなぎ目を少なくするため、環境マップにdual-paraboloidを用いる。そして、さらにつなぎ目のアーティファクトを減らすため、つなぎ目付近が重複して格納されるようなスケーリングファクターを導入する(ここではとする)。このとき、マッピングの歪みはとなる。
擬似コード
float4 GPUImportanceSampling(
float3 viewing : TEXCOORD1
uniform sampler2D env
) : COLOR {
float4 c = 0;
// Sample loop
for (int k=0; k < N; k++) {
float2 xi = hammersley_seq(k);
float3 u = sample_material(xi);
float pdf = p(u, viewing);
float lod = compute_lod(u, pdf);
float2 texcoord = convert_to_dual_paraboloid(u);
float3 L = tex2Dlod(env, float4(texcoord, lod.xy));
c += L * f(u, viewing) / pdf;
}
return c / N;
}参考文献
- Real Shading in Unreal Engine 4
- Hammersley Point Set — Wolfram MathWorld
- low discrepancy sequence の構成
- “RadicalInverse” — Wolfram Function Repository
- 4.1: Probability Density Functions (PDFs) and Cumulative Distribution Functions (CDFs) for Continuous Random Variables — LibreTexts Statistics
- 逆関数法とジオメトリサンプリング実装例 — memoRANDOM