Unity 2019.3のHDRP (DXR使用)で簡単なシーンを作成 (Tier2)

HDRPでDXRを使用する手順については「[Unity 2019.3のHDRP (DXR使用)のプロジェクトを作成](https://qiita.com/ft-lab/items/fa61a4880375b5ea8a95)」をご参照くださいませ。
上記の作業直後では「Tier2」になっているようですので、そのまま進めます。
ここでは、シンプルなシーンでレイトレーシングの挙動を確認します。

## HDRPの要素

HDRPの要素は「[Unity 2019.3のHDRP (DXR使用)のプロジェクトを作成](https://qiita.com/ft-lab/items/fa61a4880375b5ea8a95)」での指定より以下を使います。
![hdrp_dxr_012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/75438c92-e347-2f8f-831c-8efe97bc3c25.png)

|GameObject名|内容|    
|---|---|    
|Sky and Fog Volume|Visual Environment/HDRI Sky/Fogなど。<br>背景とフォグの要素。|    
|Post Process Volume|Vignette/Exposure/White Balanceなど。<br>Post Procssingの要素。|    
|Raytrace Settings|Ray Tracing/Screen Space Reflection/Ambient Occlusionなど。|    

## 背景を変更

背景(IBLとしても使用)は、パノラマ（2:1の比率のequirectangularのexr/hdr）画像をキューブマップに変換して使用します。

equirectangularの以下のようなexr画像を作成しました。
![unity_dxr_102.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/795b0335-ac73-b993-e655-91e385ddb573.jpeg)
Insta360 EVOを使用し、HDRとして360度で撮影。
Affinity PhotoでHDRとして合成し、撮影者を消す加工を行い、exrファイルとして出力しました。

これをUnityのProjectにインポートします。
Inspectorウィンドウを開き、「Texture Shape」で「Cube」を選択して下にスクロールし、Applyボタンを押します。
![unity_dxr_103.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/12a50d03-a90d-90ab-45ac-7830efab950e.jpeg)
これで、equirectangular画像がキューブマップに変換されます。
![unity_dxr_104.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/16ecb246-bbe2-fd5f-9398-2e218d814270.jpeg)
Hierarchyウィンドウから「Sky and Fog Volume」を選択し、Inspectorを表示します。
Projectウィンドウから背景のキューブマップファイルをInspector内の「Volume」-「HDRI Sky」内の「Hdri Sky」にドラッグします。
これで背景が指定のものに置き換わります。
![unity_dxr_107.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/9484e594-af38-701c-fe41-8e2b75f17f5b.jpeg)
「HDRI Sky」の割り当てが存在しない場合は、「Add Override」ボタンを押して追加するようにします。

## Fogを調整

HDRPの初期シーンから移行した直後はFog(霧)がかかっています。
調整は「Sky and Fog Volume」の「Fog Attenuation Distance」で減衰距離（単位 m）を指定します。
![hdrp_dxr_105.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/56117330-58c6-2092-41ff-a96361357e84.jpeg)
値が大きいほど、霧は遠ざかります。
![hdrp_dxr_106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/dadc7c2d-ed87-08c2-a822-4114a27d841e.png)
霧はスクリーンに向かって奥方向と高さ方向の2つが使用されており、高さ方向を調整しないと水平線より下が白いままになってしまいます。
これを調整します。
左上の「All」を選択するとすべての項目が指定できるようになります。
![hdrp_dxr_107.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/1dc56813-7aba-dbc1-47d5-8e88d30d885f.jpeg)
「Maxixmum Height」の値を大きくすることで、高さ方向（単位 m）に拡散していきます。
![hdrp_dxr_108.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/5b669237-9fc4-7c8f-40b7-3d76964ac12f.jpeg)
ここでは、「Fog Attenuation Distance」を30000、「Maxixmum Height」を5000としました。
![hdrp_dxr_109.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/730345bf-e541-3811-088f-6fd065db9703.jpeg)
ほんのわずかにフォグを与えています。
このフォグは、リアルな奥行き表現で重要な要素になります。
光が差し込んだときのほこりのような表現（ボリュームライト表現）や、空気感はフォグで表現できます。

## オブジェクトを配置

オブジェクトとして、地面のPlane、Cylinder/Sphereを配置しました。
![hdrp_dxr_101.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/5893cdf7-74cf-d28f-784a-4a866b1f202b.jpeg)

## Directional Lightの確認

このシーンの場合は、背景からのIBLとしての光源と、
「Directional Light」(平行光源)の2つが光源として作用します。
![hdrp_dxr_102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/c7e0bcc3-6f8f-ac03-d4e1-d1eb141f7d58.png)
Inspector内のLightの設定で、「Emission」の「Intensity」で明るさを指定します。
影は「Shadows」の「Shadow Map」の「Enable」をOnにして調整できます。

## レイトレーシングの確認

マテリアルで鏡のような反射を割り当てて、レイトレーシングが機能しているか確認します。
Projectウィンドウ上を右クリックして新しくMaterialを作成します。
Inspectorを表示し、「Surface Inputs」の「Metallic」を1.0、「Smoothness」を1.0にします。
こうすることで、完全な鏡面反射になります。
これを球に割り当てます。
![hdrp_dxr_110.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/b2084bc2-6206-b9f1-6404-6f314e109961.jpeg)
LightmapやReflection Probeなどを使用していな状態でも、反射しているのを確認できます。
この段階ではScreen Space Reflection(SSR)が適用されています。

## レイトレーシングのパラメータを調整

「Ray Tracing Settings」に割り当てているレイトレーシングのパラメータを調整します。
Inspectorウィンドウを開いたときの「Volume」に各要素が追加されていない場合は、「[Unity 2019.3のHDRP (DXR使用)のプロジェクトを作成](https://qiita.com/ft-lab/items/fa61a4880375b5ea8a95)」の手順で追加しておきます。

### Ambient Occlusion
![hdrp_dxr_111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/c329275a-c1d8-6b07-c12d-d5f7acf346a8.jpeg)

「Ray Tracing」をOnにすると、レイトレーシングでのAOが使用されます。
Offにすると、SSAOとして動作します。
「Intensity」を大きくすることでAOの効果がかかります。
初期状態ではノイズがちらつくため「Denoise」をOnにします。
![hdrp_dxr_112.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/feb80eb9-7c36-19c9-127a-a4d84942a942.jpeg)

### Screen Space Reflection (SSR)

初期状態でも映り込みは反映されますが、
SSRの「Ray Tracing」をOnにすることで、レイトレーシングによるより正確な映り込みが表現されるようになります。
![hdrp_dxr_113.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/ad87fff8-a3b5-528b-83bb-b1da2c4268cb.jpeg)
Tier2の場合、反射回数を「Bounce Count」で指定できます。
Tier1の場合は、反射は1回だけです。

SSRパラメータの「Minimum Smoothness」値よりも反射があるマテリアルの「Smoothness」値が小さい場合、
映り込み効果は無効になります。
以下は、マテリアルのSmoothnessが0.8、SSRパラメータの「Minimum Smoothness」が0.9の場合です。
![hdrp_dxr_114.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/a92cd6ab-5f32-5c57-799c-b51c2d8f4de8.jpeg)
映り込みは背景だけになっており、地面や円柱が映り込んでいません。
SSRパラメータの「Minimum Smoothness」を0.8とすると以下のようになります。
![hdrp_dxr_115.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/c5e5a9f2-a3bc-25cd-44bf-cfafebc210b3.jpeg)
MaterialのSmoothnessが1.0よりも小さい場合はラフネス効果がかかり、サンプリング数を増やす必要があるためノイズが出ることになります。 
その場合は「Denoise」をOnにすると緩和されます。
![hdrp_dxr_116.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/907041df-a7ce-6ddf-6f12-511ab3013c44.jpeg)

### Global Illumination

GIの確認を行うため、cubeで壁や天井を配置しました。
GIが適用されていない場合は以下のようになります。
![hdrp_dxr_117.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/63560e14-1c72-9126-0a9a-0afc093cf71c.jpeg)
「Global Illumination」の「Ray Tracing」をOnにすることで、GIの間接照明の効果がかかります。
![hdrp_dxr_118.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/a6d80b3f-d848-112f-ec54-1a0d041f8398.jpeg)
「Denoise」「Second Denoiser Pass」をOnにすることでノイズを緩和できます。
![hdrp_dxr_119.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/70c385aa-248e-0e2e-9006-3d4b6326e986.jpeg)
Iter1の場合はGIとしての反復（再帰）回数は1回だけ、Iter2の場合は回数を指定できます。
Iter2で「Screen Space Reflection」と「Global Illumination」の「Bounce Count」を4とした場合は以下のようになります。
![hdrp_dxr_120.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/4c11c86c-ec74-d109-aee4-98fa88c89b42.jpeg)
ただし、「Bounce Count」を増やした場合はよりGPU負荷がかかることになります。
この「Bounce Count」の指定で強制的に指定回数分反射するからか、値を増やしたらより正確になる、というものでもなさそうです。
そのため、LightmapやReflection ProbeをこのGlobal Illuminationに置き換えることができるかというと、現状は難しいかもしれません。     

### Path Tracing (Iter2)

Iter2では「Path Tracing」を指定できます。
Iter1では指定できません。
![hdrp_dxr_121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/921911e1-3926-8846-20a5-4e0b8cf3c8b2.png)
これを使用する場合、「Ambient Occlusion」「Screen Space Reflection」「Global Illumination」の指定は無視されるようです。
「Enable」をOnにすると有効になります。
「Maximum Depth」で反射回数の最大を指定します。
以下のようになりました。
![hdrp_dxr_122.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/a5bc6f33-0ccf-e2da-54f5-9a3a406ccf38.jpeg)
HDRP+DXRの表現では、一番現実に近い表現になるかと思われます。
なお、レンダリング時間がかかります（GTX1060では3秒以上）。  

ただし、HDRI Skyの背景のExposureが極端に強くなったり、Fogがかからないようでした。
上画像は、HDRI Skyの背景の「Exposure」の値を10から1に変更しました。

また、Path Tracingを使用するとGPUリソースをたくさん消費するからか、シーンによってはうまくレンダリングされない場合がありました。

Post Processingの調整については「[Unity 2019.3のHDRP (DXR使用)でのPost Procssing](https://qiita.com/ft-lab/items/0a98ed242f1254f8ece5)」をご参照くださいませ。