This explanation is currently available in Japanese.
ひとことで
面の法線の側にある半球の上で、法線に近い方向ほど多く選ぶ(確率が に比例する)方向の選び方です。つや消しの面(拡散反射)に届く光の量は、光が来る方向と法線のなす角 の に比例します。真上からの光はよく効き、真横からの光はほとんど効きません。だから光線を飛ばして明るさを見積もるときは、よく効く方向に多くの光線を使うと、同じ本数でもノイズが小さくなります。
ゲームでの使いどころ
- アンビエントオクルージョン:SSAO や焼き込みの AO で、周りの物体にどれだけ空が隠されているかを求める光線の向き。
- 間接光(GI)・パストレーシング:拡散反射の面で跳ね返る光線の向き。ライトマップの焼き込みや、リアルタイムのレイトレーシングでも使う。
- 環境光の前計算:イメージベースドライティングで、拡散反射用の環境マップ(放射照度マップ)を作るときの積分。
- ランダムな跳ね返り:弾や粒子が面に当たって跳ね返る向きを、面の法線に寄せて自然に散らす。
しくみ
拡散反射の面に届く明るさは、半球の方向についての積分
です。これを 本の光線で見積もるとき、確率密度 で方向を選んだなら、 が見積もりになります(重要度サンプリング)。
- 一様に選ぶ: なので、1 本の寄与は 。 が方向によって 0〜1 でばらつくので、それがそのままノイズになります。
- 余弦重みで選ぶ: なので、1 本の寄与は だけになり、 のばらつきが消えます。
マリーの方法:余弦重みの方向は、単位円盤の上に一様に点を打ち、それを真上の半球へ持ち上げるだけで作れます。
円盤の上の小さな面積を半球へ持ち上げると、傾いた所ほど引き伸ばされる割合がちょうど になるためです。
実装のポイント
- 法線に合わせて回す:法線を y 軸とする局所座標で作り、法線と接線から作った基底でワールドへ回します。
- 法線 + 球面の点:法線に球面一様の単位ベクトルを足して正規化しても、余弦重みの方向になります(レイトレーシングの入門書でよく使われる簡単な方法)。
- 層化と組み合わせる:円盤の点を層化や低食い違い列で作り、同心写像で写すと、さらにノイズが減ります。
つまずきやすい点
- 寄与の割り算を忘れる:余弦重みで選んだのに、さらに を掛けると、真上ばかり強く効く結果になります。選び方と寄与の式をそろえます。
- 法線の反対側に出る:数値誤差で、法線とほぼ直角の方向が面の中にもぐることがあります。光線の出発点を法線方向に少し浮かせます。
- 光沢のある面には合わない:鏡に近い反射では、明るさの効く方向が法線ではなく反射方向の近くに集まります。その場合は GGX の分布に合わせて選びます。
デモで試すこと
- 床の黄色い点から、半球の方向へ光線が飛びます。青は空に抜けた光線、赤は壁やひさしに当たった光線です。
- 「円盤から持ち上げる様子」を表示すると、床の円盤に打った点(黄色)から真上へ点線が伸び、その先が光線の向きになっているのがわかります。
- 右下のグラフは、16 本の光線で見積もった明るさの変化です。「一様」(赤)の方が「余弦重み」(緑)より大きく上下します。「壁とひさし」を消すと、余弦重みの見積もりはぶれずに正解の 1 にぴったり重なります。
- 「表示する光線の選び方」を「半球に一様」にすると、水平に近い、明るさにほとんど効かない方向にも多くの光線を使っていることがわかります。