質感・ライティング

PBR・BRDF

Physically Based Rendering / BRDF

PBRは物理に基づく描画の方針、BRDFは表面で光がどの方向へ反射するかを表す関数。

1 / 10

インタラクティブデモ

デモを準備しています…

PBR・BRDF

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

ひとことで

PBR(物理ベースレンダリング)は、光の振る舞いを物理法則に沿ってモデル化し、「どんな照明の下に置いても、その素材らしく見える」ように描く考え方です。その中心にあるのが BRDF(双方向反射率分布関数)で、「ある方向から来た光が、表面でどの方向へどれだけ反射されるか」を表す関数です。アーティストは色・粗さ・金属度といった直感的な数値を指定するだけで、昼の屋外でも夜の洞窟でも破綻しない素材を作れます。

ゲームでの使いどころ

  • 現代のほぼすべての 3D ゲーム:Unreal Engine、Unity(URP/HDRP)、Godot、three.js などの標準マテリアルは PBR です。
  • 素材の再利用:同じ素材を別のシーン・時間帯・天候に持っていっても、照明に合わせて自然に見えます。ライティングごとに素材を調整し直す必要がありません。
  • 制作パイプラインの共通化:Substance Painter などのツールで作ったテクスチャ(ベースカラー、粗さ、金属度、チャンネルパッキングされた ORM)を、そのままエンジンに持ち込めます。

しくみ

表面から出ていく光 LoL_o は、あらゆる方向から入ってくる光 LiL_i に BRDF ff を掛けて足し合わせたもの(反射方程式)です。

Lo(v)=∫Ωf(l,v) Li(l) (n⋅l) dlL_o(\mathbf{v}) = \int_{\Omega} f(\mathbf{l}, \mathbf{v})\, L_i(\mathbf{l})\, (\mathbf{n}\cdot\mathbf{l})\, d\mathbf{l}

ゲームでよく使われる BRDF は、拡散反射と鏡面反射の和です。

f=(1−F)(1−m) albedoπ⏟拡散(Lambert)+D G F4 (n⋅l)(n⋅v)⏟鏡面(Cook-Torrance)f = \underbrace{(1 - F)(1 - m)\,\frac{\text{albedo}}{\pi}}_{\text{拡散(Lambert)}} + \underbrace{\frac{D\,G\,F}{4\,(\mathbf{n}\cdot\mathbf{l})(\mathbf{n}\cdot\mathbf{v})}}_{\text{鏡面(Cook-Torrance)}}
  • DD:微小面の向きの分布(GGX)。粗さで反射の広がりが決まる。
  • GG:微小面同士が光や視線をさえぎる割合(幾何減衰)。
  • FF:見る角度による反射率の変化(フレネル)。
  • mm:金属度。

PBR の約束事として重要なのは次の 2 つです。

  1. エネルギー保存:反射する光の合計は、入ってきた光を超えない。粗いほどハイライトは広く暗く、滑らかなほど狭く明るくなる。
  2. 金属と非金属の区別:非金属は数 %(F0 ≈ 0.04)だけを鏡面反射し、残りを色の付いた拡散反射として返す。金属は拡散反射を持たず、鏡面反射に金属自身の色が付く。

実装のポイント

  • パラメーターは 0〜1 の直感的な値:粗さ(roughness)と金属度(metalness)の組み合わせが一般的です(Metallic/Roughness ワークフロー)。鏡面色と光沢度を直接指定する Specular/Glossiness ワークフローもあります。
  • 環境光も PBR で:ライトだけでなく、環境マップ照明も同じ BRDF の考え方で計算しないと、素材が周囲からなじみません。
  • 線形空間で計算する:ベースカラーのテクスチャは sRGB から線形に変換してから計算し、最後にトーンマッピングで画面の範囲に収めます。

つまずきやすい点

  • ベースカラーに陰影を描き込まない:色のテクスチャに影や光沢を描き込むと、照明と二重になって不自然になります。ベースカラーは「照明のない素の色」です。
  • 現実にありえない値:真っ黒(0)や真っ白(1)のベースカラー、金属度 0.5 のような中途半端な値は、現実の素材には存在せず不自然に見えがちです。金属度は基本的に 0 か 1、境目(錆や塗装の剥がれ)だけ中間値にします。
  • PBR は写実のためだけではない:アニメ調のゲームでも、照明の一貫性を保つために PBR を土台にして、トゥーンなどの表現を重ねることがあります。

デモで試すこと

  1. 左の球は、粗さ(左から右)と金属度(手前が非金属、奥が金属)を変えたものです。同じ照明の下で、それぞれがもっともらしい素材に見えることを確認してください。
  2. 右の立体は BRDF の形です。光(黄色の矢印)が当たったとき、どの方向へどれだけ光が返るかを、方向ごとの距離で表しています。粗さを下げると、鏡の反射方向(水色の矢印)に鋭く集まります。
  3. 「BRDF の成分」を拡散のみ・鏡面のみに切り替えると、全方向へ均等に返る拡散と、反射方向に集まる鏡面の 2 つからできていることが分かります。
  4. 「金属」をオンにすると、拡散の丸いふくらみが消え、鏡面だけになります。

参考資料

Physically Based Rendering — Surface Reflection ↗