UE4のNvRTX_Causticsブランチを触ってみる

NvidiaはUE4のブランチを提供してくれています。
DLSSやRTXGIはプラグイン化されており、多少話題になっていましたが、RTX_Custicsはエンジンをビルドする必要があるため、あまり使用する人が少ない印象です。
NvRTX_CausticsはRTXの技術を使用したリアルタイムコースティクスを使用することができ、画像のようにリッチな表現を実現することができます。

![HighresScreenshot00045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/95efc3f3-01e7-b075-ab71-aeb94130b2e5.png)


11月にこっそり4.27版のブランチが公開されていたので、今回はそちらを使ってみたいと思います。
技術的なことは難しくてわからないので、Nvidiaのブログ等をみてもらうこととして、今回は見た目重視で設定方法をまとめてみました。

https://developer.nvidia.com/blog/generating-ray-traced-caustic-effects-in-unreal-engine-4-part-1/



# ビルド手順

事前準備
・NvidiaのGPU
・VisualStudio2019のインストール
・[UnrealEngineアカウントとGithubアカウントの連携](https://www.epicgames.com/help/ja/epic-c74/c110/unreal-enginegithub-a3618)

特筆することはありませんが、エンジンを自分でビルドする必要があるのでVisualStudioのインストールとGithubアカウントの連携は必須です。あと、当然ですがRTXの技術なのでNvidiaのGPU(最低要件はわかりませんが、UE4でレイトレが使えれば動くはず)も必要です。

準備が問題なければ、GithubからNvRTX_Causticsのブランチをクローンします。今回は4.27.1のブランチを使用します。

https://github.com/NvRTX/UnrealEngine/tree/NvRTX_Caustics-4.27

リポジトリをクローンしたら、Setup.bat、GenerateProjectFiles.batの順に実行してプロジェクトファイルを生成後、VisualStudioからビルドします。
エンジンのビルドはソースからビルドする方法と同じなので[他の記事](https://docs.unrealengine.com/4.27/ja/ProductionPipelines/DevelopmentSetup/BuildingUnrealEngine/)を参考にしてください。

## 機能
メインの機能はコースティクスだと思いますが、そのほかにも機能が含まれています。
NvRTX_Causticsのリポジトリの中に含まれているのは、以下の6つです。下の方は何ができるかよくわかりません。

<dt>Ray traced mesh caustics</dt>
 <dd>レイトレースによるメッシュのリアルタイムコースティクス。Metallic とTranslucentをサポート</dd>
<dt>Ray traced water caustics</dt>
 <dd>レイトレースによる水面のリアルタイムコースティクス</dd>
<dt>Enhanced Translucency</dt>
 <dd>ラスターとレイトレースをミックスした手法によるTranslucency</dd>
<dt>Multi-bounce refraction optimization</dt>
 <dd>マルチバウンスRefraction/Reflectionのパフォーマンス改善とAbsorption(吸収)と全反射の追加</dd>
<dt>RTGI enhancements</dt>
 <dd>エミッシブマテリアルに対応した新しいGI</dd>
<dt>DLSS tweaking</dt>
 <dd>DLSSが改善されている？</dd>

<br><br>
それぞれの設定方法をみていきます。Githubの内容をまとめ直しただけですが、Githubではコンソールコマンドで弄る前提になっていて分かりにくかったので、ここではエディターの設定だけまとめました。

前提として、プロジェクトでレイトレーシングを有効にしておきます。

#Ray Traced Mesh Caustics



メッシュコースティクスは以下の機能に対応しています

* ライト4タイプへの対応
* 複数の光源
* Reflective（反射）とRefractive（屈折）のコースティックス
* Dispersion（分散）
* ソフトコースティクス

![HighresScreenshot00003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/433e6cd8-1ef7-00ed-fbe0-3d64f5a3c71b.png)

メッシュコースティクスを有効化するには以下の設定を行います

1. ポストプロセスの[Ray Tracing Mesh Caustics]を有効にする
1. ライトを設置して、[Cast Mesh Caustics]を有効にする
1. マテリアルの[Material]>[Cast Ray Traced Reflection　Caustics]または[Cast Ray Traced Reflection Caustics]を有効にする


### ポストプロセスボリュームの設定
ポストプロセスの[Rendering]>[Ray Tracing Mesh Caustics]の[Enabled]にチェックを入れます。

![キャプチャ00.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/6642ab44-2668-2580-05cd-968a30171b86.png)


<details><summary><strong>パラメーターの設定</strong></summary><div>

### Ray Tracing Mesh Caustics
<dt>Ray Tracing Mesh Caustics</dt>
 <dd>メッシュコースティクスの有効/無効化</dd>
<dt>Resolution Override</dt>
 <dd>解像度の上書き。大きくするとパフォーマンスが落ちる</dd>
<dt>Intensity</dt>
 <dd>反射光の明るさを設定
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/9893017f-df6a-c91e-c4ca-193c33e0f56c.png)</dd>
<dt>Resolution Override</dt>

<dt>Max Trace Depth</dt>
 <dd>バウンスの最大数の制限。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/41a3aa27-582e-79d5-6644-757f686d37e6.png)
