シェーディングと物理ベース描画(PBR)
ランバート・Phong の古典モデルがなぜ破綻し、PBR がどう解いたかを、エネルギー保存・フレネル・マイクロファセットの原理から理解でき、metallic/roughness を根拠を持って調整できるようになります。
- 1.ランバートは拡散、Phong/Blinn-Phong は反射ベクトルや半角ベクトルで鏡面ハイライトを近似するが、エネルギー保存もフレネルも保証しない経験モデル。
- 2.PBR は BRDF に基づき、フレネル・マイクロファセット法線分布(GGX)・幾何遮蔽の3項でエネルギー保存する鏡面を組み、拡散と足しても入射光を超えないよう設計する。
- 3.metallic/roughness ワークフローは、金属か否かとミクロな凹凸の2軸でアルベド・反射色・ハイライトの広がりを一貫制御し、異なるライティング下でも破綻しない。
シェーディングとは「表面で光がどう散るか」を解く問題
シェーディングは、ある表面点に届いた光が視線方向へどれだけ返ってくるかを計算する処理です。中心にあるのが BRDF(Bidirectional Reflectance Distribution Function、双方向反射率分布関数) で、入射方向から来た放射輝度が視線方向へどんな比率で反射するかを表します。最終的な出射輝度は、半球上のすべての入射光に対して BRDF × 入射光 × cosθ を積分した値です(θ は法線と入射方向の角度)。
古典的なシェーディングモデル(ランバート・Phong)は、この BRDF を 物理的裏付けの薄い経験式 で近似したものです。見た目はそれらしくなりますが、光の総量が保存されず、視点やライティングを変えると破綻します。PBR(Physically Based Rendering)は同じ BRDF を 物理法則(エネルギー保存・フレネル・微小面の統計) から組み立て直したものだ、と捉えると全体像が掴めます。GPU でこれをどう実行するかは /hardware-components/ のグラフィックス関連項目も参照してください。
ランバート拡散 ── 完全につや消しの理想
最も基本的な拡散反射モデルが ランバート反射 です。表面に届いた光がミクロには無数の方向へ均等に散らばると仮定し、出射輝度が視線方向に依存しない(どこから見ても同じ明るさ)とします。明るさを決めるのは入射角だけです。
ランバート拡散の反射輝度:
Ld = albedo × lightColor × max(0, N·L)
N : 表面法線(正規化)
L : 光源へ向かう単位ベクトル
N·L : ランバートの余弦則。入射角が浅いほど暗い
albedo : 拡散反射率(0〜1、表面の「地の色」)
核心は N·L の余弦項 です。光が斜めから当たると同じ光束がより広い面積に広がるため、単位面積あたりの明るさは cosθ に比例して落ちます。これは幾何学的必然であり、PBR の拡散項でもそのまま生き続けます。ランバートは正しい物理を含みますが、拡散のみで鏡面ハイライト(光沢)を表現できないのが限界です。
Phong と Blinn-Phong ── ハイライトの経験的近似
つやのある表面には、光源が鏡のように映り込む 鏡面ハイライト が出ます。これを最初に実用化したのが Phong モデルです。視線方向 V と、光を法線で反射させた 反射ベクトル R の一致度を、内積のべき乗で表します。
Phong 鏡面: Ls = ks × (max(0, R·V))^n
Blinn-Phong: Ls = ks × (max(0, N·H))^n (H = normalize(L + V))
R : L を N で反射したベクトル(反射方向)
H : L と V の半角ベクトル(両者の中間方向)
n : 光沢指数。大きいほどハイライトが鋭く小さい
ks : 鏡面反射の強さ(経験的な係数)
Blinn-Phong は R·V の代わりに 半角ベクトル H と法線 N の一致度 を使う改良版です。H が N に近いほど、その面は光を視線方向へ跳ね返す向きになっている、という直感に対応します。R の計算を省けて速く、かつ視線と光源がほぼ反対を向く低い角度でハイライトが不自然に消える Phong の弱点も緩和されるため、OpenGL 固定機能パイプライン時代の事実上の標準になりました。
Phong/Blinn-Phong の ks と光沢指数 n は独立に調整でき、拡散と鏡面の和が入射光を超えても何も止めません。n を上げてハイライトを鋭くすると光る面積が減るのに1点あたりの明るさは変わらず、反射する光の総量が指数によって勝手に変動します。物理的には n を変えても表面が受けて返す総エネルギーは一定であるべきで、この不整合が「ライティングを変えると質感が破綻する」原因になります。
物理ベース描画(PBR)の骨格 ── BRDF を物理から組む
PBR はこの破綻を、BRDF を物理的に正しく設計することで解きます。3つの原則が土台です。
- エネルギー保存: 表面が反射する光の総量は入射光を超えない。拡散に回る分と鏡面に回る分は取り合いの関係にあり、和は必ず1以下に収める。
- フレネル効果: すべての表面は、視線がかすめる角度(浅い角度)になるほど反射率が上がり、真上から見ると最小になる。
- マイクロファセット理論: 表面をミクロには無数の微小な鏡(マイクロファセット)の集まりと見なし、その向きの統計分布で光沢の広がりを説明する。
実務で最も普及した鏡面 BRDF が Cook-Torrance モデル で、次の3項の積で表されます。
鏡面 BRDF(Cook-Torrance):
f_spec = (D × F × G) / (4 × (N·V) × (N·L))
D : 法線分布関数(Normal Distribution Function)
マイクロファセットのうち H を向いている割合。ハイライトの形を決める
F : フレネル項。反射率の角度依存。金属色もここに入る
G : 幾何遮蔽項(Geometry)。微小面同士の影・遮蔽による減光
分母 4×(N·V)×(N·L) : マイクロファセット統計から出る正規化係数
Blinn-Phong の (N·H)^n が、物理的に正規化された D 項に置き換わっている点に注目してください。PBR の鏡面は「経験的な光り方」ではなく「微小面がどう並んでいるかの統計」から導かれます。
D・F・G の中身 ── GGX とフレネル
D 項(法線分布) で現在の標準は GGX(Trowbridge-Reitz) です。Blinn-Phong の分布に比べて中心のピークが鋭く、かつ裾(ハイライト周辺のなだらかな広がり)が長いため、金属やなめらかな面の現実的なハイライトによく一致します。この広がりを制御するのが roughness(表面のミクロな粗さ) で、粗いほど微小面の向きがばらけてハイライトが広く淡くなります。
GGX 法線分布(粗さ a = roughness²):
D = a² / ( π × ( (N·H)² × (a² − 1) + 1 )² )
roughness 小 → a 小 → 分布が鋭い → ハイライトが小さく強い(つるつる)
roughness 大 → a 大 → 分布が広い → ハイライトが大きく淡い(つや消し)
F 項(フレネル) は視線角度による反射率の増加で、Schlick 近似 が広く使われます。F0(正面から見たときの基準反射率)から、かすめる角度で1へ向かって立ち上がります。
Schlick フレネル近似:
F = F0 + (1 − F0) × (1 − (H·V))^5
F0(非金属, 誘電体): おおむね 0.02〜0.04 の無彩色(ほぼ白い弱い反射)
F0(金属) : 0.5〜1.0 程度で、かつ色を持つ(金は黄、銅は赤みなど)
G 項(幾何遮蔽) は、粗い面で微小面同士が互いに影を落としたり視線を遮ったりして反射光が減る効果を表し、Smith モデルなどで roughness に連動させます。エネルギー保存の帳尻を合わせる役割を担います。
metallic/roughness ワークフロー
これらのパラメータを、アーティストが直感的に扱えるよう2つの軸に集約したのが metallic/roughness ワークフロー です(glTF や多くのゲームエンジンの標準)。入力テクスチャは基本的に base color・metallic・roughness の3枚です。
| パラメータ | 意味 | 0 のとき | 1 のとき |
|---|---|---|---|
| metallic | 金属か非金属か | 誘電体:base color は拡散アルベド、F0 は約 0.04 の無彩色 | 金属:拡散なし、base color が F0(有彩色の反射)になる |
| roughness | 表面のミクロな粗さ | つるつる:鋭く強いハイライト、鏡面反射的 | ざらざら:広く淡いハイライト、つや消し的 |
| base color | 地の色 | metallic により拡散色 or 反射色として解釈 | 同左(役割が metallic で切り替わる) |
キモは metallic が base color の解釈を切り替える 点です。金属(metallic=1)は自由電子が光をほぼ表面で反射し内部に透過しないため 拡散反射を持たず、base color は鏡面反射の色(F0)そのものになります。非金属(metallic=0)は逆に、base color を拡散アルベドとして使い、鏡面反射は約 4% の無彩色に固定します。この物理的な排他関係を1つのスライダーに落とし込んだことで、パラメータの組み合わせが減り、破綻しにくくなりました。
Phong 時代は、特定のシーン照明で見栄えするよう ks や n を手作業で追い込んでいたため、別の環境に置くと質感が崩れました。PBR のパラメータ(metallic・roughness・base color)は照明と独立した 素材そのものの物理属性 です。エネルギー保存する BRDF に素材属性を与えれば、屋内でも屋外でも、点光源でも環境光(イメージベースドライティング)でも一貫した見え方になります。これが写実的レンダリングとアセット再利用性の両方を支えています。
PBR が守る不変量 ── エネルギー保存の実装
最後に、拡散と鏡面をどう足すかがエネルギー保存の要です。フレネル F は「鏡面に回る光の割合」でもあるため、残りの (1 − F) を拡散に回し、さらに金属では拡散をゼロにします。
最終的な出射(点光源1つ、方向 L):
kd = (1 − F) × (1 − metallic) // 拡散に回せる割合
diffuse = kd × albedo / π // 正規化ランバート
specular = (D × F × G) / (4 × (N·V) × (N·L))
Lo = (diffuse + specular) × lightColor × (N·L)
(1 − F) を掛けることで 鏡面が強い角度・素材ほど拡散が自動的に弱まり、和が入射光を超えません。ランバートを π で割るのも半球積分での正規化で、Phong 系にはなかった配慮です。こうした「取り合い」と「正規化」の積み重ねが、PBR を物理的に一貫させています。
まとめ
- シェーディングの中核は BRDF であり、古典モデルはそれを経験式で、PBR は物理法則で近似 したもの。
- ランバートは N·L の余弦則による拡散、Phong/Blinn-Phong は反射ベクトル R あるいは半角ベクトル H のべき乗で鏡面 を近似するが、エネルギー保存もフレネルも保証しない。
- PBR の鏡面(Cook-Torrance)は D(GGX 法線分布)・F(フレネル)・G(幾何遮蔽)の積 で組み、拡散と足しても入射光を超えないよう
(1 − F)で取り合わせる。 - metallic/roughness ワークフロー は、金属か否かとミクロな粗さの2軸で base color の解釈とハイライトの広がりを一貫制御し、照明に依存しない素材属性として扱えるのが最大の利点。
グラフィックス Article
シェーディングと物理ベース描画(PBR)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
PBR
比較で見る軸
難易度: advanced / カテゴリ: グラフィックス / タグ数: 6
導入後に効く点
PBR は BRDF に基づき、フレネル・マイクロファセット法線分布(GGX)・幾何遮蔽の3項でエネルギー保存する鏡面を組み、拡散と足しても入射光を超えないよう設計する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- グラフィックス
- タグ数
- 6
判断チェックリスト
- 自社の用途が「PBR / シェーディング」に近いか確認する。
- 強みである「ランバートは拡散、Phong/Blinn-Phong は反射ベクトルや半角ベクトルで鏡面ハイライトを近似するが、エネルギー保存もフレネルも保証しない経験モデル。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。