Unity 2019.3のHDRP (DXR使用)のプロジェクトを作成

## UnityでのDXRの使用

Unity 2019.3でGPUのレイトレーシング(DXR)がHDRP上で使用できます。
2020年2月段階ではまだプレビュー版になります。

Unity 2019.3でのレイトレーシング対応については、以下が参考になります。    

HDRP 7.1
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@7.1/manual/Ray-Tracing-Getting-Started.html

HDRP 7.2
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@7.2/manual/Ray-Tracing-Getting-Started.html

ここでは上記のマニュアル操作で、HDRPのDXRを使用する初期シーンを作成していきます。    

## 確認環境

* OS : Windows 10
* GPU : NVIDIA GeForce GTX 1060 6GB
* Unity : Unity 2019.3.0f6 + HDRP 7.1.8

## HDRPのバージョンによって仕様が変わる (2020/02/18 追記)

HDRPでのDXR対応はまだプレビュー版であるため、HDRPのバージョンが上がると仕様が変わる場合があるようでした。
ここでは、HDRP 7.1.8から7.2.1にアップデートしたときのメモ書きです。

* Path Tracing使用時に、Scene Viewでの更新がスムーズに行えるようになった
* Tier1/Tier2の指定が不要になった (自動判別 ?)
* HDRP/LayeredLitが正しく動作するようになった

## DXRが使えるGPUについて

注意点として、DXRが使える環境でないとUnityのGPUのレイトレーシングは動作しません。   

* Windows 10環境 (Direct3D12が使える必要がある)
* NVIDIA GeForce GTX 1060 6GB以降/ GeForce RTX20系

DXRについては、NVIDIAのサイトの説明をご参照くださいませ。    
https://www.nvidia.com/ja-jp/geforce/news/geforce-gtx-dxr-ray-tracing-available-now/

## DXRの効果

影/反射/透過（屈折）がレイトレーシングで行われます。
レイトレーシングとは、特定の位置（視点や光源など）から位置と方向を持ったレイを飛ばし、
シーン上の物体に当たるか判断するレンダリング手法です。
![unity_dxr_101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/1da0f8b8-671a-6e83-f2b6-00092234fb56.png)

レイトレースを使うことにより、光学的に素直なレンダリングができるようになります。
反射による映り込みや透過による屈折が、リアルタイムのフェイクではない現実に近づくことになります。
複雑な（というよりも再帰のある）計算になるため今までGPUには向かなかったのですが、昨今ではレイトレース処理をGPUで計算したり、
DXRのようにハードウェアで実装されたりしてきてます。
GPUでレイトレーシング処理を行えるようになることで、反射や透過、影などをリアルタイムで表現できるようになります。
ただし、依然負荷のかかる処理になるため、相応のGPU(RTX20系でより高価なもの)でないと重いです。
UnityのDXRでは、直接照明や一次反射にのみレイトレーシングを使う(Tier1)、
間接照明の計算（パストレーシング）でレイトレーシングを使う(Tier2)、の2つのモードがあります。

## Unity 2019.3のHDRPでDXRを有効にする

Unity 2019.2以前ではDXRは実装されていません。
Unity 2019.3以降を使用します。

Unity Hubで新規プロジェクトを「HDRP」として作成します。
![hdrp_dxr_000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/32227a6a-1585-f9c5-89b4-be0362fcdc4c.jpeg)
Unity Editorを開き、メインメニューの「Window」-「RenderPipeline」「HD Render Pipeline Wizard」を選択します。
「HD Render Pipeline Wizard」ウィンドウの「HDRP + DXR」タブを選択し、「Fix All」ボタンを押します。
![hdrp_dxr_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/4f1ab92d-5bd2-7c6e-4b26-984ca7cf00b5.png)
途中で再起動を促されるのでUnity Editorを再起動します。
Unity Editor起動後に再度「HD Render Pipeline Wizard」ウィンドウを開き、
「HDRP + DXR」タブを選択し、「Fix All」ボタンを押します。
これにより、「HD Render Pipeline Wizard」ですべてのチェックボックスがOnになるのを確認します。

