ひとことで
表面を顕微鏡で見ると、目に見えないほど小さな平らな面(微小面)が、いろいろな向きに傾いて並んでいると考えられます。GGX(Trowbridge–Reitz 分布)は、その微小面の法線が「どの向きにどれくらいの割合で向いているか」を表す法線分布関数です。粗さのパラメーター 1 つで、鏡のような表面からざらざらの表面まで表せ、しかも中心が鋭く周りに長い裾を持つので、現実の素材のハイライトによく合います。現代のゲームエンジンの標準的な鏡面反射モデルです。
ゲームでの使いどころ
- PBR マテリアルの鏡面反射:Unreal Engine、Unity、Frostbite、three.js などの標準マテリアルの 項。
- ハイライトの見た目:濡れた路面、車の塗装、磨かれた金属、プラスチック。GGX の長い裾が、光源の周りのにじみ(グロー)を自然に作ります。
- 環境マップのぼかし:環境マップ照明で、粗さごとにぼかした環境マップを事前計算するときにも、GGX 分布で方向を選びます(重要度サンプリング)。
しくみ
光の方向 と視線 の中間の向き(ハーフベクトル) を向いた微小面だけが、光を視線の方向へ鏡のように反射します。そのような微小面がどれだけあるかを表すのが です。
- が小さい(滑らか)と、ほとんどの微小面が表面の法線と同じ向きを向き、反射は鏡の方向に鋭く集まります。
- が大きい(粗い)と、微小面の向きがばらつき、反射が広い範囲に広がります。
- 粗さを 2 乗して にするのは、アーティストが操作するスライダーの変化が見た目の変化と比例するようにするため(Disney の提案)です。
他の分布との違い
| 分布 | 特徴 |
|---|---|
| Blinn-Phong | 古くからの近似。ハイライトの裾が短く、プラスチックっぽい |
| Beckmann | 物理的な根拠がある分布。裾は GGX より短い |
| GGX | 中心が鋭く、裾が長い。実測した素材によく合う |
だけでは反射モデルにならず、実際には幾何減衰 (微小面同士の影)とフレネル を組み合わせて使います(PBR・BRDF)。
実装のポイント
- 粗さの下限: が 0 に近いと分母が 0 に近づき、ハイライトが 1 画素の点になってちらつきます。0.02〜0.05 程度の下限を設けるのが一般的です。
- 幾何減衰との組み合わせ:GGX には、同じ分布から導かれる Smith の幾何減衰(高さ相関版)を組み合わせるのが正確です。
- 異方性への拡張: を方向ごとに と分けると、異方性反射になります。
つまずきやすい点
- 粗さの定義の違い:エンジンやツールによって、「粗さ」をそのまま にするか、2 乗するかが違うことがあります。ツール間で素材を移すと見た目が変わる原因になります。
- 小さなハイライトのエイリアシング:粗さの低い面に細かい法線マップを組み合わせると、ハイライトがちらつきます(鏡面エイリアシング)。法線のばらつきに応じて粗さを上げる対策(Toksvig など)があります。
- エネルギーの損失:粗い表面では、微小面間の多重反射が無視されるため、少し暗くなります。高品質なレンダラーでは補正項を足します。
デモで試すこと
- 左の「微小面の集まり」で粗さを上げると、小さな鏡の向きがばらばらになり、反射した光の向き(水色の線)が広い範囲に散らばります。
- 右下のグラフは、法線からずれた角度ごとの分布の値(対数目盛)です。GGX は Beckmann や Blinn-Phong よりも、角度が大きいところで値がゆっくり下がる「長い裾」を持っています。
- 右の球で分布関数を切り替えると、GGX ではハイライトの周りにうっすらとにじみが広がり、他の分布ではハイライトの縁がくっきり切れるのが分かります。