HDRPで白飛びを直す方法(ライティングの設定を理解する)

## はじめに
今回の記事はUnity JapanさんがYoutubeで公開している「クオリティを引き上げる！Unity HDRPのライティング、カメラ、ポストプロセス設定」という動画の内容を一部まとめたものです。

この動画を参考にHDRPのライティング設定を直せば，下記のような白飛びが発生しなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/01084771-0a3b-a328-1363-4851427c8269.png)
また，公式の動画はこちらです。

https://youtu.be/Ex7B94z-40Y

上記の動画では大まかに以下の４つの内容が解説されています。

- 昼のライトセッティング
- 夜のライトセッティング
- カメラの設定について
- フォグの設定について

そのうち今回の記事では白飛びを直す方法として，動画全体の４分の１である昼のライトセッティングまでの内容をまとめているので，更に詳細を知りたい方はUnity Japanさんの公式動画を視聴してください。


## 光について
まずHDRPではPhysical Light units（現実に存在する光の単位）以下PLUを採用しています。

今までのプロジェクトで使用されていた回転や大きさ等のシンプルな項目のみで操作できるライトではなくなった理由として，このPLUを細かく設定してあげることでまるで現実のようなクオリティの高いライディングの設定をすることができるようになるからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/23d0d32e-5624-73ad-ca28-433b18c64e80.png)
またこのPLUは現実世界の様々な場所で共有・公開されていて，我々も直ぐにその情報を手に入れることができます。

そしてこのPLUというのはひとつではなく，Unityで扱えるPLUには下記のものがあります。

- Candelas（cd）
- Lumens（lm）
- Luminance（nit）
- Lux（lx）
- EV100（EV）

詳細な説明は各項でします。

### Candelas
光源が特定方向を照らす光の強さ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/39a09520-d922-e905-90d8-de88abedd535.png)


### Lumens
光源が全方向に照射する光の総量。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/a09794fd-a986-933f-4be0-dd692b22d247.png)


### Luminance
テレビやモニター等の平面上の光源から発せられる光の強さ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/972ace2d-0221-fcdb-662a-3006604a26de.png)


### Lux
光源によって照らされた場所の最終的な明るさ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/6716d163-4e22-09fe-75f1-1d43a25b7d1d.png)
いまいち分からないという人は光の三原色で考えると分かり易いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/df4fad4b-1130-d20a-7aef-acc4896598a6.png)
まず，赤・緑・青のそれぞれの光の強さを数値に変換した際に，それぞれが１になるとします。
すると赤・緑・青が全て重なっている箇所は最も光が強くなり，それぞれの光の強さである１を足した総量は３になります。

この光の総量がLuxです。

また太陽から地球に照射される光の量もLuxで表されることが多いです。
その理由として，太陽は周囲全体を照らす光源（Lumen）ではありますが，その光源の殆どは地球とは無関係の場所を照らすので，LumenよりLuxで考えた方が合理的なのではないかということらしいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/87f1ebf2-56a2-328f-00c9-a6783adf2a46.png)


### EV100
EV100は概ねLuxと同じような考え方ですが，それを光の単位ではなくカメラの露出値に置き換えたものとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/5418ac4b-dc2f-aac5-3677-455dfde83cbd.png)
露出値とは，ある一定の明るさを基準にした際に被写体がどれだけ明るいかを表したものです。


## PLUについて
下記のようにPLUには凡その基準値があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/2f8e1d18-9d73-a245-5eae-20517c219822.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/0c09e53e-0fe0-3e6b-4977-24187fc572c6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/93fb1dd4-f7fe-77b3-d7de-59b7d7d9a0e3.png)
このような情報はネット上で数多く公開されており，ここに求めるシチュエーションがないといった場合であっても，検索すれば直ぐに見つけることができます。

また，現実世界から引っ張ってこれる情報はこれだけではありません。

光源の色を色温度という光の単位で取得することができます。
この色温度も明るさ同様に，一般化された情報があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/047b1923-fc6d-0fdd-d708-0a8692205ca3.png)