</dd>
<dt>Final Cull Threshold</dt>
 <dd>カリングカラーのしきい値。パフォーマンスのためには、コースティクスが消え始めるくらいの値に調整する。（Midも同様）
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/d26ac3ae-c458-bfac-e18f-a4299cbf68b0.png)
</dd>
<dt>Mid Cull Threshold</dt>
 <dd>カラーカリングのしきい値。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/96c70f17-804a-4eda-03a0-b2d118e1b7c3.png)
</dd>
<dt>Splat Size</dt>
 <dd>Splat(はじけ？)のサイズ。
![004-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/ebcacd5c-afc1-c55b-1652-a4c63028d79b.png)
</dd>
<dt>Enable Dispersion</dt>
 <dd>分散の有効/無効化。プリズム表現をしたい場合は有効化する（マテリアル側の設定も必要）
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/504eaa88-53fd-70c7-232b-f9a03a292ae5.png)
</dd>
<dt>Enable Temporal Filtering</dt>
 <dd>Temporal Filteringの有効/無効化。フリッカーの低減してくれる。フィルターの強度は詳細設定で変えれます</dd>
<dt>Jitter</dt>
 <dd>Jitterの強さ。</dd>
 <dd>
詳細設定はよくわからないので触れません
</dd>

</div></details>


### ライトの作成
ライトを設置して、[Ray Tracing]の<strong>[Cast Mesh Caustics]</strong>にチェックを入れます。
コースティクスを見たいだけならRect Lightがわかりやすいです。
![キャプチャ01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/17724af4-3685-783f-8815-4c50a05cf05f.png)


<details><summary><strong>パラメーターの設定</strong></summary>
<div>
<dt>Mesh Caustics Precision</dt>
 <dd>コースティクスの解像度を設定。大きくするとパフォーマンスが落ちる</dd>
<dt>Mesh Caustics Softness</dt>
 <dd>コースティクスのソフトネスを設定。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/554ce37f-c8d8-e948-399a-4380bd49428e.png)
</dd>


</div></details>

### マテリアルの作成

コースティクスを表現したいマテリアルを用意し、反射の場合は[Cast Ray Traced Reflection Caustics]、屈折の場合は[Cast Ray Traced Reflection Caustics]を有効にします

##### Reflection（反射）の設定
Reflection Causticsを有効化するには、メタリックマテリアルを作成し、
[Meterial]の<strong>[Cast Ray Traced Refrection Caustics]</strong>を有効化します。
![キャプチャ02(1).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/608cf09a-a521-a507-c891-ec2a62b355ed.png)




##### Refrection（屈折）の設定
Refraction Causticsを有効化するには、半透明マテリアルである必要があるため、[Blend Mode]を<strong>"Translucent"</strong>にします。
そして、[Meterial]の<strong>[Cast Ray Traced Refrection Caustics]</strong>を有効化します。
![キャプチャ03(1).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/b41aa194-11c9-5cd5-5ad4-864a8ef299dc.png)
<details><summary><strong>パラメーターの設定</strong></summary>
<div>

<dt>屈折</dt>
マテリアルの"Refraction"がそのままコースティクスの屈折率(IOR)に影響します
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/50adcafe-6d48-d750-d826-dc9e92fd8a84.png)</dd>
<dt>Ray Traced Caustics Dispersion Amount</dt>
 <dd>分散の量を指定
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/2549659e-b457-9f26-4fe4-d7b4e14b534d.png)
</dd>
<dt>Ray Traced Caustics Use CustomDepth As Dspersion Amount</dt>
 <dd>"CustomData0"の入力を分散の量として扱う。</dd>
