UnityでHDRPのプロジェクトを作り、フォトリアルなリアルタイムレンダリングを行う

# HDRPとは
HDRPとは、High Definition Render Pipeline（高解像度レンダリングパイプライン）の略です。高品質のグラフィックスを実現するUnityの計算処理方法を指します。
PipeLineとは、3DCGの計算処理方法の1つで、3Dモデルのデータから2次元画像のイメージを作り出す多段階の過程全体と、それらの計算を高速化する手法を指します。

# HDRPが使えるUnityのバージョン
HDRPはUnityの新しい技術のため、UnityはUnity 2019.3を強く推奨しています。
https://forpro.unity3d.jp/unity_pro_tips/2020/05/14/1221/

UnityはLTSのバージョンをダウンロードします。LTSとはLong-Term Support（長期サポート）のことを指しています。
UnityとHDRPのパッケージには互換性があため、UnityのバージョンにあったHDRPパッケージをインストールします。

# 前提
新規でプロジェクトを作成するケースを記載しています。既存のプロジェクトをHDRPに変換する方法は記載していません。

# 全体の流れ
1. 新規シーンを作成
1. 既存のポストプロセッシングを削除
1. 色空間を切り替え
1. HDRPパッケージをダウンロード
1. High Definition Render Pipeline Assetを作成
1. High Definition Render Pipeline Assetをプロジェクトに割当
1. 3Dオブジェクトを取込
1. マテリアルを取込
1. テクスチャを取込
1. ノーマルマップのテクスチャタイプを変更
1. オブジェクトにテクスチャを割当
1. シーンにオブジェクトを配置

# 詳細
### 新規プロジェクトを作成
Unity Hubを起動します。新規作成の右の三角ボタンを押して、2019.4のバージョンになっていることを確認し、新規作成ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/1d005b27-680d-b98e-a911-259bb48b2171.png)

High Definition RPを選択し、作成ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/df16fd23-4f1b-dd0a-e192-ced368a6be73.png)

HD Render Pipeline Wizardのポップアップボックスが出てきた場合、Install Configuration Editable Packageを押して、新しいレンダリングパッケージをインストールします。インストールが終わったら、ポップアップボックスを閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/485f58b6-558f-549e-a09b-b4e26686c83d.png)

### 新規シーンを作成
立ち上がるとデモシーンが開きます。デモシーンを使わず、新規シーンを作成するので、File -> New Sceneを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/484be518-d53d-ff85-6f89-cd3dbe302165.png)

### 既存のポストプロセッシングを削除
HDRP には独自のポストプロセッシングがあるため、現在使用しているポストプロセッシングがあれば削除します。これを行うには、Window -> Package Manager -> Post Processingと入力して検索し、Removeをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/cf9f4b61-0664-b453-4936-cd48a6f264dd.png)

### 色空間を切り替え
Unity エディターでは、リニアワークフローとガンマワークフローの2つあります。リニア色空間を使用すると、ガンマ色空間よりも正確なレンダリングが可能です。これを行うには、Edit -> Project Settings -> Playerカテゴリで、Color Space を Linear にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/5aecce81-222b-4a76-d30a-d21f55715b2e.png)

### HDRPパッケージをダウンロード
Window -> Package Manager -> Post ProcessingHigh Definition RPと入力して検索し、Installをクリックします。前段でインストール済みの場合は、Removeボタンを押せるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/ef063b96-642c-c0d3-819d-87978b1c4159.png)

### 3Dオブジェクトを取込
ProjectウィンドウのAssetフォルダ内で右クリックして、Create -> Folderを選択します。名称をObjectsに変更します。Objectsフォルダ内に移動し、右クリックして、Import New Assetsを選択します。fbxデータを取り込みます。

### マテリアルを取込
取り込んだオブジェクトをクリックし、InspectorウィンドウのMaterialsタブのLocationをUse External Materials (Legacy)、NamingをFrom Model's Materialにして、Applyボタンをクリックします。自動でMaterialsフォルダが作成され、中にマテリアルが保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/89c2ac2e-11fc-f371-830e-8596a0ce51dd.png)

ProjectウィンドウのObjectsフォルダ内で右クリックして、Create -> Folderを選択します。名称をImagesに変更します。

### テクスチャを取込
Imagesフォルダ内に移動し、右クリックして、テクスチャをドラッグ&ドロップします。

