質感・ライティング

GGX

GGX / Trowbridge–Reitz Distribution

粗さによって変わる反射の広がりを表す。

2 / 10

インタラクティブデモ

デモを準備しています…

GGX

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

表面を顕微鏡で見ると、目に見えないほど小さな平らな面(微小面)が、いろいろな向きに傾いて並んでいると考えられます。GGX(Trowbridge–Reitz 分布)は、その微小面の法線が「どの向きにどれくらいの割合で向いているか」を表す法線分布関数です。粗さのパラメーター 1 つで、鏡のような表面からざらざらの表面まで表せ、しかも中心が鋭く周りに長い裾を持つので、現実の素材のハイライトによく合います。現代のゲームエンジンの標準的な鏡面反射モデルです。

ゲームでの使いどころ

  • PBR マテリアルの鏡面反射:Unreal Engine、Unity、Frostbite、three.js などの標準マテリアルの DD 項。
  • ハイライトの見た目:濡れた路面、車の塗装、磨かれた金属、プラスチック。GGX の長い裾が、光源の周りのにじみ(グロー)を自然に作ります。
  • 環境マップのぼかし:環境マップ照明で、粗さごとにぼかした環境マップを事前計算するときにも、GGX 分布で方向を選びます(重要度サンプリング)。

しくみ

光の方向 l\mathbf{l} と視線 v\mathbf{v} の中間の向き(ハーフベクトル)h=normalize(l+v)\mathbf{h} = \text{normalize}(\mathbf{l} + \mathbf{v}) を向いた微小面だけが、光を視線の方向へ鏡のように反射します。そのような微小面がどれだけあるかを表すのが D(h)D(\mathbf{h}) です。

DGGX(h)=α2π ((n⋅h)2(α2−1)+1)2,α=roughness2D_{\text{GGX}}(\mathbf{h}) = \frac{\alpha^2}{\pi\,\big((\mathbf{n}\cdot\mathbf{h})^2(\alpha^2 - 1) + 1\big)^2}, \qquad \alpha = \text{roughness}^2
  • α\alpha が小さい(滑らか)と、ほとんどの微小面が表面の法線と同じ向きを向き、反射は鏡の方向に鋭く集まります。
  • α\alpha が大きい(粗い)と、微小面の向きがばらつき、反射が広い範囲に広がります。
  • 粗さを 2 乗して α\alpha にするのは、アーティストが操作するスライダーの変化が見た目の変化と比例するようにするため(Disney の提案)です。

他の分布との違い

分布特徴
Blinn-Phong古くからの近似。ハイライトの裾が短く、プラスチックっぽい
Beckmann物理的な根拠がある分布。裾は GGX より短い
GGX中心が鋭く、裾が長い。実測した素材によく合う

DD だけでは反射モデルにならず、実際には幾何減衰 GG(微小面同士の影)とフレネル FF を組み合わせて使います(PBR・BRDF)。

実装のポイント

  • 粗さの下限:α\alpha が 0 に近いと分母が 0 に近づき、ハイライトが 1 画素の点になってちらつきます。0.02〜0.05 程度の下限を設けるのが一般的です。
  • 幾何減衰との組み合わせ:GGX には、同じ分布から導かれる Smith の幾何減衰(高さ相関版)を組み合わせるのが正確です。
  • 異方性への拡張:α\alpha を方向ごとに αx,αy\alpha_x, \alpha_y と分けると、異方性反射になります。

つまずきやすい点

  • 粗さの定義の違い:エンジンやツールによって、「粗さ」をそのまま α\alpha にするか、2 乗するかが違うことがあります。ツール間で素材を移すと見た目が変わる原因になります。
  • 小さなハイライトのエイリアシング:粗さの低い面に細かい法線マップを組み合わせると、ハイライトがちらつきます(鏡面エイリアシング)。法線のばらつきに応じて粗さを上げる対策(Toksvig など)があります。
  • エネルギーの損失:粗い表面では、微小面間の多重反射が無視されるため、少し暗くなります。高品質なレンダラーでは補正項を足します。

デモで試すこと

  1. 左の「微小面の集まり」で粗さを上げると、小さな鏡の向きがばらばらになり、反射した光の向き(水色の線)が広い範囲に散らばります。
  2. 右下のグラフは、法線からずれた角度ごとの分布の値(対数目盛)です。GGX は Beckmann や Blinn-Phong よりも、角度が大きいところで値がゆっくり下がる「長い裾」を持っています。
  3. 右の球で分布関数を切り替えると、GGX ではハイライトの周りにうっすらとにじみが広がり、他の分布ではハイライトの縁がくっきり切れるのが分かります。

参考資料

Filament Material System ↗

分野全体の資料で、この項目を直接扱っているとは限りません。