物理ベースレンダリング(Physical Based Rendering)の個人まとめ

# 概要
↓↓前回記事↓↓

https://qiita.com/tsune2ne/items/783d665260c8b2e4fcbd

前回の実装では数式の数値がそのままパラメータになっていて
非常に使いにくいことがわかりました

今回はこの欠点の解消としてのPBRという側面で話していこうと思います

# PBR（Physical Based Rendering：フィジカルベースドレンダリング）
:::note info
光の反射、屈折、散乱、吸収など物理現象としての光学現象の計測を行い、厳密な数式を用いてモデル化したレンダリング手法
:::

「厳密な」といっても負荷軽減・処理高速化のために計算を簡略化するのはよくある話なので
私は

:::note info
「被写体の質感（アルベド・反射率・ラフネスなど）をベースによりリアリティのあるレンダリングを行う手法」
:::

だと思っています


前回の記事でランバート・フォン反射モデルをそのまま実装すると
パラメータ管理が難しく、テクニカルアーティストが環境・材質ごとにマテリアルを用意することになります

これをより厳密な数式を用いることで、直観的なパラメータで複数の環境に対応します
すると普通のデザイナーでもマテリアルを量産可能になり、成果物の物量が増えるというメリットがあります

## パラメータ
実装方法やツールなどで変わりますが、


### アルベド(Albedo)（Base Color）
「受けた光をどれだけ反射するか」という係数になりますので、反射する光（見た目の色や明るさ）は受ける光の強さに比例します。

### 反射率 (Reflectivity / Metallic / Metalness )
鏡面反射の強さ

Metallicでは金属の特徴の強さを示してます
設定値が大きくなるほど鏡面反射が強くなり黒味を帯びます

↓↓Unity Standard ShaderのMetalic比較。右に行くほど金属性が強い
![Metalic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/862cb8a6-dead-b978-5a8b-5f0c24e66430.png)


### ラフネス (Roughness / Glossiness / Shininess )
表面の粗さ。粗いほど拡散反射が起こりやすいためです。

光の反射に影響する「物体表面のミクロレベルの凹凸」を、その材質の物理的・幾何的な微細形状を考慮した、数学的な数式モデルとして数式化しています
TODO マイクロファセットの説明

↓↓Unity Standard ShaderのSmoothness比較。左に行くほどラフネスが強い
![Smoothness.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/e72a2a73-a41a-4b74-e1f5-dba673fffcc2.png)


## Unity Standard Shader
Unity のStandard Shaderでは Albedo / Metallic / Smoothness が用意されています

![DefaultShader.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/0e58d11d-4add-b8c1-8a18-5de72c2ca079.png)

## 表現するリアリティのあるレンダリングとは？
じゃあアルベド・反射率・ラフネスを使って何を表現するのか？
なにをもって「リアリティのあるレンダリング」になるのか？

メジャーなPBRでは現実世界で起こっている反射を分解して下記の要素を表現しています

### 鏡面反射（スペキュラー）
鏡や金属などは光を強く反射します
反射角に露骨に光が跳ね返るため光沢が出ます

反射率はここに大きく影響します

### 拡散反射（ディフューズ）
現実世界では物体に光が当たると様々な方向に反射します
光線の反射角が視線に近いほど明るく、遠いほど暗くなります

今回はもう少し要素分解します

#### マイクロファセット
物体の表面には細かな傷・凹凸があります
これにより光は多方面に散乱され、ぼやけた表現になります

ラフネス値はここに大きく影響します

![ラフネスのサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/6e4b2901-33c4-a28e-c61d-a96957c5104d.png)

### 幾何減衰
物体表面に凹凸があると入射光にたいし影になる部分があります
これにより凹凸が大きいほど色味が暗くなります

![幾何減衰のサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/1fc4f8c7-093e-3507-841d-60228e01f082.png)

### フレネル効果
光が物体と平行になるほど、反射率が上がります
海の彼方にいくほど、鏡のように空の色を反射していることに気づくでしょう

サンプル画像の球体の輪郭が白くぼやけているのがフレネル効果です

![フレネル効果のサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/75886ba4-5dc3-c8c8-59ee-362dc73ec7d1.png)


### 環境光
今までは何もない空間に光源を置いた状態で物体がどういう見た目になるかを論じていました
しかし現実世界では物体の周りにはたくさんの物が置いてあり
鏡の性質が強いほど、周りの物体を映し出すようになります

これは周囲の物体も同じく光を受け反射しており、
その光が被写体にぶつかることでまた反射することで鏡のように映っています

UnityではSkyboxを映すことで簡易的に環境光を再現しています
レイトレーシングでは実際に光をシミュレートすることでよりリアリティのある表現をしています

![環境光のサンプル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/fbf59b39-298b-6b77-149b-1bd35101c8cf.png)

### エネルギー保存則
学校の物理でエネルギー保存則を学んだと思います
これにより入射した光と反射した光の合計は等価になります

# まとめ
PBRがなぜ生まれ、なぜ３つのパラメータをもち、どういうロジックでレンダリングされるか
なんとなく理解できたと思います

ランバート・フォン反射モデルをただ実装するよりも多くの環境に対応でき、
パラメータが直観的なので非プログラマーでも扱えるのが大きなメリットです


# 参考資料

https://tech.cygames.co.jp/archives/2129/

https://light11.hatenadiary.com/entry/2020/03/02/204305

https://qiita.com/emadurandal/items/3a8db7bc61438245654d