This explanation is currently available in Japanese.
ひとことで
円(円盤)の中に、面積に対して均等に点を選ぶ方法です。「半径と角度をそれぞれ乱数で選ぶ」と、中心に点が集まってしまいます。半径 の内側の面積は に比例するので、半径には乱数の平方根を使うのが正解です。さらに、正方形の上で層化した点を、区画の形をなるべく崩さずに円盤へ写す「同心写像」(シャーリーとチウの方法)もよく使われます。
ゲームでの使いどころ
- 円形の範囲への配置:プレイヤーの周り半径 10 m のどこかに敵を出す、爆発の範囲に破片を散らす、円形の池の周りに石を置く。
- 弾のばらつき:散弾の広がりを円の中で均等にする(中心に集めたいなら正規分布)。
- 被写界深度とソフトシャドウ:被写界深度のレンズの口径や、光源の円盤の上に標本を置く。層化した点を同心写像で写すと、少ない標本でもむらが少ない。
- 余弦重みの方向:円盤の点を真上へ持ち上げると、余弦重みの半球の方向になる(マリーの方法)。
しくみ
平方根を使う理由:半径 (0〜1)より内側に入る確率は、面積の比 でなければなりません。一様乱数 に対して 、つまり とすれば、この条件を満たします(逆 CDF 法の例)。角度は で一様です。
同心写像:正方形 の点 を、正方形の同心の枠が円盤の同心の輪へ移るように写します。
点は です。面積は保たれ(一様のまま)、区画の縦横比のゆがみも小さいので、層化や低食い違い列の均等さがそのまま残ります。平方根の方法では、中心の区画が細い扇形に、外側の区画が平たい帯になり、隣り合う点どうしの距離が崩れます。
棄却法:円を囲む正方形に点を打ち、外に出たものを捨てます。簡単で正しいのですが、 が無駄になり、必要な乱数の数も一定になりません。
実装のポイント
- ドーナツ形(輪):内側の半径 と外側 の間なら、 とします。
- だ円:円盤の点を軸ごとに拡大すれば、だ円の中でも一様のままです(面積の比が保たれるため)。
- シェーダーでは:同心写像の分岐は、GPU でも問題になるほどの負荷ではありません。固定の標本配置なら、あらかじめ計算して定数の配列にします。
つまずきやすい点
- 半径をそのまま一様に:もっともよくある誤りです。中心の小さな円に、面積の割に多くの点が入ります。
- 原点での割り算:同心写像は で 0 で割ることになるので、先に場合分けします。
- 層化の効果が消える:せっかく層化した点も、ゆがみの大きい写像で写すと、点の間隔が不ぞろいになります。
デモで試すこと
- 左の正方形には、区画ごとに 1 つずつ層化した点が並んでいます。右がそれを円盤へ写した結果で、区画の模様も一緒に写しています。
- 「半径をそのまま一様に」では、中心の区画が小さくつぶれ、点が中心に集まります。右下のグラフ(面積の等しい輪ごとの点の数)の左端が高くなります。
- 「半径を平方根に」ではグラフが平らになりますが、区画の形が中心で細い扇形にゆがみます。「同心写像」では、面積も区画の形もほぼ保たれます。
- 「棄却法」では、赤い点(捨てた点)の割合を確かめてください。「正方形から円盤への変形を動かす」で、写像の様子を連続的に見られます。