<dt>Ray Traced Jittered Dispersion</dt>
 <dd>分散のジッターサンプルを有効/無効化。ちょっと何言ってるかわからなかった。
![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/6ead1b64-8d14-0800-490a-69317ad57166.png)
</dd>

</div></details>



## Ray Traced Water Caustics
ウォーターコースティクスでは以下の機能に対応しています

* ライト4タイプへの対応
* 複数の光源
* Reflective（反射）とRefractive（屈折）のコースティックス
* Dispersion（分散）
* ソフトコースティクス
* カスケードされたコースティックスマップ


<br>Water Causticsを有効にするには以下の設定を行います

1. ポストプロセスで[Ray Tracing Water Caustics]>[Caustics Type]を[Photon Difference Scattering]か[Static Caustic Mesh]に変更する
2. ライトを設置して、[Cast Water Caustics]を有効にする
3. Translucentマテリアルを適用したメッシュアクターの[Ray Tracing]>[Evaluate Ray Tracing Water Caustics]を有効にする

![HighresScreenshot00034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/8e8a44d1-b38e-7656-804f-903bdf82a0e3.png)

Translucentではなく、SingleLayerWaterでも、マテリアルの[Ray Traced Water Caustics For SingleLayerWater]にチェックを入れることでもコースティクスを有効化できます。

### ポストプロセスボリュームの設定
ポストプロセスの[Rendering]>[Ray Tracing Water Caustics]の[Caustics Type]を[Photon Difference Scattering]か[Static Caustic Mesh]に変更します。
![キャプチャ06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/63ecd4fa-8ab9-402f-a4c1-540875a385ea.png)


<details><summary><strong>パラメーターの設定</strong></summary>
<div>
見た目に関わるのはタイプとデノイズとDispersion、Intensityくらい？他はパフォーマンス向上のために弄る感じな気がする。
<br>
<dt>Caustics Type</dt>
 <dd>コースティクスのタイプを設定。"Photon Difference Scattering"は柔軟性があり、すべてのライトタイプに対してコースティックスをレンダリングするのに適している。"Procedural Caustic Mesh"は、比較的低解像度のコースティックスマップでもシャープなコースティックスを生成することがでるが、カスケードは機能しない。
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/f51eb55b-7004-a731-2a28-0867b3c6bb6a.png)

</dd>
<dt>Caustics Buffer Scale</dt>
 <dd>コースティクスのバッファーサイズを設定。</dd>
<dt>Directional Lighting Follow Camera</dt>
 <dd>コースティクスマップのキャプチャをDrectional Lightの向きに合わせるかどうか。無効にすると、ライトの方向からではなく、常にカメラの上部からキャプチャされる</dd>
<dt>Directional Lighting Look At</dt>
 <dd>?</dd>
<dt>Directional Lighting Range</dt>
 <dd>コースティクスマップをキャプチャ範囲を指定。範囲を広くするとマップの解像度が高くなる</dd>
<dt>Color</dt>
 <dd>コースティクスの色。</dd>
<dt>Denoise Passes</dt>
 <dd>デノイズのイテレーション回数。
![012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/78f8ef91-7a7e-d3f8-7547-4759697fe143.png)
</dd>
<dt>Disersion Intensity</dt>
 <dd>Dispersion（分散）の強さ。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/5ec977ec-8e44-bd93-ab71-93d5247f9115.png)
</dd>
<dt>Disersion Offset</dt>
 <dd>Dispersion（分散）のオフセット値。</dd>
<dt>Reflection Intensity</dt>
 <dd>反射光の強さ。</dd>
<dt>Max Reflection Ray Distance</dt>
 <dd>反射光の最大距離。</dd>
<dt>Min Reflection Ray Distance</dt>
 <dd>反射光の最小距離。</dd>
<dt>Refraction Intensity</dt>
 <dd>屈折光の強さ。</dd>
<dt>Max Reflection Ray Distance</dt>
 <dd>屈折光の最大距離。</dd>
<dt>Min Reflection Ray Distance</dt>
 <dd>屈折光の最小距離。</dd>
<dt>Reflect BackFace Culling Threshold</dt>
 <dd>反射の背面カリングのしきい値。</dd>
<dt>Refract BackFace Culling Threshold</dt>
 <dd>屈折の背面カリングのしきい値。</dd>

</div></details>

### ライトの作成
ライトを設置して、[Ray Tracing]の<strong>[Cast Wesh Caustics]</strong>にチェックを入れます。
![キャプチャ04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/7c3ea6a9-94ab-2bc7-a653-56698f018f54.png)