### ノーマルマップのテクスチャタイプを変更
取り込んだノーマルマップをクリックし、InspetorウィンドウのTexture TypeをNormal Mapに変更し、Craete from Grayscaleをオフにし、Applyボタンをクリックします。複数を選択すれば、複数を一度にNormal Mapに変えることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/f060d640-a64b-1b5b-d9e3-a3f906826799.png)

### オブジェクトにテクスチャを割当
Materialsフォルダの中のマテリアルをクリックし、InspectorウィンドウのBase Map、Metallic、Normal Mapの左の丸ボタンをクリックして、さきほど取り込んだ画像を割り当てます。HDRPでは、Metallic Map、AP Mapは使用しないようです（おそらく）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/492aa675-e301-aaf0-c707-0da9b408e12c.png)

### シーンにオブジェクトを配置
Projectウィンドウのオブジェクトをシーンにドラッグ&ドロップして、シーンにオブジェクトを配置します。この状態だと、真っ黒になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/5edf774f-6692-6c21-7c48-f0d5c4632a05.png)

### 環境光の設定
空や影等の環境光の設定をします。

#### 露出を設定
Unity HDRPではハイダイナミックレンジ（HDR）でデータが扱われているため、シーンではEXPOSURE（露出）のコントロールが必須の要素になります。HDRとは、RGB各8ビットの1677万色にとらわれず，幅広い表現域を用いてレンダリング工程を行う技法のことです。HDRを使うことで、黒つぶれしたり白飛びを抑え、明るい部分と暗い部分どちらの階調も犠牲にすることなく、よりリアルな描写が可能になります。
HierarchyウィンドウのSky and Fog Volumeをクリックして、InspectorウィンドウのAdd Override -> Exposureを選び、チェックを入れ、ModeをFixed、Fixed Exposureを8にします。

【Exposure値の目安】
晴天の屋外：14
明るい室内：9
街燈のある夜景：4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/81e59083-93af-af6f-1fc6-5a305706c861.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/3bf1a288-628b-d408-db7d-2fd0dce7aa66.png)

#### 空からの環境光による拡散反射表現を設定
色の要素を持つはずの拡散反射成分がないため、全体的にグレーの見た目になっています。空からの環境光が拡散反射成分に影響するようライティングの設定していきます。空からの拡散反射光表現にはBake（各3Dオブジェクトの表面のテクスチャに光や影を焼き付けること）を使用します。

#### 3DオブジェクトをStaticに変更
3DオブジェクトごとにStaticかDynamicのいずれかに分けます。地形、建物、固定の家具などの動かない形状はStatic（静的）とし、草、木、動くキャラクタなどの動く形状はDynamic（動的）とします。Staticの方が綺麗な影の表現ができますが、処理時間がかかります。
StaticにはBake処理を行い、DynamicのオブジェクトにはBake処理せずリアルタイムに光や影の計算処理を行うことで、処理速度とフォトリアル表現を実現しています。
Hierarchyウィンドウで3Dオブジェクトをクリックし、InspetorウィンドウのStaticにチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/3677c593-7e4d-7829-2674-50f672f6bf54.png)

#### Lighting Setting画面の表示
メインメニューのWindow -> Rendering -> Lighting -> Settingsを選択し、Lightingポップアップウィンドウを表示します。LightingポップアップウィンドウをInspetorタブの横にドラッグ&ドロップします。

#### 3DオブジェクトのStatic Lightning SkyをHDRISkyに変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/e54eb6d9-a2f0-cc53-73c7-837fa5e7da22.png)


#### Bakeの各種設定を変更してBake処理
Hierarchyウィンドウの3Dオブジェクトをクリックし、LightingウィンドウでBakeの各種設定を変更し、Generate Lightinigをクリックします。
Baked Global Illumination：ON
Lighting Mode：ShadowMask　（遮蔽をベイク）
Lightmapper：ProgressiveGPU （ProgressiveCPUと比べ高速）
Multiple Importance Sample：ON　（ノイズ軽減）
Filtering：Auto　（ノイズ軽減）
Lightmap Size：2048（大きいと品質が上がるが計算時間が増加）
Lightmap Parameters：Defoult-HighResolution
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/869bda9c-b6bf-5c51-0a6b-f305e573f87e.png)

