Ray Tracing Night @ Tokyo
UE4のレイトレで出来ること/出来ないこと
自己紹介
もんしょ
もんしょの巣穴管理人
Twitterアカウント:@monsho1977
都内のゲーム開発会社エンジニア
→令和元年からフリーランス
Unreal Engine 4 マテリアルデザイン入門の共著
→付録の一部執筆と本編の監修
日本酒と岩の人と一部で言われてる
→間違ってない
内容
UE 4.22で使用可能になったリアルタイムレイトレーシングの基本を紹介
→実例はのちのお二方におまかせ!
● UE 4.22におけるリアルタイムレイトレの使い方
● リアルタイムレイトレとパストレーシングの違い
● 各種機能紹介
● レイトレの制約
● 速度
注意:単語の省略について
レイトレーシング→レイトレ
パストレーシング→パストレ
リアルタイムレイトレの使い方
リアルタイムレイトレの使い方
必要な機材
• Unreal Engine 4.22
• Windows 10
2018 October Update (1809)以降
• NVIDIA Volta / Turing世代以降のGPU
もしくは一部のPascal世代GPU
Titan V / Geforce RTXシリーズ
GTX 1060以上
リアルタイムレイトレの使い方
UE 4.22の設定
• 起動オプション
起動時引数で -dx12 を追加する
• C++プロジェクトの場合
プロジェクトの構成プロパティ→デバッグ→コマンド引数に追加
• BPプロジェクトの場合
Unreal Engineのショートカットを作成→引数に追加
プロジェクトのショートカットでは効果がないので注意!
リアルタイムレイトレの使い方
UE 4.22の設定 つづき
• プロジェクト設定で以下の2つを有効化
Support Compute Skincache
Ray Tracing
Supoort Compute Skincacheを有効にしないと有効化出来ない
• 有効化したら再起動
リアルタイムレイトレの使い方
パラメータの変更方法
• 一部アクターの設定とデバッグコマンドでの変更
詳細な設定は今後アクター等の設定に含まれていくと思われる
• デバッグコマンドはr.RayTracing、r.PathTracing にまとまっている
例)
r.RayTracing.AmbientOcclusion:レイトレによるAOの有効/無効
r.PathTracing.RandomSequence:ランダム手法の変更
• 一部の設定を保存したい場合は.iniファイルを利用する
BPでデバッグコマンドを呼び出す方法もあり
リアルタイムレイトレと
パストレーシング
リアルタイムレイトレとパストレーシング
同じじゃないの?
• レイトレーシングは始点と方向(有限 or 無限)を持ったレイを追跡する技術
追跡してシーンとの衝突を検出する
衝突したあとに何をするかは自由
• パストレーシングは光の経路(パス)を追跡する
カメラに飛び込んでくる光がどのような経路をたどったかを調べる
カメラからレイを飛ばしてその経路を追跡する
ここでレイトレーシングが使われている
• レイトレーシングを使って映像を作成する方法をパストレーシングと呼ぶ
パストレーシングはレイトレーシングの一種とも言える
リアルタイムレイトレとパストレーシング
でも、UE4にはリアルタイムレイトレとパストレーシングがあるけど、何が違うの?
• UE4のパストレーシングはレイトレーシングのみで映像を作成する
本来の意味のパストレーシングと同じ
• リアルタイムレイトレーシングは一部の映像表現のみレイトレーシングを行う
基本的なレンダリングはリアルタイムCGでお馴染みのラスタライザ
• DirectX Raytracing(DXR)を利用して、ラスタライザとレイトレのハイブリッドを実現
Direct3D12の拡張機能
ラスタライザでは難しい、主にスクリーンスペース系の技術をレイトレで処理
• デバッグコマンドやシェーダはレイトレとパストレで別れている
レイトレ:r.RayTracing, Shaders/Private/RayTracing
パストレ:r.PathTracing, Shaders/Private/PathTracing
リアルタイムレイトレで使える技術
リアルタイムレイトレで使える技術
UE4のリアルタイムレイトレでは何を描画できるか?
すべての描画オブジェクトをレンダリングできるわけではないので注意!
描画できるものでもすべての機能が使えるわけではないので注意!
• 描画できるもの
Static Mesh
Skeletal Mesh
Destructible Mesh
Niagara
Alembic Geometry Cache
• 描画できないもの
Terrain
Foliage
Cascade
Procedural Mesh
リアルタイムレイトレで使える技術
UE4のリアルタイムレイトレでは何が使えるか?
• アンビエントオクルージョン
• リフレクション
• シャドウ
• グローバルイルミネーション
• スカイライト
• 矩形ライト
• 半透明
• リファレンス用パストレーシング
リアルタイムレイトレで使える技術:
アンビエントオクルージョン
アンビエントオクルージョン
• Screen Space Ambient Occlusionの代替として使用できる
デフォルトON
OFFにするとSSAOに切り替わる
• デバッグコマンド
r.RayTracing.AmbientOcclusion
レイトレAOのON/OFF切り替え
• アクター設定
PostProcessVolume.RayTracingAmbientOcclusion.SamplesPerPixel
レイトレAOのサンプリング数/1Pixel/1Frame
• AOの強度と範囲はSSAOと共用
PostProcessVolume.AmbientOcclusion項目が使える
• レイトレ後、時間的/空間的なデノイズ処理が行われる
アンビエントオクルージョン
Ray Tracing AO Screen Space AO
アンビエントオクルージョン
デノイズ前 デノイズ後
リアルタイムレイトレで使える技術:
リフレクション
リフレクション
• リアルタイムレイトレの目玉機能
Screen Space Reflectionの代替機能
デフォルトON
OFFにするとSSRが有効化
• デバッグコマンド
r.RayTracing.Reflections
レイトレリフレクションのON/OFF
• アクター設定
PostProcessVolume.RayTracingReflections.MaxBounces
リフレクションのバウンス回数
回数を増やすことで合せ鏡の描画も可能
• レイトレ後、時間的/空間的なデノイズ処理が行われる
• 完全反射のほうが有利
SSRの場合は完全反射を避けたほうがいいが、レイトレの場合は逆
ラフネスが高いとノイジーになり、残像感も残りやすい
リフレクション
Ray Tracing Reflection Screen Space Reflection
リフレクション
r.RayTracing.Reflections.MaxBounces = 1 r.RayTracing.Reflections.MaxBounces = 4
リフレクション
All Roughness = 0.2
r.RayTracing.Reflections.SamplesPerPixel = 1
r.RayTracing.Reflections.SamplesPerPixel = 4 r.RayTracing.Reflections.SamplesPerPixel = 16
リアルタイムレイトレで使える技術:
シャドウ
シャドウ
• 動的シャドウ(シャドウマップ)の代替
デフォルトON
OFFにするとシャドウマップに切り替わる
• ライトごとに設定が可能
CastRaytracedShadow
ONでレイトレシャドウ、OFFでシャドウマップ
• デバッグコマンド
r.RayTracing.Shadows
レイトレシャドウ全体のON/OFF
OFFにすると各ライトの設定を無視してすべてシャドウマップに
r.RayTracing.Shadows.EnableTwoSidedGeometry
シーンすべてのポリゴンを両面描画と考慮してレイトレシャドウを行う
シャドウ
• Static Lightには無効
Static Lightのシャドウは焼付のみ
• Stationary, Movable Lightの処理は同一になる
Movableと同様にライトごとの計算
Stationaryの場合はライトマップの計算が行われる
• Source Radiusの値によってソフトシャドウを実現可能
ポイントライト、スポットライトのみ
Source Radiusが 0 より大きな値になっているとレイトレ後にデノイズ処理が行われる
• メッシュ単位のCast Shadowは適用される
OFFにするとシーンとリフレクション映像のシャドウのどちらも消える
Shadow Two Sidedは効果がないので、メッシュ単位で両面描画設定はできない
シャドウ
Ray Tracing Shadow Shadow Map
シャドウ
Ray Tracing Shadow Shadow Map
Spot Light Source Radius = 30
リアルタイムレイトレで使える技術:
グローバルイルミネーション
グローバルイルミネーション
• 動的グローバルイルミネーション
デフォルトOFF
ライトマップと併用される
レイトレGIのみにしたい場合はライトをMovableにするなどで対応
• デバッグコマンド
PostProcessVolume.RayTracingGlobalIllumination.Enable
レイトレGIのON/OFF
r.RayTracing.GlobalIlluminationが-1(デフォルト)の場合
r.RayTracing.GlobalIllumination.Desoiser
レイトレGI用のデノイザーのON/OFF
• 静的なシーンであれば使わない方が無難
他の技術より処理が重め、品質をあげようとすると更に重い
運用するなら解像度を下げるのが効果的
グローバルイルミネーション
Light Map Only Light Map + Ray Tracing GIRay Tracing GI Only
グローバルイルミネーション
SamplesPerPixel = 1 SamplesPerPixel = 16SamplesPerPixel = 4
グローバルイルミネーション
SamplesPerPixel = 1
ScreenPercentage = 50
SamplesPerPixel = 16
ScreenPercentage = 50
SamplesPerPixel = 16
ScreenPercentage = 100
リアルタイムレイトレで使える技術:
スカイライト、矩形ライト
スカイライト
• 遮蔽情報を参照可能なスカイライト
デフォルトOFF
動的なライティング計算の代替
通常のMovable Lightと違い、遮蔽情報を扱うことができる
• ON/OFFはライト単位で行う
Cast Raytraced ShadowをONにすると有効化
• Mobility設定に関わらずON/OFFができる
Stationary, Staticの場合でもONにすることが出来る
ライトマップも有効化されるので注意
• レイトレ後、デノイズ処理が行われる
サンプル数が少ないと厳しい印象
スカイライト
Stationary Sky Light + Baked Light Map Ray Tracing Sky LightMovable Sky Light
スカイライト
SamplesPerPixel = 1 SamplesPerPixel = 16SamplesPerPixel = 4
r.RayTracing.SkyLight.Denoiser = 1
矩形ライト
• 矩形ライトはON/OFFによって計算手法に変化がある
デフォルトOFF
OFF時はラスタライザと同じ直接光計算+レイトレシャドウ
レイトレシャドウは他のライトのシャドウと同様に設定可能
ON時はレイトレのみでライト計算
遮蔽もライト計算の中で行われる
デノイズされていないため、サンプリング数に依存しやすい
• ライト単位ではON/OFFできない
現状はシーン全体のみ
• デバッグコマンド
r.RayTracing.StochasticRectLight
矩形ライトのON/OFF
r.RayTracing.StochasticRectLight.IsTextureImportanceSampling
Source Textureが指定されている場合に重要度サンプリングを行うかどうか
矩形ライト
r.RayTracing.StochasticRectLight = 1 r.RayTracing.StochasticRectLight = 0
矩形ライト
SamplesPerPixel = 1 r.RayTracing. StochasticRectLight = 0SamplesPerPixel = 16
リアルタイムレイトレで使える技術:
半透明
半透明
• 描画順序を意識する必要のないレイトレ半透明
デフォルトOFF
• アクター設定
PostProcessVolume.RayTracingTranslucency.MaxRefractionRays
透過レイのトレース回数
この回数以上に半透明が重なっていると途中で打ち切り
• デバッグコマンド
r.RayTracing.Translucency
レイトレ半透明のON/OFF
PostProcessVolumeにはON/OFF機能はない
• 半透明はとても制約が多い
レイトレになっても半透明は立ちふさがる壁だった…
時
空
を
超
え
て
あ
な
た
は
一
体
何
度
ー
ー
我
々
の
前
に
立
ち
は
だ
か
っ
て
く
る
と
い
う
の
だ
!
半
透
明
!
半透明
Ray Tracing Translucency Rasterisation Translucency
半透明
MaxRefractionRays = 4 MaxRefractionRays = 16
半透明
• 屈折を使う場合、マテリアルのSpecularで調整
通常はSpecularがマスクされているので使えない
LightingModeをSurface FowardShadingかSurface TranslucencyVolumeに変更
• ただし現在の屈折は計算がおかしいように見える
半透明物質からレイが出ていく場合に空気のIORを考慮していないっぽい?
• 結果↓
Specular=0.5でガラスの設定だが、ガラスっぽくない…
リアルタイムレイトレで使える技術:
パストレーサー
パストレーサー
• リアルタイムレイトレとは別にリファレンス用として実装されている
View Mode→Path Tracingで有効化
• ラスタライザを使わず、レイトレのみでレンダリング
その分重いので、インタラクティブに使用するのは難しい
• デバッグコマンド
ShowFlag.PathTracing
パストレーサーのON/OFF
0:完全OFF
1:完全ON
2:エディタの設定に依存
r.PathTracing.RandomSequence
レイトレース時の乱数生成手法
• 現状ではリファレンスにするのは厳しい印象
パストレーサー
Real Time Ray Tracing Path Tracing
リアルタイムレイトレの制約
リアルタイムレイトレの制約
• レイトレならレイを飛ばすだけですべての問題が解決する!
そんなふうに思っていた時代が私にもありました…
• 現実は厳しい!
リアルタイムレイトレには制約がいっぱい!
今後解決されるであろう制約もある
そもそもパストレーサーにも制約がある
• 各機能ごとに別々にレイトレするため、機能によって対応していないものがある
対応しようと思えば出来る?
速度面では不安が…
リアルタイムと言いづらくなりそう
• 制約というわけじゃないけど不具合もある
不具合を見つけたらバグ報告しましょう!
報告されない不具合はスルーされる可能性高いです
エンジニアの方は修正できそうなら修正してプルリク!
リアルタイムレイトレの制約
説明する制約
• リフレクションの半透明
• Niagaraスプライト
• Maskedマテリアル
• 半透明マテリアルのシャドウ
• レイトレ半透明ごしのリフレクション
• GIとリフレクション
• スカイライトとリフレクション
• 矩形ライトとリフレクション
• マテリアルの使える機能/使えない機能
• AlembicのGeometry Cache
制約:リフレクションの半透明
• リフレクション側には半透明マテリアルが表示されない
現状ではどんな設定にしても無理
Preview4までは不透明で描画されていた
不透明 半透明加算合成
制約:リフレクションの半透明
• 半透明設定が無理でもDither半透明ならいけるのでは!?
残念!
制約:リフレクションの半透明
• 粒子系のNiagaraパーティクルなら不透明マテリアルで対応してもいいかも
GDC 2019で発表された『TROLL』デモがどうしてるかは不明
https://www.youtube.com/watch?v=Qjt_MqEOcGM
• ただし、後述する問題は残る
制約:Niagaraスプライト
• スプライトとは?
ゲームではエフェクトで主に用いられる
常にカメラ方向を正面にする板にテクスチャを貼り付けただけのもの
元々は2Dゲームでパタパタアニメするキャラ1つを指す
カメラ方向に向く処理をビルボード処理とも呼ぶ
制約:Niagaraスプライト
• レンダリングカメラ方向を向くスプライトたち
結果がこれ
レンダリングカメラ方向を向いている
制約:Niagaraスプライト
• レイトレ用のシーンジオメトリがこちら
• この形状としてシーンに登録されているため、シャドウにも影響が出る
グレーマンの後方にあるカメラを
向いた板としてシーンに登録され
ている
制約:Maskedマテリアル
• アンビエントオクルージョンはMaskedマテリアルを考慮しない
SSAOはMaskedマテリアルに対応している
Ray Tracing AO Screen Space AO
制約:半透明マテアリルのシャドウ
• 不透明扱いのシャドウ
透過したようなシャドウ、色付きのシャドウは対応していない
はっきりくっきりしたシャドウが出てしまうので違和感が大きい
Cast ShadowをOFFにしたほうが無難
• Niagaraパーティクルの場合、リフレクションと同じ問題が発生
カメラとライトの向きによって影が細くなったりする
シャドウOFF推奨だが、Cast Shadowが動作しない
なんでや!
制約:レイトレ半透明ごしのリフレクション
• レイトレ半透明は半透明マテリアルにレイトレした結果を表示する
MaxRefractionRaysの数だけレイを飛ばす
打ち切られたらそこまでの結果を合算し、アルファ値を使って元画像に合成
• 打ち切られる前に不透明マテリアルに衝突すると?
不透明マテリアルからレイトレ
レイトレリフレクションのバウンス回数等は固定っぽい
• 結果!
制約:GIとリフレクション
• レイトレリフレクションはレイトレGIを考慮しない
カメラからの映像とリフレクション越しの映像で差異が出てしまう
• ライトマップはリフレクションに影響する
リフレクションとの差異はない
Stationary Light・ライトマップON Movable Light・レイトレGI ON
制約:スカイライトとリフレクション
• レイトレリフレクションはレイトレスカイライトを考慮しない
GIと全く同じ
ライトマップなら影響する
Stationary Light・レイトレスカイライトON Movable Light・レイトレスカイライトON
制約:矩形ライトとリフレクション
• レイトレ矩形ライトを使った場合、リフレクションに矩形ライトが映らない
• レイトレ矩形ライトを使わなければ映る
r.RayTracing.StochasticRectLight = 0 r.RayTracing.StochasticRectLight = 1
• 使えるライティングモデルは少ない
DefaultLit
Clear Coat
• DefaultLit扱いになるライティングモデル
Subsurface
Preintegrated Skin
Subsurface Profile
Two Sided Foliage
Hair
Cloth
Eye
• 何故か使えないライティングモデル
Unlit:リフレクションで無効化
制約:マテリアルの使える機能/使えない機能
• DXRはレイトレーシングを行う前にシーンを構築する必要がある
シーンの構築段階でシーン内のポリゴン座標は確定していなければならない
SkinCacheが有効でなければならない理由がこれ
スプライトのビルボード問題もここに起因する
• SkinCacheはスケルトンによるデフォーメーションとモーフターゲットに対応している
スケルトン・モーフターゲットの計算をCompute Shaderで行う
→結果をSkinCacheとして保存
→DXRのシーン構築に利用する
• SkinCacheはマテリアルの頂点シェーダには対応していない
World Position Offsetが使えない
風で揺れる木、頂点ディスプレースメント、テッセレーションはNG
• Customized UVは使用できる
SkinCacheとは無関係なので
制約:マテリアルの使える機能/使えない機能
• 結果
制約:マテリアルの使える機能/使えない機能
リフレクションに頂点アニメが
適用されていない
シャドウもアニメーションしない
レイトレ半透明ONの場合、半透明
マテリアルもアニメーションしない
半透明はリフレクションに映らない
• 頂点アニメーションの代わりにAlembicのGeometry Cacheを使えないか?
いける!
制約:AlembicのGeometry Cache
• Alembicが使える!これで勝つる!
だがしかし…!
制約:AlembicのGeometry Cache
Blenderで作った水シミュレーション再生 Houdiniで作ったFractureシミュレーションを配置
リアルタイムレイトレの速度
• 今回は簡単な計測しかしていません
みんなが使いそうかな?と思った機能を中心に計測しています
• 基本はFPSのチェックくらい
NVIDIA Nsight Graphicsを使用
• DXRのデバッグは現状ではNsightかPIXのみ
パフォーマンス計測ならNsightの方が個人的には便利
デバッグは複数キャプチャ出来るPIXの方がやりやすいかも?
• どちらを使うにしてもパッケージングが必要
エディタから直接は無理っぽい
リアルタイムレイトレの速度
• パッケージを作成したら[Select Target Process]ウィンドウで.exeを指定
-dx12を付けて起動することを忘れずに
• GPUキャプチャボタンが有効になっているはずなのでボタンを押してキャプチャ
複数キャプチャが可能
• あとはデバッグ!
DXRのデバッグ:PIX
起動はLaunchボタン
• メニューの[Connect]を押してプロセスへの接続を開始
-dx12を付けることと、[Automatically Connect]をNoにすること
• 起動したらNsightに戻る→現在のウィンドウで[OK]ボタンを押してConnectウィンドウに戻る
[Attach]タブに起動したプロセスがあるのでダブルクリックでAttach
• あとはキャプチャしてデバッグ!
DXRのデバッグ:Nsight
RT Ambient Occlusion
SSAO RTAO
SamplePerPixel = 1
RTAO
SamplePerPixel = 4
RT Reflection
SSR RTR
MaxBounces = 1
RTR
MaxBounces = 4
RTR
MaxBounces = 8
RT Reflection
RTR
MaxRayDistance = -1
RTR
MaxRayDistance = 100
RTR
MaxRayDistance = 10000
RT Global Illumination
RTGI OFF SamplePerPixel = 1
ScreenPercentage = 100
SamplePerPixel = 4
ScreenPercentage = 100
SamplePerPixel = 4
ScreenPercentage = 50
RT Global Illumination
SamplePerPixel = 4
ScreenPercentage = 50
MaxBouces = 1
SamplePerPixel = 4
ScreenPercentage = 50
MaxBouces = 4
SamplePerPixel = 4
ScreenPercentage = 50
MaxBouces = 8
RT Stochastic Rect Light
SamplePerPixel = 1 SamplePerPixel = 32 SamplePerPixel = 64
RT Sky Light
SamplePerPixel = 1 SamplePerPixel = 8
SamplePerPixel = 16 SamplePerPixel = 16
Denoiser OFF
RT Translucency
MaxRefractionRays = 1 MaxRefractionRays = 4
MaxRefractionRays = 8 MaxRefractionRays = 8
Refraction ON
• UE4ではマテリアル数に応じたHit Tableが生成される
DXRではShader Tableとも呼ばれる
マテリアルアセットが同一であればHit Group自体は同じものが使用されている
• Hit Tableとは、Hit Groupとそこに渡すパラメータ(テクスチャなど)から構成されている要素
のテーブル
レイが衝突した際にそのプリミティブの対応するHit Tableが参照される
• マテリアル数が同一であればマテリアルアセット数そのものはあまり関係なかった
マテリアルインスタンスを積極的に使っても速度差が出なかった
マスターマテリアルが相当数になってくると差が出るかもしれない
要計測
• マテリアルをまとめてHit Tableを減らせば高速化出来るのでは?
Hit Table数によるパフォーマンス
• こんなシーンで計測
球1つが1メッシュ1マテリアルの場合
球5x5が1メッシュ1マテリアルの場合
これを切り替えできるようにして計測
Hit Table数によるパフォーマンス
• 球1つが1メッシュ1マテリアルの場合
Hit Table数によるパフォーマンス
Hit Table数
DispatchRaysの速度
• 球5x5が1メッシュ1マテリアルの場合
Hit Table数によるパフォーマンス
Hit Table数
DispatchRaysの速度
• 微妙な差ではあるが、安定した速度差が出ている
Hit Table数を減らした方が遅い
• なぜ?
詳細不明
イベントのプロファイルしようとしたら出来なかった
UE4の問題?要調査
• 推測
メッシュをまとめたことによりBVHの構成が変化
結果としてレイトレースが重くなっているのでは?
Hit Tableの参照やシェーダの実行自体はHit Table数とあまり関係がないかも
シェーダ自体の複雑度は実行速度に関係すると思われる
• テクスチャサンプリングを行っている場合はHit Tableが減ったほうが有利かも
https://shikihuiku.wordpress.com/2019/03/29/falcorのpathtraceサンプルをnsightgraphics
を使って最適化してみる/
Hit Table数によるパフォーマンス
まとめ
• リアルタイムレイトレーシングはいくつかの技術を代替する
主にスクリーンスペース系
基本のレンダリングはラスタライザ
• 従来技術では対応できない表現が可能になる
リフレクションが顕著な例
光源に大きさがある場合のシャドウも良い結果をもたらしている
• 制約はそれなりにある
パフォーマンスとトレードオフ出来るものもあるが、出来ないものもある
特に半透明関係とパーティクルはいろいろと問題がある
• 不具合はまだ多い
特にドライバのクラッシュは割と発生する
修正できたらプルリクエストを出しましょう!
まとめ
ご清聴、ありがとうございました

UE4のレイトレで出来ること/出来ないこと