メインメニューの「Edit」-「Project Settings」を選択し、
「Player」タブを選択します。
「Other Settings」の「Auto Graphics API for Windows」チェックボックスがOffになっているのを確認。
「Graphics APIs for Windows」のリストの先頭に「Direct3D12 (Experimental)」が存在するのを確認します。
![hdrp_dxr_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/ea655ca6-61d6-131a-74e2-d06eae0a57c7.png)
また、Unity Editorウィンドウのキャプションに DX12 があるのを確認します。    

Project Settingsの「Player」タブで、「Static Batching」チェックボックスをOffにします。

Scene Viewの表示のポップアップメニューを選択し、「Animated Materials」をOnにします。
![hdrp_dxr_001_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/2e865d7f-1b32-398a-e1e8-483946d43280.jpeg)
レイトレーシングの機能は、複数回のフレームでサンプリングを行う動作があります(Denoiseなど)。
「Animated Materials」がOnでない場合は、Scene Viewでの画面更新が繰り返し行われません。

## レイトレーシングのモードについて

※ HDRP 7.1.8時のものです。HDRP 7.2からは不要になりました。

レイトレーシングのモードとして、速度優先の「Tier1」と品質優先の「Tier2」というものがあります。
「Tier1」は一次レイのみのレイトレーシングで使用できます。パストレーシングが使えません。
「Tier2」はレイの複数回の反射に対応しており、パストレーシング（間接照明）をDXRで動かすことができます。
ただし、それだけリソースの消費が大きく計算時間もかかります。

Projectウィンドウで「Settings/HDRenderPipelineAsset」を選択し、Inspectorを見ます。
これは、現在のサンプルシーンで割り当てられているHDRP用の設定ファイルになります。
![hdrp_dxr_003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/cf128714-9e2e-8add-cf58-c70416326fc0.jpeg)
「Raytracing Tier」で「Tier1」か「Tier2」を選択できます。

HDRenderPipelineAssetを複製し、Tier1用とTier2用に分けて運用するのもいいかもしれません。
この指定は、メインウィンドウの「Edit」-「Project Settings」を選択し、Graphicsを選択します。
Scriptable Render Pipeline Settingsで指定できます。
![hdrp_dxr_003_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/8c221c01-0591-4796-578d-9826ab5c2f14.png)
以上で、HDRPでDXRを使用できるようになりました。
その他の指定が [HDRPのドキュメント](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@7.1/manual/Ray-Tracing-Getting-Started.html) には書いてありましたが、スキップしても動作しています。

## シーンごとにProfileを複製または作成

サンプルシーンのうち「Sky and Fog Volume」と「Post Process Volume」に、HDRPで必要な設定が含まれています。
これらを、カラのGameObjectを作成し「Settings」と名前変更し、
この中にまとめるようにしました。
![hdrp_dxr_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/86efbdb8-13c3-9d94-65e8-bf522bc1637a.png)
それぞれは「Volume」のコンポーネントに要素がリストとして格納されています。    
これらに含まれる情報は以下になります。

|GameObject名|内容|    
|---|---|    
|Sky and Fog Volume|Visual Environment/HDRI Sky/Fogなど。<br>背景とフォグの要素。|    
|Post Process Volume|Vignette/Exposure/White Balanceなど。<br>Post Procssingの要素。|    
これらは、Profileというファイルに情報が保存されます。 
新規にシーンを作成したときにProfileが存在しない場合は作成(New)する必要があります。
既にProfileが存在する場合は複製(Clone)できます。
「Volume」コンポーネントでのProfileの作成や複製操作はすべて同じ手順になります。

### Profileの作成 (New)
![hdrp_dxr_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/237d86d0-a15c-4ce1-fd3d-45a8c74efe7c.png)
Inspectorウィンドウで、Volumeコンポーネントの「Profile」でProfile名を選択すると、Project内で割り当てられているProfileが選択されます。
「New」ボタンを押すと、新しくProfileが生成されます。
Project上ではシーンファイル(*.unity)を保存したフォルダの直下に、シーンファイル名と同じフォルダが生成され、
そこにProfileが保存されます。
なお、lightmapの結果などはこのフォルダに格納されます。

