電通総研 テックブログ

電通総研が運営する技術ブログ

PBR(物理ベースレンダリング)マテリアル 入門編


(画像:Basic Theory of Physically-Based Rendering

こんにちは!金融ソリューション事業部の山下です。
今回は、近年進化が目覚ましい3DCGグラフィックスのクオリティを支えるPBR(Physical Based Rendering)について紹介します。

本記事では、入門編としてPBRの基礎理論やワークフローを紹介します。
また応用編として、Substance 3DやUnreal Engineを用いた制作フローを紹介する記事も別途執筆予定です。
PBRマテリアルの生成事例については、Substance Samplerを用いたこちらの記事でも紹介しているので、ぜひご覧ください。

1. PBRとは?

PBR(Physical Based Rendering)とは、現実世界の光の振る舞いを近似させる3DCGレンダリング手法です。
従来のレンダリング手法では、物理原則に基づかない比較的シンプルな近似を行う「Lambert反射モデル」や「Blinn–Phong反射モデル」が採用されていました。
PBRの原理に沿ったマテリアルを使用することにより、リアルな質感や照明をシミュレートしてより正確かつ自然な見た目を実現できます。

PBRの活用は、2000年~2010年代にゲームや映画業界から始まりました。GPUハードウェアやGraphic API、リアルタイムレンダリング技術の進化に伴い普及が進んだ結果、現在では主要な3Dファイル形式(glTFFBXなど)においてもPBRパラメータが採用されています。

一点誤解されやすい点を補足しますと、PBRはトゥーンレンダリングやNPR(非フォトリアルレンダリング)などアニメ調の作品においても有効に機能する技術です。そのため、PBRはPixarやDisneyの映画でも採用されています。

(画像:SIGGRAPH 2013 Course: Physically Based Shading in Theory and Practice

2. PBRの基礎理論

現実世界における光の挙動を再現するための主要な原理/法則について、以下、概要のみ紹介します。

2-1. エネルギー保存の法則:拡散(Diffuse)と鏡面(Specular)反射

エネルギー保存の法則は、物理学においてエネルギーが変換される過程でその総量が一定であることを示す基本原則です。

PBRにおいては、光の反射や散乱に関する計算手法(BRDF:Bidirectional Reflectance Distribution Functionなど)においてこの法則が適用されています。

具体的には、入射光が物体の表面に当たる際、光のエネルギーは以下2つに分散します。

  • 拡散(Diffuse)反射光:物体の内部で散乱され、再び表面から放出される光。物体によって吸収/放出される光の波長が異なる。その結果、物体の色が異なって見える。
  • 鏡面(Specular)反射光:物体の表面から反射される光。完全な平面では入射角と反射角が等しくなる。物体表面が滑らかなほどハイライトは小さく明るくなり、粗いほど大きく暗くなる。


(画像:Basic Theory of Physically-Based Rendering

この法則に基づき、PBRでは「反射光の総エネルギーは、入射光のエネルギーと等しい」という現実世界の光の挙動を再現しています。

2-2. 金属(Metal)と非金属(Non-Metal)

PBRマテリアルにおいて、「金属か非金属か」という観点は非常に重要になります。
表面が金属の場合、鏡面反射が強調されて拡散反射はほとんど存在しません。これにより、金属表面は光沢感が強く、反射が明確に現れます。一方、非金属の場合、鏡面反射は比較的弱くなり、逆に拡散反射の影響が強まります。

また、鏡面反射の色は、金属の場合は金属自体の色で染まります。一方、非金属の場合、鏡面反射はほとんど白に近い色になります。

(画像:THE PBR GUIDE BY ALLEGORITHMIC

2-3. 吸収(Absorption)と散乱(Scattering)

吸収は、物体が光を吸収する現象です。吸収された光は一般的には物体内部で熱エネルギーに変換されます。
散乱は、光が物体内部や表面で乱反射される現象です。

半透明な物体では、光が物体の内部で散乱した後に表面から出てくる現象(SSS:Subsurface Scattering)が発生します。特にこの現象は、人肌や大理石、ろうそくや乳製品などで顕著に現れます。

(画像:Wikipedia: Subsurface scattering)

2-4. フレネル効果(Fresnel Effect)


(画像:Fresnel Reflection and Fresnel Reflection Modes Explained

フレネル効果は、光が物体の表面と交差する角度によって、その反射率が変化する現象です。
例えば、上記画像のように水面を上から見下ろした際、近い部分(視線と物体表面の角度が大きい)では水面の底が透けて見えます。一方で遠い部分(視線と物体表面の角度が小さい)では、完全に反射光しか見えません。

つまり、視線と物体の表面となす角度が小さいほど(鋭い角度で見るほど)、反射率が高くなります。
このフレネル効果は、水だけでなく布や木などの物体にも全て発生します。

PBRではフレネル効果を考慮することで、物体表面の光沢感や金属質感を表現します。

(参考:THE PBR GUIDE BY ALLEGORITHMIC
DCCツールにおいては、上記の通り正面から垂直に物体を捉えた点の反射率を「F0」として扱います。このF0は、物体のIOR(屈折率)によって一意に導き出すことができます。


(画像:THE PBR GUIDE BY ALLEGORITHMIC
また、F0は一般的な非金属で2~5%程度、金属では60~70%程度となっており、いずれも側面における反射率はほぼ100%となります。

2-5. マイクロファセット理論


(画像:THE PBR GUIDE BY ALLEGORITHMIC

マイクロファセット理論は、物体の表面を無数の微小な平面(マイクロファセット)の集合として扱う理論です。
マイクロファセットはそれぞれ異なる向きを持っているため、光はそれぞれ異なる方向に反射されます。物体表面全体における反射は、各マイクロファセットによる反射の合成として計算されます。
PBRでは、物体表面の粗さ(Roughness)や凹凸(Normal)といったテクスチャマップを用いることで、メッシュよりも細かい単位の光の散乱や反射を計算します。

3. PBRにおける主要ワークフロー

PBRマテリアルを作成/利用する場合、Metallic/RoughnessとSpecular/Glossinessという2つのワークフローが主流です。

3-1. Metal - Roughness

テクスチャマップによって「金属度」と「粗さ」を制御するワークフローです。

  • メリット
    • 調整が直感的であり、シンプル。鏡面反射のマップを持たずF0値のデフォルトが設定される為、非金属における反射率の設定破綻がしにくい(物理的にありえない値にはなりにくい)
    • 比較的、テクスチャのメモリ使用量が少ない(1 RGB:Albedo)
    • ほとんどのDCCツールで採用されている
  • デメリット
    • F0値のコントロールができない。(※ UEではSpecular Inputが用意されている為デフォルト値からの調整が可能)
    • 金属度マップは原則バイナリ値で表す為、低解像度の場合にテクスチャ補完によってEdge Artifactが発生しやすい

3-2. Specular - Glossiness

テクスチャマップで「鏡面反射」と「光沢度」を制御するワークフローです。

  • メリット
    • Specular MapにてF0値のコントロールがしやすい
    • 比較的、Edge artifactが発生しにくい
  • デメリット
    • 調整が難しい(F0値が物理法則的に破綻する可能性がある)
    • 比較的、テクスチャのメモリ使用量が多い(2 RGB:Albedo, Specular)

どちらのワークフローもそれぞれの利点があり用途や好みに応じて選択されますが、本記事ではUnreal Engineでも採用されているMetallic/Roughnessワークフローに沿って説明します。

4. 各テクスチャマップの概要(Metallic/Roughnessワークフロー)

PBRワークフローでは、複数の画像素材(テクスチャマップ)を用いてマテリアルを表現します。
各テクスチャ素材をDCCツールやゲームエンジンにおいて適切に組み合わせることで、PBRの表現が可能になります。

各マップにおけるテクスチャのサンプル画像は、こちらの記事にて、Substance Samplerを用いて生成したこちらのマテリアルを使用します。

マテリアルの完成系は、こちらです。

4-1. BaseColor(Albedo)Map


物体の基本色を表すマップです。RGB(Vector 3)で、0~1の値として表します。
従来のカラーマップとは異なり光の影響や陰影、反射などは含まれていないため、Albedoマップは明るい色調になることが特徴です。
実際のテクスチャ制作ではDCCツールを用いる手法のほか、カメラと偏光フィルターを用いた撮影による制作手法などがあります。

4-2. Metallic(金属度)Map


表面の金属性を表すマップです。
グレースケールで、通常は黒か白かの2値のみで表現します(0が非金属、1が金属)。
今回のサンプル画像は非金属のため、黒一色となります。
白(値が高い)が金属、黒(値が低い)が非金属を示します。
金属マップは、物体の反射特性を制御し、金属質感や非金属質感を区別する役割があります。

4-3. Roughness(粗さ)Map


物体の表面の粗さを表すマップです。0~1のグレースケール値で表します(0がつるつる、1がざらざら)。
粗いほど表面がざらつき、光の散乱が大きくなります。
3Dモデルの表面の粗さを表現します。白(値が高い)は粗い表面、黒(値が低い)は滑らかな表面を示します。
粗さマップは、光の反射や散乱の度合いを制御し、質感や光沢感を調整する役割があります。

4-4. Normal(法線)Map


物体の表面の微細な凹凸を表すマップです。RGB(Vector 3)で表し、RGBがXYZ座標に対応するベクトルとして扱います。
RGB値によって、各ピクセルの表面法線の向きが定義されています。
法線マップは、モデルのポリゴン数を増やさずにディテールを追加することができ、リアルな質感や陰影を表現する役割があります。これにより、高解像度のジオメトリを持たないモデルでも、細かいディテールを表現できます。

4-5. Ambient Occlusion(環境遮蔽)Map


表面の自然な陰影を表現するマップです。0~1のグレースケール値(0が遮蔽された黒、1が露出していて白)で表します。
表面の凹凸によって遮られる環境光を表現します。これにより、物体同士が接近している部分や凹んでいる部分に影ができ、リアルな陰影が表現されます。

4-6. Height(高さ)Map


物体表面の高低差を表すマップです。0~1のグレイスケール値(0が低く、1が高い)で高さを表します。
レンダリングを行う際に、高さの単位(ユニット)を設定する必要があります。

4-7. Specluar Level(鏡面反射レベル)Map


非金属物体に対する鏡面反射の係数を表すマップです。
UEではデフォルト値が0.5(F0が4%)として設定されていますが、この係数を調整できます。
Specular - GlossinessワークフローにおけるSpecular Mapとは異なる点についてご注意ください。

まとめ

いかがでしたでしょうか。
近年では、人肌や大理石など物体表面内部に浸透する光の振る舞いを表現するSSS(サブサーフェススキャタリング)や、幅広いレンジの明るさ情報を用いるHDRI(ハイダイナミックレンジイメージ)など、様々な新しい技術が開発されています。
さらに、Unreal Engine5などゲームエンジンの進化も伴うことで「現実と見紛う」レベルの3DCGがリアルタイムレンダリング可能になっており、今後も3DCG技術の進化とユースケースに目が離せません。

次回からは応用編として、Substance Designerを用いたPBRマテリアルの制作や、Unreal Engineにおけるレンダリング方法について紹介してきたいと思います。

現在ISIDはweb3領域のグループ横断組織を立ち上げ、Web3およびメタバース領域のR&Dを行っております(カテゴリー「3DCG」の記事はこちら)。

もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください!
私たちと同じチームで働いてくれる仲間を、是非お待ちしております!
ISID採用ページ(Web3/メタバース/AI)

参考

執筆:@yamashita.yuki、レビュー:@wakamoto.ryosuke
Shodoで執筆されました