<details><summary><strong>パラメーターの設定</strong></summary>
<div>
<dt>Water Caustics Precision</dt>
 <dd>コースティクスの解像度を設定。大きくするとパフォーマンスが落ちる</dd>
<dt>Num Water Caustics Map Cascades</dt>
 <dd>カスケードマップのレベルを設定。[Photon Difference Scattering]でのみ有効</dd>
<dt>Water Caustics Map Cascade Scale</dt>
 <dd>カスケードマップのスケールを設定</dd>
</div></details>


### スタティックメッシュアクターの設定
スタティックメッシュアクターにTranslucentマテリアルを適用後
、[Rendering]の<strong>[Evaluate Ray Tracing Water Caustics]</strong>にチェックを入れます。
![キャプチャ05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/312da3e9-fe4e-f99b-4089-62c69ccd8de3.png)

## Enhanced Hybrid Translucency
ラスターとレイトレーシングを組み合わせた2つのTransluceny機能が追加されています。

機能を有効にするには、ポストプロセスの[Translucency]の[Type]を[Hybrid Translucency]または[Enhanced Ray Tracing]に変更する必要があります。
![0000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/629098c2-d3ac-90d0-79fe-d386b3d0b4e4.jpeg)

### Hybrid Translucency
Githubの説明のr.RayTracing.HybridTranslucency 1に相当するもののはずです。ラスターTranslucencyの一部として、レイトレースされたレイヤーを合成される形にです。
こちらを有効にするためには、[プロジェクト設定]から[Rendering]>[Ray Tracing]の<strong>Hybrid Translucency</strong>にチェックを入れる必要があります。

### Enhanced Ray Tracing
Githubの説明のr.RayTracing.HybridTranslucency 2に相当するもののはずです。
ラスターTranslucencyと反射、屈折、OIT(OIT(Order Independent Transparency)サポートを含む完全なレイトレースTranslucencyを混在させることができます。

レイトレーシング下でTranslucentマテリアルのパーティクルを使用するのに有効な気がします。
比べてみると、Hybrid Translucencyはラスターに毛が生えた程度でパフォーマンスもそこまで変わらなさそうなので、基本的にはEnhanced Ray Tracingを使うのが良い気がします。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/2e5ec391-a6af-c4c6-1aa6-cd95c8cc17a8.png)


## Multi-bounce Refraction Optimization
機能は

* TranslucentマテリアルのAbsorption(吸収)
* スループットカリング

です

Absorption(吸収)を有効にするには以下の操作が必要です。

1. Raytracing translucencyを有効にする
2. ポストプロセスボリュームで <strong>[Enable Absorption]</strong> をチェックする
3. Absorption（吸収）を有効にしたいマテリアルを選び、マテリアルエディタで <strong>[Ray Traced Translucency Absorption]</strong>にチェックする

![014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/c0344421-e21b-d2da-4656-7bd108ce3835.png)


##### ポストプロセス![キャプチャ08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/6a7e3618-dc90-d017-c762-b6ccdafd3393.png)
##### マテリアル![キャプチャ09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/f32598f5-a8d7-44bd-bcda-f9e7064a753e.png)




スループットカリングはポストプロセスの[Ray Tracing Translucency]の中の<strong>[Min. Reflection Thtoughout]</strong>と<strong>[Min. Refraction Thtoughout]</strong>で設定できます。
![キャプチャ10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/7ffd5766-775d-4826-e5e1-009603bef3a7.png)



## Enhanced GI
Enhanced GIでは以下の機能に対応しています。

* New GI Denoiser
* Emissiveマテリアルへの対応
* 1/4および1/8解像度に対応

New GI Denoiserを有効にするには、以下の手順が必要です。
1. UE4 でRaytracing GIを有効にする
2. ポストプロセスのボリューム設定で、[GI Denoise Type]を <strong>"New Denoiser"</strong>に設定する
![キャプチャ07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887206/d5519878-6783-3f7b-5fe2-e151050579dc.png)

デノイザーのパラメーターはコンソールコマンドでしか変更できないようなので深くは掘りません。

## DLSS tweaking
？？？

Githubにも特に説明がなかったのでわかりません。
DLSSプラグインが更新されている？
DLSS後にパーティクルをレンダリングできるようになっているのと、DoF不具合が調整されているらしいです。