### Profileの複製 (Clone)
Inspectorウィンドウで、Volumeコンポーネントの「Profile」の「Clone」ボタンを押すと、
既存のProfileが複製されます。
保存場所は、複製元のProfileと同じフォルダ内です。
Projectウィンドウで、複製されたProfileをシーンファイル名と同じフォルダ内に入れておくのが管理しやすいかと思います。
例えば以下の画像の場合は、
「test.unity」が現在開かれているシーンの場合、同じフォルダ上の「test」フォルダにProfileを格納しておきます。
![hdrp_dxr_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/4d66e57a-1311-b632-96ee-c6eb01c9b7ce.png)

## LightingでのProfileを割り当て

lightmapを行うときに表示するLightingウィンドウを開きます。
ここでProfileの項目があるため、「Sky and Fog Volume」で割り当てたProfileを指定します。
![hdrp_dxr_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/7814e60f-64bd-657f-584e-577908071af4.png)
「Static Lighting Sky」で「HDRISky」を選択すると、
lightmapベイク時に背景IBLは「Sky and Fog Volume」内の「HDRISky」を参照します。

## LightingでLightmap情報を削除

Lightingタブを選択し、「Generate Lighting」の「Clear Baked Data」を選択して、Lightmapデータを削除しておきます。
![hdrp_dxr_123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/aaeb7dec-3c0d-4aa0-99af-e742e8486da7.png)

## その他の追加要素を指定するGameObjectを作成

Ambient OcclusionやScreen Space Reflection、Ray Tracingの関連要素を別のGameObjectに追加して管理することにします。

カラ(Empty)のGameObjectを生成し、「Ray Tracing Settings」と名前変更しました。
これを「Settings」のGameObject内に入れます。
![hdrp_dxr_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/30630ca8-99b6-fb68-e84d-95ca0b8bfb2e.png)
Inspectorウィンドウを開き、「Add Component」ボタンを押して、「Volume」を検索して追加します。
![hdrp_dxr_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/aca37874-acda-0362-b481-7eb95f4810df.png)
Profileが存在しないため、「New」ボタンを押して追加します。
Profileの実体は、シーンファイル(*.unity)の直下のシーンファイル名のフォルダ内に保存されます。
「Add Override」ボタンを押して、必要な要素を追加します。
![hdrp_dxr_010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/4d92a10d-3a17-6a3d-a0a6-aec246984f05.png)
以下のように追加しました。
![hdrp_dxr_011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/3e186409-ca0f-038d-3313-4c2b233d81bc.png)

|要素名|内容|     
|---|---|    
|Lighting/Ambient Occlusion|角部分など、光が入りにくい箇所を暗くする遮蔽|    
|Lighting/Screen Space Reflection|後処理としての反射表現|    
|Ray Tracing/Global Illumination|大域照明計算|    
|Shadowing/Shadows|影表現|    
それぞれは、Project Settingsの「HDRP Default Settings」をオーバーライドするものになります。
それぞれの使い方については、別途説明していきます。

## ひな型のシーンとして不要なGameObjectを削除し、保存

最低限シーンに必要な要素だけを残し、以下のようにしました。
![hdrp_dxr_012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/6465c0a9-d262-fde7-464a-4e270ae2af49.png)
サンプルシーンとしての形状や光源、Light Probeは削除しました。

シーンでは、3つのProfileの作成(複製)と、Lightingに「Sky and Fog Volume」のProfileを割り当てる処理を行いました。
この処理は、プロジェクト内のシーンごとに別途指定するのがよいかもしれません。

## Unity 2019.3のHDRP (DXR使用)のその他の記事

* [Unity 2019.3のHDRP (DXR使用)で簡単なシーンを作成 (Tier2)](https://qiita.com/ft-lab/items/6d12cd98d8ad7b40e7af)
* [Unity 2019.3のHDRP (DXR使用)でのPost Procssing](https://qiita.com/ft-lab/items/0a98ed242f1254f8ece5)
* [Unity 2019.3のHDRP (DXR使用)でLightmapと併用 (Tier1)](https://qiita.com/ft-lab/items/72862ce440f36be78293)

## 更新履歴

### 2020/02/18
* HDRP 7.2.1時の情報を追加

### 2020/02/12
* Unity 2019.3のHDRP (DXR使用)のその他の記事にページを追加