## 実際に使用する


### 環境光の設定
まずHDRP環境でディレクショナルライトを作成します。
そしたら，LightコンポーネントにあるEmission / Intensityを設定します。
（今回は非常にまぶしい日中を再現したいので，数値を120,000にします）

この際，Shadow / Enableにもチェックを入れておきましょう。
（ここにチェックがないと影が生成されません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/04c5845d-1323-3cee-0cf2-db5bf7ae5c14.png)
設定が終わると画面が白くなってしまいますが，これは後程カメラの設定をした際に解消されるので今の段階では何もしなくていいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/5326df66-d100-3751-b55a-7ed8d5d3ab45.png)
続いて色温度の設定もここで行います。
先ほどの表を参考に，再現したいものを入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/fc895df0-d91e-40d2-37ba-daea7689c351.png)


### 空を設定する
HDRPで空の設定を行うには，先にGlobal Volumeというオブジェクトを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/ccbe1864-03a3-602e-c322-820d43f4fc33.png)
作り立てのGlobal Volumeには単に領域を指定する効果しかないので，いろいろな効果を持たせる為のプロファイルを生成します。

Global VolumeのVolumeで新規をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/41d549bf-2afd-ff4d-4154-51dfd7163fdb.png)
すると新しくプロファイルが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/2c719f78-18c3-b173-6435-1708cfa36e31.png)
Volumeとプロファイルがそれぞれ独立しているので，別々のVolumeに同じプロファイルを再利用するということもできます。

続いて，空を作成する為インスペクタのAdd OverrideからVisual Enviormentという設定を作ります。
作成出来たら，以下のようにVisual Enviorment / Sky / タイプにチェックを入れ，横の選択欄からHDRI Skyを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/197a7454-935e-d203-9d90-7a1b8668a297.png)
続いてAdd Overrideをもう一度クリックし，Sky / HDRI Skyを生成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/ef4591ce-9d99-42f8-5b99-9ac5aa169454.png)
生成されたHDRI Skyの項目を以下のように切り替え，Hdri Skyからキューブマップを割り当てることでHDRP上で空を作ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/51c3d264-ceb3-1712-fdd8-e2ce841022f6.png)
しかし現在の状況では，地上に照射されている光はディレクショナルライトによるものが全てです。

実際はディレクショナルライトによるものだけではなく空も地表を照らしているので，ディレクショナルライトのインテンシティを下げ空のインテンシティを上げる必要があります。

その為にHDRI Sky / Intensity ModeをLuxに切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/ee9835f0-794f-9c57-0192-4fcb98945762.png)
この設定を行うとIntensity Modeの下にあったExposureがDesired Lux Valueに切り替わります。

このDesired Lux ValueにLuxを基準に調整した数値を入力してあげることで，ライティングが完成します。入力する値は「太陽：空」の比で調整します。

割合は，

晴天時　５：１
曇り時　４：１

です。

今回は非常にまぶしい日中を再現する為に値を120,000Luxと設定しているので，Desired Lux Valueに20,000，ディレクショナルライトに戻りIntensityを100,000に設定してあげてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/317f4349-5a6d-8b27-4646-bd5edede7941.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/d1c0a51f-2f8a-0b91-9934-692129645f5c.png)


### カメラの設定
※ 空の設定からここまでかなりスキップしています。

VolumeにExposureの設定を追加します。
作る場所は空と同じVolumeでも，別の場所でもいいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/78b3eceb-70c3-1363-e4f1-8b8587c41865.png)
Exposureを導入することで，カメラの露出値（EV100）を設定することができます。

Exposureにある項目にチェックを入れ，Fixed Exposureの値を調整します。
今回は13の値を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/749a1bee-1805-656e-922e-e5c0248d803a.png)
これだけで画面の眩しさが抑えられ，イメージ通りになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/7e8b4c71-1cc4-d004-e7e7-ba1523de5ec9.png)
以上までが白飛びを直す方法です。