Unity 2019.3のHDRP (DXR使用)でLightmapと併用 (Tier1)

Unity 2019.3のHDRP(DXR使用)の説明です。
プロジェクトの設定については「[Unity 2019.3のHDRP (DXR使用)のプロジェクトを作成](https://qiita.com/ft-lab/items/fa61a4880375b5ea8a95)」もご参照くださいませ。

木造の建築物を読み込み、これを使ってフォトリアルなシーンにしていきます。
ここでは「Tier1」を使用し、間接照明はLightmap + Reflection Probe + Light Probeを併用しました。

なお、この木造建築のシーンはGitHubの「[Unity2019_3_HDRP_DXR_RoomTest](https://github.com/ft-lab/Unity2019_3_HDRP_DXR_RoomTest)」にプロジェクトを公開していますので、こちらもご確認くださいませ。

ここで行うことは以下になります。

* Iter1を使用する
* Ambient Occlusion/Screen Space Reflectionでレイトレーシングを使用
* Global Illuminationのレイトレーシングは「使用しない」
* 間接照明(GI計算)部はLightmapのベイク処理に置き換える

DXRの効果として、Ambient Occlusion/Screen Space Reflectionでレイトレーシングする、ということになります。
それ以外は普通のHDRPと変わりません。

## Tier2での表現 (参考)
リファレンスとして「Tier2」の「Path Tracing」使用と比較します。
この段階では、まだLightmapのベイクやReflection Probeの配置は行っていません。
「Ambient Occlusion」「Screen Space Reflection」「Global Illimination」をすべてOffにして、
レイトレーシングを使用しないようにすると以下のようになりました。
![hdrp_dxr_300.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/54140255-dcce-e287-6236-0b9f4f8cd223.jpeg)

### 「Path Tracing」を有効にする (Tier2)

Tier2で「Path Tracing」を有効にし、「Maximum Samples」を512、「Maximum Depth」を5にしました。
![hdrp_dxr_302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/520d9fe8-2dad-38ee-4a81-b514f5a4a2ae.png)

Path Tracing未使用時のままのIBLの場合は明るすぎるため、「Sky and Fog Volume」の「HDRI Sky」の「Exposure」を10から2に変更しました。
以下のようにレンダリングされました。
![hdrp_dxr_301.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/fb2f9fd9-8fc8-bbf1-b2fc-063b78b57e0d.jpeg)

「Post Process Volume」の「Exposure」の「Fixed Exposure」を8.7から6.0に変更し、全体的に明るくして室内を表示しました。
室外から室内に移動する場合、そのままの露出だと全体が暗いままになるため、露出調整は必要になります。
![hdrp_dxr_303.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/7e7d1e33-ed54-17be-e31e-519b8f2d39c9.jpeg)
Tier2の場合は、特にLightmap/Reflection Probeを使用しなくてもフォトリアルな表現になっています。
ただし、Fogは効いていません。

### 「Path Tracing」を無効にする (Tier2)

「Path Tracing」を無効にし、「Ambient Occlusion」「Screen Space Reflection」「Global Illimination」をOnにします。
![hdrp_dxr_304.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/c49cc577-35c3-b37a-b15c-3260c25c28dd.jpeg)
「Screen Space Reflection」「Global Illimination」の「Bounce Count」を指定していますが、
「Path Tracing」を使った場合と比較してリアルさは薄れています。

## Tier1での表現

速度面と表現面の両方を確保した状態で表現力を上げたいため、Tier1を使用して以下のような手順を取りました。

* Lightmap用のベイク光源をArea Lightで配置
* 直接照明の光源は、Realtime光源として配置
* 間接照明の大部分は、Lightmapに頼る (レイトレーシングのGlobal Illuminationを使わない)
* 映り込みは Reflection Probeも使用 (レイトレーシングのSSRも併用)
* Staticでない形状の光源の間接照明の補間として、Light Probeを使用

リファレンスとして、Tier2時の「Path Tracing」の結果を目指す、とします。
直接照明や一次反射でレイトレーシングを使用することでフォトリアルに近づけます。

### Tier1に変更

メインメニューの「Edit」-「Project Settings」を選択し、「Graphics」を選択します。
![hdrp_dxr_305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/e1d191e1-699b-efef-7f2c-fa3cfa92129f.png)
「Scriptable Render Pipeline Settings」に割り当てられている「HDRenderPipelineAsset」を選択すると、Project上の実ファイルがハイライトされます。
このAssetを選択し、Inspectorで「Raytracine Tier」を「Tier 1」に変更します。
![hdrp_dxr_306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/cb32d734-0ced-b1fe-7637-2a5c452add7c.png)
以下のように、ぬるい感じになりました。
![hdrp_dxr_307.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/9c09f884-5aae-e80c-6b1a-8d817efd16af.jpeg)
上記は、レイトレーシングとして「Ambient Occlusion」「Screen Space Reflection」「Global Illumination」を使用しています。
「Path Tracing」は無効にしています。

Tier1の場合は、Screen Space ReflectionやGlobal Illuminationで複数回の再帰的な反射は行われないのと、いくつか精度を犠牲にしているようで（Reflectionの解像度など）、Tier2よりは品質が下がります。

これより、パラメータの調整とLightmap/Reflection Probeの使用で補っていきます。

### Lightmapの指定

Lightmapを行う手順は、以下の流れになります。
これはHDRPやDXRに限らず、Unityでは共通の作業になります。

* 建物の形状で「Gegnerate Lightmap UVs」を有効にする
* シーンの建物を「Static」にする
* Lightingウィンドウでベイクを実行

Projectウィンドウでインポートした形状を選択し、Inspactorの「Model」の「Gegnerate Lightmap UVs」をOnにしてApplyボタンを押して確定します。
![hdrp_dxr_308.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/b05873cb-f731-8294-2da6-df63b14c5000.jpeg)
これは形状のすべての面が重ならないようなUVを作成します。Lightmapをベイクする際に利用されます。
この指定がない場合は、一番最後のUVレイヤがLightmap用として参照されます。

Hierarchyウィンドウで、Lightmapのベイク対象の形状を選択します。
ここでは木造の建物と地面に同じ処理を行いました。
対象形状のInspectorで右上の「Static」をOnにします。
![hdrp_dxr_309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/35790e0c-5b90-5759-a387-02be893c3cda.png)
子形状がある場合は、それもStaticにするか聞いてきます。子もStaticにしました。
こうすることで、Lightmapのベイク対象になります。

Lightingウィンドウを開き、Sceneタブを選択します。
![hdrp_dxr_310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/f467bedd-5639-d912-e6ef-71f19454aa31.png)
室内シーンなので「Lightmapping Settings」の「Lightmapper」で「Prograssive CPU」が選択されていることを確認します。
「Prograssive GPU」を選択したほうが計算速度が速いのですが、複雑なシーンだとGPU計算の場合に失敗する場合があるため、CPUで計算します。
また、「Bounces」を2から4に変更しました。
こうすることにより、Lightmapのベイク計算の時間はかかりますがより間接照明が回り込むことになります。
「Generate Lighting」ボタンを押すとLightmapのベイク計算が開始されます。
この計算は、シーンの規模が大きくなれば時間がかかります。
数十分から数時間かかる場合もあります。

以下は、Lightmapを使用しない場合＋各レイトレーシングの要素を使用したときの結果です。

|要素|有効/無効|その他|
|---|---|---|
|Lightmap|未使用|-|
|Reflection Probe|未使用|-|
|Light Probe|未使用|-|
|Ambient Occlusion|有効|Ray Tracing On|
|Screen Space Reflection|有効|Ray Tracing On|
|Global Illumination|有効|Ray Tracing On|

![hdrp_dxr_313.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/68a544ae-919d-48cd-3124-aa8ab16bbe11.jpeg)

Lightmapのベイクを適用しました。
「Global Illumination」のレイトレーシングを使っている場合は結果はほぼ変わらなかったです。

|要素|有効/無効|その他|
|---|---|---|
|Lightmap|有効|-|
|Reflection Probe|未使用|-|
|Light Probe|未使用|-|
|Ambient Occlusion|有効|Ray Tracing On|
|Screen Space Reflection|有効|Ray Tracing On|
|Global Illumination|有効|Ray Tracing On|
![hdrp_dxr_312.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/d4705765-337b-ad33-0c87-27774290b3b6.jpeg)

Lightmapを使用した場合＋「Global Illumination」を無効にした場合は、部屋の奥が暗くなりました。
このほうが結果として正しそうです。

|要素|有効/無効|その他|
|---|---|---|
|Lightmap|有効|-|
|Reflection Probe|未使用|-|
|Light Probe|未使用|-|
|Ambient Occlusion|有効|Ray Tracing On|
|Screen Space Reflection|有効|Ray Tracing On|
|Global Illumination|無効|-|
![hdrp_dxr_311.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/fbbf0aad-5be6-e908-f5fb-58c525d5b7c8.jpeg)

ただし、この場合はStaticではない形状に対してベイクの効果が適用されないため浮いたようになります。

これを解決するには、映り込みについてはReflection Probeを使用、
Staticでない形状での光の当たり具合はLight Probeを使用する必要があります。

Reflection ProbeとLight Probeを使用しない場合は、室内に移動すると以下のようになりました。

|要素|有効/無効|その他|
|---|---|---|
|Lightmap|有効|-|
|Reflection Probe|未使用|-|
|Light Probe|未使用|-|
|Ambient Occlusion|有効|Ray Tracing On|
|Screen Space Reflection|有効|Ray Tracing On|
|Global Illumination|無効|-|
![hdrp_dxr_315.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/2919c038-43b5-221e-9f7b-2ec4424327f3.jpeg)

机や椅子、奥のタンスなどのライティングが正しくありません。
廊下の映り込みも明るくなっています。

### Reflection Probeの配置

部屋の角や光の変化がある部分に、Reflection Probeを配置しました。
![hdrp_dxr_318.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/205b1595-2a79-bdb0-886e-d94b8a5b3669.jpeg)

この後、再びLightmapのベイクを行いました。

|要素|有効/無効|その他|
|---|---|---|
|Lightmap|有効|-|
|Reflection Probe|有効|-|
|Light Probe|未使用|-|
|Ambient Occlusion|有効|Ray Tracing On|
|Screen Space Reflection|有効|Ray Tracing On|
|Global Illumination|無効|-|
![hdrp_dxr_317.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/0d128c51-7527-c8f6-a3d3-d927f448cb7e.jpeg)

床部分の映り込みが変化しています。

### Light Probeの配置

壁の境目などの光の変化が激しくなりそうなところに、Light Probeを配置しました。
等間隔にLight Probeを並べるようにしています。
![hdrp_dxr_319.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/1f325049-8dc0-6d5e-89dd-bbeed27484d6.jpeg)
なお、Light ProbeやReflection Probeのアイコン類は、Scene Viewの上の「Gizmos」をOnすることで表示されます。
![hdrp_dxr_320.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/307a74f6-ea02-f608-b32e-746c7349e521.jpeg)
この後、再びLightmapのベイクを行いました。

|要素|有効/無効|その他|
|---|---|---|
|Lightmap|有効|-|
|Reflection Probe|有効|-|
|Light Probe|有効|-|
|Ambient Occlusion|有効|Ray Tracing On|
|Screen Space Reflection|有効|Ray Tracing On|
|Global Illumination|無効|-|
![hdrp_dxr_316.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/c41b4131-0f18-0628-f4eb-ff9fbecad19a.jpeg)

机や椅子、奥のタンスなどのライティングが正しくなりました。

以上で、「Ambient Occlusion」「Screen Space Reflection」でレイトレーシングを使用、
Global Illuminationを未使用とし、Lightmapで置き換えました。
![hdrp_dxr_321.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/fc6ed19d-0849-63f6-0098-495755fd8aaf.jpeg)

Lightmapを使用しないときよりも明暗のメリハリがつきましたが、廊下と机や椅子との接地感が弱い、全体的なフォトリアル感がない、など気になる点があります。
次にこれらを改善していきます。

### Area Lightの配置

間接照明は、Area Lightを使用して間接照明をわずかに補助します。
![hdrp_dxr_323.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/dee5cc16-ee20-f8ac-dbcd-8f2d09cb555a.jpeg)

この光源は、Lightmap用としてBakedを指定しました。
「Baked Shadows」もEnableを指定しました。

「Intensity」は2000 Lumen、「Range」を20として、ほんのわずかに照らすようにしています。
Area Lightを配置後、LightingよりBakeを実行します。

Directional LightをOffにして、背景のIBLとArea Lightだけにすると以下のようになりました。
![hdrp_dxr_324.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/e4cd31b9-a18d-6264-40fc-527680176443.jpeg)
Directional Light(Realtime)をOnにすると以下のようになりました。
![hdrp_dxr_325.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/c54ea295-7fc8-5a13-7def-5f7b95ee60e5.jpeg)

### Ambient Occlusionの調整

接地感が弱い箇所を補間するために、Ambient Occlusionを調整します。
「Ray Tracing Settings」を選択してInspectorを開きます。
「Ambient Occlusion」の「Intensity」を0.72から3.5と強くしました。
「Denoise Radius」を0.5から0.2に変更しました。
これは、Denoise時に収集する半径になりますが、これが大きいとAOの効果が飽和したようになって見えにくくなるため、小さくすることでより影響が出るようにしています。
![hdrp_dxr_322.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/8e95f116-77cc-ff4a-1f87-4653eb724908.png)

以下は、AOの編集前です。
![hdrp_dxr_326.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/7d7eaf4e-f8e3-301d-3740-4fc83f82f25a.jpeg)

以下は、AOの編集後です。
![hdrp_dxr_327.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/e7b9eddb-4abc-25ed-6786-3d678991afe3.jpeg)
これで、接地感が出ました。

### Directional Lightの影の品質を上げる

Directional LightのInspectorを開き、Shadowsの「Resolution」を「Ultra」にすると2048解像度のシャドウマップになります。
また、「Screen Space Shadows」をOnにすると品質が少し上がります。
![hdrp_dxr_328.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/e6fc8b4f-60b0-6abb-f512-e99ede130356.jpeg)

### Screen Space Reflectionの品質を上げる

「Ray Tracing Settings」を選択してInspectorを開きます。
「Screen Space Reflection」の「Minimun Smoothness」の値を下げると、
個々のマテリアルでSmoothness値がそれ以上の場合はレイトレースが行われます（それ以下の値の場合はSSR）。
これにより、GPUリソースを消費しますが1次レイの映り込みの品質が上がることになります。
「Minimun Smoothness」を0.7から0.3に下げました。
![hdrp_dxr_329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/2c0f8c1a-c721-79c2-a2ce-12e95b29cbd4.png)

天井や奥の壁の照り返しが少し増しました。
![hdrp_dxr_330.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/4c7d9ca3-3ab6-261a-ea4d-81185e75e2d8.jpeg)
以上で、Lightmap/Reflection Probe/Light Probeとレイトレーシング周りの調整が一通り完了したので、
あとはPost Processingの調整を行います。

## Post Processingの調整

Vignetteで「Intensity」を0.3として、少しだけ強めにしました。
![hdrp_dxr_331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/5999efcc-9124-d189-a305-a22ed8b9b9ba.png)

Exposureで「Mode」を「Automatic」として、自動露出にしました。
こうすることで、室内と室外に移動してもその都度Exposureを調整する必要がなくなります。    
また、「Limit Max」を8としました。
![hdrp_dxr_332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/a6bde3a6-0e12-e176-f385-60c5b5f85977.png)

White Balanceで「Temperature」を10としました。
少しだけ暖色になるようにしています。
![hdrp_dxr_333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/3973de3d-b1b4-1c73-05b6-6afd6da9cf2c.png)

Chromatic Aberrationで「Intensity」を0.095としました。
![hdrp_dxr_334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/24f720cc-6a12-35a2-4fca-fe18b9a5e3f6.png)
Tonemappingで「Mode」をNeuralとしました。
![hdrp_dxr_335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/f9a8b2ac-cfe4-f8b4-5669-34af7abb4fc0.png)

Bloomで「Intensity」を0.13としました。
![hdrp_dxr_336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/2a3e228a-bfb3-dcf0-be0c-a86883e23ebf.png)

Color Adjustmentsで「Post Exposure」を0.7にしました。
これにより、少しだけ明るくします。
「Saturation」を-10にしました。
これにより、少しだけグレイスケールの要素を入れて全体を落ち着かせています。
![hdrp_dxr_337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/1dac9778-6635-aff4-5d56-917d0b687268.png)

Depth Of Fieldで「Focus Mode」を「Manual」とし、Near Blur/Far Blurの値を指定してボカシを与えました。
なお、DOF効果はGame Viewで表現されます。Scene Viewでは表示されません。
![hdrp_dxr_338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/4bdfe770-42a1-cb35-658f-cd965d8a6cd0.png)

Post Processingの調整の結果、以下のようになりました。
![hdrp_dxr_339.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/532571d2-3065-126f-c29c-2c55b026df98.jpeg)

## 光沢用の光源を配置

上記画像では床の映り込みの光沢が薄いです。
光沢に関しては、Point LightをRealtime光源として配置するとしました。
Point Lightの影(Shadow Map)は無効にしています。
![hdrp_dxr_340.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/d40e1b07-e8e5-1dc4-fdf3-d3ac736a53c9.jpeg)

以下のようになりました。
床の光沢感が増しました。
![hdrp_dxr_341.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/89dedc89-3f83-fd38-90cb-8e597a710149.jpeg)
これは本来はないニセ光源ではあるのですが、光沢を出す場合は特に有効です。

## HDRIとフォグの確認

HDRIとフォグについては確認のみです。
「Sky and Fog Volume」では以下のように指定しています。
![hdrp_dxr_342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/a1f25113-4963-bb60-d3bd-4f2f9fb28945.png)
背景を暗くする場合は「Exposure」の値を下げるようにします。

フォグはわずかにかけるようにしていますが、もし、強めに与える場合は距離値を調整します。
「Fog Attenuation Distance」を20000から100に変更、「Maximum Height」を5000から1000に変更、「Max Fog Distance」を5000から1000に変更してみました。
![hdrp_dxr_343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/dcad7f60-85fe-bcb5-ba71-92d5510da234.png)
以下のようになります。
![hdrp_dxr_344.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/df6fdf59-a6a5-a612-f185-892dd1c18425.jpeg)

光が入りにくくなったため、「Directional Light」のEmissionの「Intensity」を10000(Lux)から100000に変更しました。
![hdrp_dxr_345.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/2cbe5f45-a585-8225-24e4-5899e6ade276.jpeg)

Spot Lightで強めの光を設けた場合など、フォグがある空間ではボリュームライト表現が行えます。
以下は、Spot LightのEmissionで「Intensity」を5000000(Lumen)と極端に大きな値を与えてます。
![hdrp_dxr_346.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62860/136fb935-e8fd-c32d-dd68-acd2c879f97d.jpeg)

以上で、Tier2のパストレーシングを使用しなくても、Tier1でそれなりに詰めることができるのを確認できました。
フォグ効果や速度面を考えると、Tier1を使い、間接照明は従来のLightmapを使う、というのは今のところ有効かもしれません。

以上のプロジェクトは、
GitHubの「[Unity2019_3_HDRP_DXR_RoomTest](https://github.com/ft-lab/Unity2019_3_HDRP_DXR_RoomTest)」に公開しています。