Generate Lightingでベイクすると静的オブジェクトに空の環境光が反映されて、物体の色が見えてきました。これで、静的オブジェクトの鏡面反射、拡散反射のそれぞれの成分に空からの環境光が反映された状態となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/f3b2f46f-fd18-2629-e02c-8f09349909b1.png)

### 直接光を設定
太陽からの直接光の反射表現を設定します。

#### 太陽光の照度を設定
DirectionalLightは太陽光を想定し、Intensityの単位はLuxを使用します。
HierarchyウィンドウのDirectional Lightをクリックし、InspectotウィンドウのEmissionのTemperature、Intensityに値を入力します。
Luxは面積に対して照らされた照度で、その場所の明るさを表します。太陽光のような広範囲の場所に対して全体的に照らすライトには、分かり易いLuxを用います。色温度は正午の太陽光の5,000K近辺に設定します。

晴天の日の日向：100,000Lux　5,000～6500K
晴天の日の野外の日陰：10,000Lux
晴天の日の屋内窓際(北)：1,000～2,000Lux
晴天の日の屋内中央：100～200Lux
薄曇：50,000Lux　6,500K
暗い雨天：10,000～15,000Lux
日没：500Lux　2,000～3,000K
満月：0.2Lux　4,000K
晴天、月のない夜：0.0003Lux
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/07423235-788e-3afa-c643-dccc0a27c56f.png)

#### 影を設定
HierarchyウィンドウのDirectional Lightをクリックし、InspectotウィンドウのShadowのEnableにチェックを入れ、Resolutionに2048と入力します。これで影の解像度が細かくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/bb62fde8-564c-31fc-588c-3805d004f5a4.png)

さらに影の解像度を上げます。HierarchyウィンドウのSky and Fog Volumeをクリックし、InspectotウィンドウのAdd Overrideをクリックし、Shadowsで検索し選択します。
Cascade Count、Split 1,2,3にチェックを入れ、値を入力します。
Cascade CountはShadowマップが持つ枚数の事で数が多い方が、よりシーン内の影の解像度が高くなり距離に合わせて細かなコントロールが可能になります。数が多いとよりメモリ容量を圧迫します。
Splitは、各Shadow Mapの使用する範囲を設定します。数値はそれぞれのSplitの適用距離となっていて数値を下げると手前から適用される範囲が狭まり解像度は上がりますが、奥の解像度が荒くなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/d3352698-e9e2-565e-6f42-e4c166ea9cf3.png)

### 間接光表現を設定
直接光があたり、物体に反射した光の表現が入っていないので、とても単調で暗いシーンになっています。反射光を表現するGlobal Illuminationの効果を加えます。
Global Illuminationとは、物体に跳ね返った光が相互反射し伝播していくことを表現するレンダリング手法で、省略してをGIと呼ばれる事もあります。

GIを加えるためLighting SettingでLight mapを再度Bakeします。Bake後、反射光が反映され画面全体が明るくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/f1b86cd1-0667-ace0-3fcc-f1d70cff8f89.png)

### 間接光の追加
暗くなっている場所にライトを追加します。
Area Lightは、長方形の表面全体から均一に放射される光です。長方形の片側のみから放射します。
Point Lightは、この球形の中心点から全方向に広がる電球のような光です。
Spot Lightは、円錐形に放射されるステージライト、懐中電灯、車のライトのような光です。


**参考記事**
[Unity Pro Tips _ HD レンダーパイプライン（HDRP）を使ったゲーム制作](https://forpro.unity3d.jp/unity_pro_tips/2020/05/14/1221/)
[KlabGames _ Unity HDRPでのハイエンドグラフィック制作アプローチ](http://klabgames.creative.blog.jp.klab.com/archives/22443072.html)
[積木製作所 _ Unity Japan Office メイキング4 ～テクスチャ&マテリアル～] (http://tsumikiseisaku.com/blog/unity-japan-office-4/)
[のっぴの備忘録 _ HDRPを使ってみる](https://nopitech.com/2018/07/15/post-754/)
[Unity Blog _ HD レンダーパイプライン：アーティストのためのクイックスタートガイド](https://blogs.unity3d.com/jp/2018/09/24/the-high-definition-render-pipeline-getting-started-guide-for-artists/)