概要
↓↓前回記事↓↓
前回の実装では数式の数値がそのままパラメータになっていて
非常に使いにくいことがわかりました
今回はこの欠点の解消としてのPBRという側面で話していこうと思います
PBR(Physical Based Rendering:フィジカルベースドレンダリング)
光の反射、屈折、散乱、吸収など物理現象としての光学現象の計測を行い、厳密な数式を用いてモデル化したレンダリング手法
「厳密な」といっても負荷軽減・処理高速化のために計算を簡略化するのはよくある話なので
私は
「被写体の質感(アルベド・反射率・ラフネスなど)をベースによりリアリティのあるレンダリングを行う手法」
だと思っています
前回の記事でランバート・フォン反射モデルをそのまま実装すると
パラメータ管理が難しく、テクニカルアーティストが環境・材質ごとにマテリアルを用意することになります
これをより厳密な数式を用いることで、直観的なパラメータで複数の環境に対応します
すると普通のデザイナーでもマテリアルを量産可能になり、成果物の物量が増えるというメリットがあります
パラメータ
実装方法やツールなどで変わりますが、
アルベド(Albedo)(Base Color)
「受けた光をどれだけ反射するか」という係数になりますので、反射する光(見た目の色や明るさ)は受ける光の強さに比例します。
反射率 (Reflectivity / Metallic / Metalness )
鏡面反射の強さ
Metallicでは金属の特徴の強さを示してます
設定値が大きくなるほど鏡面反射が強くなり黒味を帯びます
↓↓Unity Standard ShaderのMetalic比較。右に行くほど金属性が強い
ラフネス (Roughness / Glossiness / Shininess )
表面の粗さ。粗いほど拡散反射が起こりやすいためです。
光の反射に影響する「物体表面のミクロレベルの凹凸」を、その材質の物理的・幾何的な微細形状を考慮した、数学的な数式モデルとして数式化しています
TODO マイクロファセットの説明
↓↓Unity Standard ShaderのSmoothness比較。左に行くほどラフネスが強い
Unity Standard Shader
Unity のStandard Shaderでは Albedo / Metallic / Smoothness が用意されています
表現するリアリティのあるレンダリングとは?
じゃあアルベド・反射率・ラフネスを使って何を表現するのか?
なにをもって「リアリティのあるレンダリング」になるのか?
メジャーなPBRでは現実世界で起こっている反射を分解して下記の要素を表現しています
鏡面反射(スペキュラー)
鏡や金属などは光を強く反射します
反射角に露骨に光が跳ね返るため光沢が出ます
反射率はここに大きく影響します
拡散反射(ディフューズ)
現実世界では物体に光が当たると様々な方向に反射します
光線の反射角が視線に近いほど明るく、遠いほど暗くなります
今回はもう少し要素分解します
マイクロファセット
物体の表面には細かな傷・凹凸があります
これにより光は多方面に散乱され、ぼやけた表現になります
ラフネス値はここに大きく影響します
幾何減衰
物体表面に凹凸があると入射光にたいし影になる部分があります
これにより凹凸が大きいほど色味が暗くなります
フレネル効果
光が物体と平行になるほど、反射率が上がります
海の彼方にいくほど、鏡のように空の色を反射していることに気づくでしょう
サンプル画像の球体の輪郭が白くぼやけているのがフレネル効果です
環境光
今までは何もない空間に光源を置いた状態で物体がどういう見た目になるかを論じていました
しかし現実世界では物体の周りにはたくさんの物が置いてあり
鏡の性質が強いほど、周りの物体を映し出すようになります
これは周囲の物体も同じく光を受け反射しており、
その光が被写体にぶつかることでまた反射することで鏡のように映っています
UnityではSkyboxを映すことで簡易的に環境光を再現しています
レイトレーシングでは実際に光をシミュレートすることでよりリアリティのある表現をしています
エネルギー保存則
学校の物理でエネルギー保存則を学んだと思います
これにより入射した光と反射した光の合計は等価になります
まとめ
PBRがなぜ生まれ、なぜ3つのパラメータをもち、どういうロジックでレンダリングされるか
なんとなく理解できたと思います
ランバート・フォン反射モデルをただ実装するよりも多くの環境に対応でき、
パラメータが直観的なので非プログラマーでも扱えるのが大きなメリットです
参考資料